非受控组件

组件类型表单数据处理方式
受控组件React组件处理
非受控DOM处理(使用ref)

受控组件:

class NameForm 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>
    );
  }
}

非受控组件(快速随性,减小代码量):

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

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

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

2.受控vs 非受控

使用场景非受控受控
一次性值的检查(如表单提交)yy
表单提交时校验yy
即时现场验证xy
有条件的禁用提交按钮xy
强制文本框格式化xy
一个数据的几个输入xy
动态inputxy

备注:如果表单在ui反馈方面很简单,使用不受控完全ok。

3.受控

每一个表单元素,独有一个不同的prop设置它的值。下面是表格汇总(含文本框、复选框、单选框、文本域、选择)

https://goshakkk.name/controlled-vs-uncontrolled-inputs-react/

4.非受控组件,设定默认值时用defaultValue。

<input
  defaultValue="Bob"
  type="text"
  ref={(input) => this.input = input} />

同样, 和 支持 defaultChecked, 和 支持 defaultValue.

5.文件输入

<input type="file" />是一个不受控组件,因为它的值不是以编程方式设置。

备注:创建ref节点以访问提交处理程序中的文件:

class FileInput extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
  }
  handleSubmit(event) {
    event.preventDefault();
    alert(
      `Selected file - ${this.fileInput.files[0].name}`
    );
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Upload file:
          <input
            type="file"
            ref={input => {
              this.fileInput = input;
            }}

          />

        </label>
        <br />
        <button type="submit">Submit</button>
      </form>
    );
  }
}

ReactDOM.render(
  <FileInput />,
  document.getElementById('root')
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值