zoukankan      html  css  js  c++  java
  • react表单_受控组件与非受控组件

    一、受控组件

    在 react 中,表单元素通过组件的 state 属性来自己维护 state,并根据用户输入调用setState()来进行数据更新,使 react 的 state 成为“唯一数据源”,被 React 以这种方式控制取值的表单输入元素就叫做“受控组件”。

    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('提交的名字: ' + this.state.value);
        event.preventDefault();
      }
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              名字:
              <input type="text" value={this.state.value} onChange={this.handleChange} />
            </label>
            <input type="submit" value="提交" />
          </form>
        );
      }
    }

    在 React 中,数据是单向流动的。从示例中,我们能看出来表单的数据源于组件的 state,并 通过 props 传入,这也称为单向数据绑定。然后,我们又通过 onChange 事件处理器将新的表单数 据写回到组件的 state,完成了双向数据绑定。这也意味着我们可以在执行最后 一步 setState 前,对表单值进行清洗和校验。

    React 受控组件更新 state 的流程:
    (1)可以通过在初始 state 中设置表单的默认值。
    (2)每当表单的值发生变化时,调用 onChange 事件处理器。
    (3)事件处理器通过合成事件对象 e 拿到改变后的状态,并更新应用的 state。
    (4)setState 触发视图的重新渲染,完成表单组件值的更新。

    二、非受控组件

    如果一个表单组件没有 value props(单选按钮和复选框对应的是 checked prop) 时,就可以称为非受控组件。相应地,你可以使用 defaultValue 和 defaultChecked prop 来表示 组件的默认状态

    元素value属性change回调回调获取新值
    <input type="text" /> value="string" onChange event.target.value
    <input type="checkbox" /> checked={boolean} onChange event.target.checked
    <input type="radio" /> checked={boolean} onChange event.target.checked
    <textarea /> value="string" onChange event.target.value
    <select /> value="option value" onChange event.target.value
    class NameForm extends React.Component {
      constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(this);
        this.input = React.createRef();
      }
    
      handleSubmit(event) {
        alert('A name was submitted: ' + this.input.current.value);
        event.preventDefault();
      }
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name:
              <input type="text" defaultValue="Bob" ref={this.input} />
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }

    vi设计http://www.maiqicn.com 办公资源网站大全https://www.wode007.com

    三、受控组件与非受控组件对比

    受控组件和非受控组件各有优点,应该根据自己的具体需求选择受控还是非受控

    特征非受控受控
    一次性取值(比如提交表单时) √  
    提交时验证 √   √  
    实时表单验证 × √  
    有条件的禁用提交按钮 × √  
    强制输入格式 ×  
    一个数据有多个输入 ×   √  
    动态输入 ×   √  

  • 相关阅读:
    一个强迫症用户的锤子手机使用体验
    起点——2015年终总结
    用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库
    用“MEAN”技术栈开发web应用(二)express搭建服务端框架
    SpringBoot/Spring使用@Value进行属性绑定(尚硅谷)
    springboot/spring使用ConfigurationProperties注解读取自定义属性(尚硅谷)
    Spring Boot项目中@SpringBootTest测试的时候卡住,一直Resolving Maven dependencies...
    ASP.NET项目:请使用语言版本6或者更高版本
    安装CUDA坑:CUDA driver version is insufficient for CUDA runtime version
    Failed to load the native TensorFlow runtime. ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13714395.html
Copyright © 2011-2022 走看看