zoukankan      html  css  js  c++  java
  • React 组件生命周期

    组件的生命周期可分成三个状态:

    • Mounting:已插入真实 DOM
    • Updating:正在被重新渲染
    • Unmounting:已移出真实 DOM

    生命周期的方法有:

    • componentWillMount 在渲染前调用,在客户端也在服务端。

    • componentDidMount : 在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。 如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异部操作阻塞UI)。

    • componentWillReceiveProps 在组件接收到一个新的 prop (更新后)时被调用。这个方法在初始化render时不会被调用。

    • shouldComponentUpdate 返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。 
      可以在你确认不需要更新组件时使用。

    • componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。

    • componentDidUpdate 在组件完成更新后立即调用。在初始化时不会被调用。

    • componentWillUnmount在组件从 DOM 中移除的时候立刻被调用。

    这些方法的详细说明,可以参考官方文档

    以下实例在 Hello 组件加载以后,通过 componentDidMount 方法设置一个定时器,每隔100毫秒重新设置组件的透明度,并重新渲染:

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>生命周期</title>
        <script src="https://cdn.bootcss.com/react/15.4.2/react.min.js"></script>
        <script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>
        <script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>
      </head>
      <body>
        <div id="example"></div>
        <script type="text/babel">
          // 创建 Hello 组件
          var Hello = React.createClass({
            // 定义初始状态
            getInitialState: function() {
              return {
                opacity: 1.0
              }
            },
            // 生命周期--组件渲染完成
            componentDidMount: function() {
              // 定时器
              this.timer = setInterval(function(){
                var opacity = this.state.opacity;
                opacity -= .05;
                if(opacity < 0.1){
                  opacity = 1.0;
                }
                this.setState({
                  opacity: opacity
                });
              }.bind(this),100); // bind(this) 防止this指针偏转
            },
            // 渲染
            render: function() {
              return (
                <div style={{opacity: this.state.opacity}}>
                  Hello {this.props.name}
                </div>
              );
            }
          });
    
          // 创建虚拟DOM
          ReactDOM.render(
            <Hello name="world" />,
            document.body
          );
        </script>
      </body>
    </html>

    以下实例初始化 state , setNewnumber 用于更新 state。所有生命周期在 Content 组件中。

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>生命周期</title>
        <script src="https://cdn.bootcss.com/react/15.4.2/react.min.js"></script>
        <script src="https://cdn.bootcss.com/react/15.4.2/react-dom.min.js"></script>
        <script src="https://cdn.bootcss.com/babel-standalone/6.22.1/babel.min.js"></script>
      </head>
      <body>
        <div id="example"></div>
        <script type="text/babel">
          // 创建 Content 组件
          var Content = React.createClass({
            // 生命周期--组件将要挂载
            componentWillMount: function() {
              console.log('组件将要挂载');
            },
            // 生命周期--组件渲染完成
            componentDidMount: function(){
              console.log('组件渲染完成');
            },
            // 生命周期--组件将要接收父组件传值
            componentWillReceiveProps: function(newProps) {
              console.log('组件将要接收 props');
            },
            // 生命周期--组件将会更新
            shouldComponentUpdate: function(newProps, newState){
              return true;
            },
            // 生命周期--组件将要更新
            componentWillUpdate: function(nextProps, nextState) {
              console.log('组件将要更新');
            },
            // 生命周期--组件更新完毕
            componentDidUpdate: function(prevProps, prevState) {
              console.log('组件更新完毕');
            },
            // 生命周期--组件将要销毁
            componentWillUnmount: function() {
              console.log('组件将要销毁');
            },
    
            // 渲染
            render: function() {
              return (
                <div>
                  <h3>{this.props.myNumber}</h3>
                </div>
              );
            }
          });
    
          // 创建 Button 组件
          var Button = React.createClass({
            // 定义初始状态
            getInitialState: function() {
              return {
                data: 0
              }
            },
            // 按钮点击事件
            setNewNumber: function() {
              // 设置状态
              this.setState({ data: this.state.data + 1 })
            },
            // 渲染
            render: function() {
              return (
                <div>
                  <button onClick={this.setNewNumber}>增加</button>
                  <Content myNumber={this.state.data}></Content>
                </div>
              );
            }
          });
    
          // 创建虚拟DOM
          ReactDOM.render(
            <div>
              <Button />
            </div>,
            document.getElementById('example')
          );
        </script>
      </body>
    </html>
    

    效果图:

    .

  • 相关阅读:
    指针类型强制转换
    Spark大师之路:广播变量(Broadcast)源代码分析
    [Python]sqlite3二进制文件存储问题(BLOB)(You must not use 8-bit bytestrings unless you use a text_factory...)
    把字符串转化成整型显示
    一张图让你看清Java集合类(Java集合类的总结)
    Java读书笔记三(字符串)
    Afinal载入网络图片及下载文件用法
    netfilter/iptables 结构要点
    OpenGL 实现Interpolation插值算法
    GPU 编程入门到精通(五)之 GPU 程序优化进阶
  • 原文地址:https://www.cnblogs.com/crazycode2/p/8449927.html
Copyright © 2011-2022 走看看