• react学习(三)之生命周期/refs/受控组件 篇


    挂载/卸载

    //在类组件中
    class Clock extends React.Component {
      constructor(props) {
        super(props);
        this.state = {date: new Date()};
      }
    
      componentDidMount() {  //挂载
        this.timerID = setInterval(
          () => this.tick(),
          1000
        );
      }
    
      componentWillUnmount() {  // 卸载
        clearInterval(this.timerID);
      }
    
      tick() {
        this.setState({
          date: new Date()
        });
      }
    
      render() {
        return (
          <div>
            <h1>Hello, world!</h1>
            <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
          </div>
        );
      }
    }

    refs

    当需要操作DOM节点时候,可以使用ref,但是,尽量避免至今操作DOM。使用refs场景有:

    • 处理focus、文本选择或者媒体播放
    • 触发强制动画
    • 集成第三方DOM库

    使用方法:

    ref 属性接受回调函数,并且当组件 装载(mounted) 或者 卸载(unmounted) 之后,回调函数会立即执行。

    class CustomTextInput extends React.Component {//ref只能在类组件中使用
      constructor(props) {
        super(props);
        this.focus = this.focus.bind(this);
      }
    
      focus() {
        // 通过使用原生API,显式地聚焦text输入框
        this.textInput.focus();  //使用这个DOM引用方式。
      }
    
      render() {
        // 在实例中通过使用`ref`回调函数来存储text输入框的DOM元素引用(例如:this.textInput)
        return (
          <div>
            <input
              type="text"
              ref={(input) => { this.textInput = input; }} /> //在挂载时候,执行该函数,该函数返回 input DOM引用。
            <input
              type="button"
              value="Focus the text input"
              onClick={this.focus}
            />
    
          </div>
        );
      }
    }

    受控组件与不受控组件

    受控组件,用在表单元素中,数据保存在组件的state中,并只能通过setstate()来更新。state成为‘单一数据源原则’

    不受控组件,不使用state,表单数据由DOM元素处理。可以使用ref来获得DOM引用。因为不受控组件的数据来源是 DOM 元素。例如:

    class NameForm extends React.Component {
      constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(this);
      }
    
      handleSubmit(event) {
        alert('A name was submitted: ' + this.input.value);
        event.preventDefault();
      }
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name:
              <input type="text" ref={(input) => this.input = input} />
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }
  • 相关阅读:
    ADO.NET访问Access2007的数据库 IErrorInfo.GetDescription failed with E_FAIL(0x80004005)
    Git工程实践
    来用java类模拟tensorflow工作流程
    Java异常处理之throw和声明throws·12
    Java异常之finally和多重捕获·11
    linux和windows如何查询自己本地出去的公网ip地址
    CentOS 6 EOL切换源
    P4782 【模板】2-SAT 问题
    P3834 【模板】可持久化线段树 2(主席树)
    P2671 [NOIP2015 普及组] 求和
  • 原文地址:https://www.cnblogs.com/yadiblogs/p/9214660.html
Copyright © 2020-2023  润新知