React之新旧生命周期对比

<!DOCTYPE html>

<html>

<head>

    <meat charset="UTF-8">

        <title>新旧react生命周期对比</title>

</head>

<body>

    <!-- 准备好一个容器 -->

    <div id="test"></div>

    <!-- 核心库 -->

    <script type="text/javascript" src="../js/react.development.js"></script>

    <!-- react-dom,操作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>

    <!-- 此处一定要写babel -->

    <script type="text/babel">

        //1.创建组件

        class Count extends React.Component{

            /*

                1.初始化阶段:由ReactDOM.render()触发---初次渲染

                    1.constructor()

                    2.componentWillMount()

                    3.render()

                    4.componentDidMount() =========>常用

                        做初始化的事,例如:开启定时器、发送网络请求、订阅消息

                2.更新阶段:由组件内部this.setState()或父组件render触发

                    1.shouldComponentUpdate()

                    2.componentWillUpdate()

                    3.render() ====》必须使用的一个

                    4.componentDidUpdate()

                3.卸载组件:由ReactDOM.unmountComponentAtNode()触发

                    1.componentWillUnmount()   ====>常用

                        收尾,例如:关闭定时器,取消订阅消息                

            */

          //构造器

          constructor(props){

              console.log('Count---constructor');

              super(props)

               //初始化状态

              this.state = { count: 0 }

          }

          //加1按钮的回调

          add = ()=>{

            //获取原状态

            const {count} =this.state

            //更新状态

            this.setState({count: count+1})

          }

          death = ()=>{

              ReactDOM.unmountComponentAtNode(document.getElementById('test'))

          }

          //强制更新按钮的问题

          force =()=>{

              this.forceUpdate()

          }

          force

          //组件将要挂载的钩子

          UNSAFE_componentWillMount(){

              console.log('Count---componentWillMount');

          }

          //组件挂载完毕的钩子

          componentDidMount(){

              console.log('Count---componentDidMount')

          }

          //组件将要卸载的钩子

          componentWillUnmount(){

              console.log('Count---componentWillUnmount')

          }

          //控制组件更新的‘阀门’

          shouldComponentUpdate(){

              console.log('Count---shouldComponentUpdate')

              return false;

          }

           //组件将要更新的钩子

            UNSAFE_componentWillUpdate() {

                console.log('Count---componentWillUpdate')

            }

              //组件更新完毕的钩子

            componentDidUpdate() {

                console.log('Count---componentDidUpdate')

            }

           render(){  

                console.log('Count---render')

                const {count}=this.state

               return(

                  <div>

                    <h2>当前求和为:{count}</h2>

                    <button onClick={this.add}>点我+1</button>  

                    <button onClick={this.death}>卸载组件</button>

                     <button onClick={this.force}>不更改任何状态中的数据,强制更新一下</button>

                  </div>        

               )          

           }

        }          

        //父组件A

        class A extends React.Component{

            //初始化状态

            state = {carName:'奔驰'}

            changeCar = ()=>{

                this.setState({carName:'奥拓'})

            }

            render() {

              return (

                  <div>

                    <div>我是A组件</div>

                    <button onClick={this.changeCar}>换车</button>

                    <B carName={this.state.carName}/>

                  </div>  

              )    

            }          

        }

       //子组件B

        class B extends React.Component {

            //组件将要接收新的props的钩子

            componentWillReceiveProps(props){

                console.log('B---componentWillReceiveProps',props)

            }

            //控制组件更新的‘阀门’

            shouldComponentUpdate() {

                console.log('B---shouldComponentUpdate')

                return true;//true才能往下走,看最后附上的图片,否则点击控制台一直是(数字+1)shouldComponentUpdate

            }

            //组件将要更新的钩子

            componentWillUpdate() {

                console.log('B---componentWillUpdate')

            }

            //组件更新完毕的钩子

            componentDidUpdate() {

                console.log('B---componentDidUpdate')

            }

            render() {

                 console.log('B---render')

                return (

                   <div>我是B组件,接收到的车是:{this.props.carName}</div>

                )

            }

        }

        //2.渲染组件到页面

        ReactDOM.render(<A/>, document.getElementById("test"));  

    </script>

</body>

</html>

==============

1.(上面代码是旧生命周期的)三个钩子需加上:UNSAFE_ name

 否则控制台警告:

举一个例子图片:

============

总结:

旧生命周期废掉三个钩子:

  • componentWillMount
  • componentWillReceiveProps
  • componentWillUpdate
  • =============
  • 新生命周期添加两个钩子:
  • getDerivedStateFromProps

  • getSnapshotBeforeUpdate

  • =============
  • 附上新旧生命周期图片:
  • 旧:
  • 新:
  •  

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值