📜  react js中受控组件和非受控组件之间的区别 - Javascript(1)

📅  最后修改于: 2023-12-03 15:19:43.327000             🧑  作者: Mango

React JS中受控组件和非受控组件之间的区别

在React中,组件可以使用“受控组件”或“非受控组件”的方式来处理数据。这两个概念之间存在重要的区别,下面我们将介绍它们之间的不同之处。

受控组件

受控组件是由React管理其状态的组件模式。当一个表单元素被定义为受控组件时,其值不能直接通过用户操作而改变。相反,其值由React的状态管理并响应用户操作。

class ControlledComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: ''
    };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({ value: event.target.value });
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

在上面的例子中,输入框的值由组件的状态控制,并在用户提交表单时进行处理。

非受控组件

非受控组件是由DOM处理并管理其状态的组件模式。当一个表单元素被定义为非受控组件时,其值在DOM中管理并可直接从DOM中读取。非受控组件的值并不由React的状态控制。

class UncontrolledComponent extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.textInput = React.createRef();
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.textInput.current.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" ref={this.textInput} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

在上面的例子中,输入框的值由DOM管理并可直接从DOM中读取。在提交表单时,从文本框取出文本内容。

区别

受控组件和非受控组件之间的主要区别是数据的存储方式。在受控组件中,数据存储在React的状态中,而在非受控组件中,数据存储在DOM中。

受控组件通常比非受控组件更灵活,因为状态可以控制并对其进行处理。另一方面,非受控组件可能更容易实现,尤其是对于简单表单元素而言。

在决定使用哪种组件时,您应该考虑到应用程序的具体情况和性能要求。

总结

受控组件和非受控组件是React中的两种不同的组件处理方式。受控组件是由React的状态控制的,而非受控组件是由DOM控制的。选择使用哪种组件取决于应用程序的需求和性能要求。