react的受控组件和非受控组件

/*
 * @Description: 受控和不受控制的表单字段都有其优点不必纠结用哪种
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-06-01 10:20:33
 * @LastEditors: lhl
 * @LastEditTime: 2020-06-02 10:24:53
*/ 
import React, { Component } from 'react'

// 受控组件和非受控组件的区别
export default class App extends Component {
  render() {
    return (
      <div>
        <p>hello react</p>
        <FormTest></FormTest>
        <NameTestNo></NameTestNo>
        <FileInput></FileInput>
      </div>
    )
  }
}

// 官方推荐多数情况下使用 受控组件 来处理表单数据
// 受控组件就是可以被 react 状态控制的组件 表单的输入框 下拉框 复选框 和 文本域接受一个 value 属性,可以使用它来实现受控组件默认值(比如受控组件DOM操作、双向数据绑定)
class FormTest extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: '我是受控value默认值' // 受控组件通过value给定 默认值
    };
  }
  handleChange = (event) => {
    // 如果必须保留原始合成事件,请使用event.persist() 打印前调用
    // event.persist()
    // console.log(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>
    );
  }
}

// 使用非受控组件  使用 ref 来从 DOM 节点中获取表单数据  下拉框 复选框 和 文本域接受一个 defaultChecked defaultValue属性,可以使用它来实现非受控组件默认值
class NameTestNo extends React.Component {
  constructor(props) {
    super(props);
    this.input = React.createRef(); // 创建ref
  }
  handleSubmit = (event) => {
    // event.persist()
    // console.log(event)
    alert('提交的名字: ' + this.input.current.value);
    event.preventDefault();
  }
  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          非受控组件名字(通过ref获取)
          <input type="text" ref={this.input}   defaultValue="我是非受控ref组件defaultValue默认值"/>
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

// 特别的在 React 中,<input type="file" /> 始终是一个非受控组件,因为它的值只能由用户设置,而不能通过代码控制
class FileInput extends React.Component {
  constructor(props) {
    super(props);
    this.fileInput = React.createRef();
  }
  handleSubmit = (event) => {
    // event.persist()
    // console.log(event)
    event.preventDefault();
    alert(
      `Selected file - ${this.fileInput.current.files[0].name}`
    );
  }
  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          上传文件:
          <input type="file" ref={this.fileInput} />
        </label>
        <br />
        <button type="submit">提交</button>
      </form>
    );
  }
}

 

posted @ 2020-06-02 10:27  鱼樱前端  阅读(366)  评论(0编辑  收藏  举报