【问题标题】:React component doesn't re-render after the state was updated状态更新后 React 组件不会重新渲染
【发布时间】:2021-05-19 00:13:05
【问题描述】:

我遇到了 React 类组件的问题。该组件是一个表单,它存储用户的输入,并在单击按钮时将收集到的信息提交给主组件。将状态向上推后,当我尝试更新组件的状态以具有默认输入值(submitForm 中的 this.setState(this.baseState))时,就会出现此问题。 我正在使用 react chrome 扩展,可以看到状态已更新,因为无法看到它在页面上呈现。 img1:before calling submitForm img2:after calling submitForm, state is updated but can't see changes on the page

非常感谢您对此的看法!

class AttendeeForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      firstName: '',
      lastName: '',
      email: '',
      shirt: 'XS', // default
      skillLevel: 'beginner', // default
    };
    this.handleChange = this.handleChange.bind(this);
    this.submitForm = this.submitForm.bind(this);
  }

  handleChange(event) {
    this.setState({
      [event.target.id]: event.target.value,
    });
  }

  submitForm() {
    this.props.addAttendee(this.state);
    this.setState({
      firstName: '',
      lastName: '',
      email: '',
      shirt: 'XS', // default
      skillLevel: 'beginner', // default
    })
  }

  render() {
    return (
      <div className="attendee-form">
        <h2>Register Attendee</h2>
        <label>First Name: </label>
        <input type="text" id="firstName" onChange={this.handleChange}></input>
        <label>Last Name: </label>
        <input type="text" id="lastName" onChange={this.handleChange}></input>
        <label>Email: </label>
        <input type="email" id="email" onChange={this.handleChange}></input>
        <label>Shirt Size:</label>
        <select onChange={this.handleChange} id="shirt" >
          <option value="XS">XS</option>
          <option value="S">S</option>
          <option value="M">M</option>
          <option value="L">L</option>
          <option value="XL">XL</option>
          <option value="XXL">XXL</option>
        </select>
        <label>Skill Level:</label>
        <select onChange={this.handleChange} id="skillLevel" >
          <option value="beginner">beginner</option>
          <option value="intermediate">intermediate</option>
          <option value="expert">expert</option>
        </select>
        <button onClick={this.submitForm}>REGISTER</button>
      </div>
    );
  }
}

【问题讨论】:

  • 只需为所有输入字段赋值,提交时清除

标签: reactjs forms state rerender


【解决方案1】:

为所有输入字段赋予默认值

<input type="text" id="lastName" value={this.state.lastName} onChange={this.handleChange}></input>

【讨论】:

    【解决方案2】:

    解决方案:

    每个字段都需要来自状态的当前值, 例如 firstName 和 lastName 来自该州

    class AttendeeForm extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          firstName: '',
          lastName: '',
          email: '',
          shirt: 'XS', // default
          skillLevel: 'beginner', // default
        };
        this.handleChange = this.handleChange.bind(this);
        this.submitForm = this.submitForm.bind(this);
      }
    
      handleChange(event) {
        this.setState({
          [event.target.id]: event.target.value,
        });
      }
    
      submitForm() {
        this.setState({
          firstName: '',
          lastName: '',
          email: '',
          shirt: 'XS', // default
          skillLevel: 'beginner', // default
        })
      }
    
      render() {
        return (
          <div className="attendee-form">
            <h2>Register Attendee</h2>
            <label>First Name: </label>
            <input type="text" id="firstName" onChange={this.handleChange} value={this.state.firstName}></input>
            <label>Last Name: </label>
            <input type="text" id="lastName" onChange={this.handleChange} value={this.state.lastName}></input>
            <label>Email: </label>
            <input type="email" id="email" onChange={this.handleChange}></input>
            <label>Shirt Size:</label>
            <select onChange={this.handleChange} id="shirt" >
              <option value="XS">XS</option>
              <option value="S">S</option>
              <option value="M">M</option>
              <option value="L">L</option>
              <option value="XL">XL</option>
              <option value="XXL">XXL</option>
            </select>
            <label>Skill Level:</label>
            <select onChange={this.handleChange} id="skillLevel" >
              <option value="beginner">beginner</option>
              <option value="intermediate">intermediate</option>
              <option value="expert">expert</option>
            </select>
            <button onClick={this.submitForm}>REGISTER</button>
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <AttendeeForm  />,
      document.getElementById("root")
    );
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    
    <div id="root"></div>

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多