zoukankan      html  css  js  c++  java
  • react第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)

    第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)

    #课程目标

    1. 理解因为react的单向数据流
    2. 理解表单组件会因为react数据流变的不好维护
    3. 理解受控组件与非受控组件的实质区别
    4. 理解受控组件在实际项目中的运用场景
    5. 利用受控组件完成一个表单控件的封装

    #知识点

    1. react单向数据流
    • 数据主要从父节点传递到子节点(通过props)如果顶层(父级)的某个props改变了,React会重渲染所有的子节点。
    • props => 不可以使用this.props直接修改props,因为props是只读的,props是用于整个组件树中传递数据和配置。
    • state => 每个组件都有属于自己的state,state和props的区别在于前者(state)只存在于组件内部,只能从当前组件调用this.setState修改state值(不可以直接修改this.state!)。
    1. 表单元素
    • 表单元素有其特殊之处,用户可以通过键盘输入与鼠标选择,改变界面的显示。界面的改变也意味着有一些数据被改动,比较明显的是input的value,textarea的innerHTML,radio/checkbox的checked。
    1. 非受控组件

      3-1. 如果一个表单组件没有value props(单选按钮和复选按钮对应的是 checked props)时,就可以称为非受控组件;

      3-2.使用defaultValue和defaultChecked来表示组件的默认状态;

      3-3.通过 defaultValue和defaultChecked来设置组件的默认值,它仅会被渲染一次,在后续的渲染时并不起作用

    import React, { Component } from 'react';
    
    class UnControlledInput extends Component {
        handleSubmit = (e) => {
            console.log(e);
            e.preventDefault();
            console.log(this.name.value);
        }
        render() {
            return (
                <form onSubmit={this.handleSubmit}>
                    <input type="text" ref={i => this.name = i} defaultValue="BeiJing" />
                    <button type="submit">Submit</button>
                </form>
            );
        }
    }
    
    export default UnControlledInput;
    
     
    1. 受控组件
    • 从React的思路来讲,肯定是想让数据控制一切,或者简单的理解为,页面的生成与更新得忠实地执行JSX的指令,如果说:
    <input value={this.state.value} />
    
    1
    • 当input.value是由组件的state.value拍出来的,当用户进行输入修改后,然后JSX再次重刷视图,这时input.value是采取用户的新值还是state的新值?基于这个分歧,React给出一个折衷的方案,两者都支持,于是就产生了今天的受控组件了。
    • React认为value/checked不能单独存在,需要与onInput/onChange/disabed/readOnly等控制value/checked的属性或事件一起使用。 它们共同构成受控组件,受控是受JSX的控制。如果用户没有写这些额外的属性与事件,那么框架内部会给它添加一些事件,如onClick, onInput, onChange,阻止你进行输入或选择,让你无法修改它的值。
      /*
      受控组件
      1. React是一个单向数据流
      2. 但可以自定义双向数据流组件(受控组件)
      */
      /*
      功能: 自定义组件, 功能如下
        1. 界面如页面所示
        2. 初始数据显示为renyl
        3. 输入数据时, 下面的数据同步变化
      */
      class ControlInput extends React.Component{
          constructor(props){
              super(props);
              this.state = {
                  msg:'renyl'
              }
              this.handleChange = this.handleChange.bind(this);
          }
          // 通过事件的形式控制存储状态
          handleChange(event){
              debugger;
              console.log(event.target.value);
              this.setState({
                msg:event.target.value
              });
          }
          render () {
              let {msg} = this.state;
              return (
                    <div>
                      <input onChange={this.handleChange} type="text" value={msg}/>
                      <p>{msg}</p>
                    </div>
              )
          }
      }
      ReactDOM.render(<ControlInput />,document.getElementById("example"));
    
    
     
    1. 受控组件的总结

      5-1.可以通过初始state中设置表单的默认值;

      5-2.每当表单的值发生变化时,调用onChange事件处理器;

      5-3.事件处理器通过合成事件对象e拿到改变后的状态,并更新应用的state.

      5-4.setState触发视图的重新渲染,完成表单组件值得更新

    #授课思路

    #案例和作业

    1. 高度还原页面
    2. 利用受控组件实现整体业务

  • 相关阅读:
    开发servlet三种方式
    puppet 启动失败
    linux 内核 中链表list
    software level
    ubuntu 使用 root “sudo /bin/bash”
    linux 内存管理
    linux kernel "current" macro
    hello.hs haskell
    ubuntu samba
    微信小程序中使用 npm包管理 (保姆式教程)
  • 原文地址:https://www.cnblogs.com/yzy521/p/14131848.html
Copyright © 2011-2022 走看看