受控组件 — 像input将数据交给state 再从state中取出,而不是直接从input中获取 非受控组件 — ref

非受控组件

ref获取input的value,通过操作value完成逻辑操作

  1. export default class App extends Component {
  2. myusername = React.createRef()
  3. render() {
  4. return (
  5. <div>
  6. <h1>登录页</h1>
  7. <input type="text" ref={this.myusername} defaultValue="kerwin"/>
  8. <button onClick={()=>{
  9. console.log(this.myusername.current.value)
  10. }}>登录</button>
  11. <button onClick={()=>{
  12. this.myusername.current.value = ""
  13. }}>重置</button>
  14. {/* <Child myvalue={this.myusername.current.value}/> */}
  15. </div>
  16. )
  17. }
  18. }

表单组件案例-ref版非受控

有时候非受控组件比受控组件简单得多, 根据情况而使用, 在该案例中非受控更方便 案例 : 根据传入值设置input为不同type的ui组件

  1. //子组件 提供ui组件
  2. class Field extends Component{
  3. state = {
  4. value:""
  5. }
  6. //清空value
  7. clear(){
  8. this.setState({
  9. value:""
  10. })
  11. }
  12. //设置value
  13. setValue(value){
  14. this.setState({
  15. value:value
  16. })
  17. }
  18. render(){
  19. return <div style={{background:"yellow"}}>
  20. <label>{this.props.label}</label> //用户名|密码
  21. <input type={this.props.type} onChange={(evt)=>{
  22. this.setState({
  23. value:evt.target.value//输入时设置value
  24. })
  25. }} value={this.state.value}/>//回写input的value
  26. </div>
  27. }
  28. }
  29. //父组件
  30. export default class App extends Component {
  31. username = React.createRef()
  32. password = React.createRef()
  33. render() {
  34. return (
  35. <div>
  36. <h1>登录页面</h1>
  37. <Field label="用户名" type="text" ref={this.username}/>
  38. <Field label="密码" type="password" ref={this.password}/>
  39. <button onClick={()=>{
  40. //直接通过ref获取数据
  41. console.log(this.username.current.state.value,
  42. this.password.current.state.value
  43. )
  44. }}>登录</button>
  45. <button onClick={()=>{
  46. //直接通过ref修改数据
  47. this.username.current.clear()
  48. this.password.current.clear()
  49. }}>取消</button>
  50. </div>
  51. )
  52. }
  53. }

受控组件

image.png
image.png

各种表单组件1 - 不优化版

image.png

class App extends React.Component {
  state = {
    txt: '',
    content: '',
    city: 'bj',
    isChecked: false
  }

  handleChange = e => {
    this.setState({
      txt: e.target.value
    })
  }

  // 处理富文本框的变化
  handleContent = e => {
    this.setState({
      content: e.target.value
    })
  }

  // 处理下拉框的变化
  handleCity = e => {
    this.setState({
      city: e.target.value
    })
  }

  // 处理复选框的变化
  handleChecked = e => {
    this.setState({
      isChecked: e.target.checked
    })
  }

  render() {
    return (
      <div>
        {/* 文本框 */}
        <input type="text" value={this.state.txt} onChange={this.handleChange} />
        <br/>

        {/* 富文本框 */}
        <textarea value={this.state.content} onChange={this.handleContent}></textarea>
        <br/>

        {/* 下拉框 */}
        <select value={this.state.city} onChange={this.handleCity}>
          <option value="sh">上海</option>
          <option value="bj">北京</option>
          <option value="gz">广州</option>
        </select>
        <br/>

        {/* 复选框 */}
        <input type="checkbox" checked={this.state.isChecked} onChange={this.handleChecked} />
      </div>
    )
  }
}

各种表单组件2 - 优化版

image.png

class App extends React.Component {
  state = {
    txt: '',
    content: '',
    city: 'bj',
    isChecked: false
  }

  handleForm = e => {
    // 获取当前DOM对象
    const target = e.target

    // 根据类型获取值
    const value = target.type === 'checkbox'
      ? target.checked
      : target.value

    // 获取name
    const name = target.name

    this.setState({
      [name]: value
    })
  }

  render() {
    return (
      <div>
        {/* 文本框 */}
        <input type="text" name="txt" value={this.state.txt} onChange={this.handleForm} />
        <br/>

        {/* 富文本框 */}
        <textarea name="content" value={this.state.content} onChange={this.handleForm}></textarea>
        <br/>

        {/* 下拉框 */}
        <select name="city" value={this.state.city} onChange={this.handleForm}>
          <option value="sh">上海</option>
          <option value="bj">北京</option>
          <option value="gz">广州</option>
        </select>
        <br/>

        {/* 复选框 */}
        <input type="checkbox" name="isChecked" checked={this.state.isChecked} onChange={this.handleForm} />
      </div>
    )
  }
}