react受控组件和非受控组件


一、受控组件

在 HTML 中,表单元素的标签

<input><textarea><select>等的值改变通常是根据用户输入进行更新。而在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新,以这种由 React 控制的输入表单元素而改变其值的方式,称为受控组件。

  • 比如,给表单元素 input 绑定一个 onChange 事件,当 input 状态发生变化时就会触发 onChange 事件,从而更新组件的 state。

下面就举一个 input 输入框的例子来进一步了解下:

import React, { Component, Fragment } from "react";

export default class Demohooks extends Component {
  state = {
    ChangeValue: "",
  };
  onChangeInput = (e) => {
    this.setState({
      ChangeValue: e.target.value,
    });
  };
  render() {
    return (
      <Fragment>
        <h1>受控组件</h1>
        用户名:
        <input value={this.state.ChangeValue} onChange={this.onChangeInput} />
      </Fragment>
    );
  }
}
  • 每当输入框的输入内容发生变化时,都会被写入到组件的 state 中,这种 组件在 React 中被理解为受控组件。

  • 受控组件的值,始终是由 React 的 state 驱动的。

  • 这种组件的数据是由 React 组件进行管理的,所以在大多数情况下,官方推荐使用受控组件。

接下来让我们去了解下受控组件更新 state 的简要流程:

ChangeValue 开始是空字符串’’,当键入 1,并 handleNameChange 获取 1 和调用 setState。然后,该输入被重新呈现为具有的值 1。
当键入 2,handleNameChange 获取 12 并设置该状态的值。现在再次重新渲染输入 value=”12”。
这也意味着表单组件可以立即响应输入更改;

可见效果:

当注释 this.setState({ChangeValue: e.target.value}); 这行代码,文本框再次输入时,页面不会重新渲染,所产生效果即是文本框输入不了值,即文本框值的改变受到 setState()方法的控制,在未执行时,不重新渲染组件。

二、非受控组件

在官网的简述为:要编写一个非受控组件,而不是为每个状态更新都编写数据处理函数,你可以使用 ref 来从 DOM 节点中获取表单数据。
因为非受控组件将真实数据储存在 DOM 节点中,所以在使用非受控组件时,有时候反而更容易同时集成 React 和非 React 代码。如果你不介意代码美观性,并且希望快速编写代码,使用非受控组件往往可以减少你的代码量。否则,你应该使用受控组件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>1_非受控组件</title>
</head>
<body>
    <!-- 准备好一个“容器” -->
    <div id="test"></div>

    <!-- 引入react核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">


        //创建组件
        class Login extends React.Component{
            handleSubmit = (event)=>{
                event.preventDefault() //阻止表单提交
                const {username,password} = this
                alert(`你输入的用户名是:${username.value},你输入的密码是:${password.value}`)
            }
            render(){
                return(
                    <form onSubmit={this.handleSubmit}>
                        用户名:<input ref={c => this.username = c} type="text" name="username"/>
                        密码:<input ref={c => this.password = c} type="password" name="password"/>
                        <button>登录</button>
                    </form>
                )
            }
        }
        //渲染组件
        ReactDOM.render(<Login/>,document.getElementById('test'))
    </script>
</body>
</html>
  • 输入框输入的值,存储在了 DOM 节点中

  • 然后通过 ref 来获取该 DOM 节点取值

  • 现用现取

总结

非受控组件: 页面中所有输入类的 DOM 如果是现用现取的称为非受控组件,

受控组件:通过 setState 将输入的值维护到了 state 中,需要时再从 state 中取出,这里的数据就受到了 state 的控制,称为受控组件。


文章作者: BiLiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BiLiang !
评论
  目录