• react17 生命周期场景解释


     

    一、废除的生命周期
    官网文档指出使用这些生命周期的代码会在未来版本的react中更容易产生bug,尤其是对于异步渲染的版本
    由于未来采用异步渲染机制,所以即将在17版本中去掉的生命周期钩子函数
    componentWillMount
    componentWillRecieveProps
    componentWIllUpdate

    二、新增的生命周期
    static getDerivedStateFromProps(nextProps, prevState) {}
    用于替换componentWillReceiveProps,可以用来控制 props 更新 state 的过程;它返回一个对象表示新的 state;如果不需要更新,返回 null 即可
    在每次渲染之前都会调用,不管初始挂载还是后面的更新都会调用,这一点和componentWillReceiveProps不同(只有当父组件造成重新渲染时才调用
    简单的理解就说从props中获取state,这个生命周期的功能实际上就是将传入的props映射到state上面
    getDerivedStateFromProps是一个静态函数,也就是这个函数不能通过this访问到class的属性,也并不推荐直接访问属性。而是应该通过参数提供的nextProps以及prevState来进行判断,根据新传入的props来映射到state
    如果props传入的内容不需要影响到你的state,那么就需要返回一个null,这个返回值是必须的,所以尽量将其写到函数的末尾
    getSnapshotBeforeUpdate() {}
    在最近的更改被提交到DOM元素前,使得组件可以在更改之前获得当前值,此生命周期返回的任意值都会传给componentDidUpdate()。
    用于替换 componentWillUpdate,该函数会在update后 DOM 更新前被调用,用于读取最新的 DOM 数据,返回值将作为 componentDidUpdate 的第三个参数
    在最新的渲染数据提交给DOM前会立即调用,它让你在组件的数据可能要改变之前获取他们
    componendDidCatch(error, info)
    如果一个组件定义了componentDidCatch生命周期,则他将成为一个错误边界(错误边界会捕捉渲染期间、在生命周期方法中和在它们之下整棵树的构造函数中的错误,
    就像使用了try catch,不会将错误直接抛出了,保证应用的可用性)

    三、下面来看看实际应用场景分析:

    /*
     * @Descripttion: react17 生命周期测试
     * @version: 
     * @Author: lhl
     * @Date: 2021-03-04 14:51:12
     * @LastEditors: lhl
     * @LastEditTime: 2021-03-26 18:46:49
     */
    import React, { Component } from 'react'
    import PropTypes from 'prop-types' // prop代表父组件传递过来的值,types代表类型 简单来说就是用来校验父组件传递过来值的类型
    
    
    // 类组件 
    /*
        1.挂载时顺序
        constructor() --> static getDerivedStateFromProps(props, state) --> render() --> componentDidMount()
    
        2.更新时顺序
        static getDerivedStateFromProps(props, state) --> shouldComponentUpdate() --> render() --> 
        static getSnapshotBeforeUpdate(prevProps, prevState) --> componentDidUpdate()
    
        3.卸载 (比如页面切换)
        componentWillUnmount()
    
        在 Fiber 机制下,render 阶段是允许暂停、终止和重启的。废弃的生命周期钩子函数,它们都处于render阶段,都可能被重复执行
        在 componentWillReceiveProps 和 componentWillUpdate 里滥用 setState 导致重复渲染死循环的
        forceUpdate(callback) - 组件强制更新,会跳过shouldComponentUpdate
    */
    export default class LifeCycle extends Component {
        // constructor()用来做一些组件的初始化工作,如定义this.state的初始内容 为事件处理函数绑定实例
        constructor(props){
            // super(props)用来调用基类的构造方法( constructor() ), 也将父组件的props注入给子组件,供子组件读取(组件中props只读不可变,state可变)
            super(props)
            this.state = {
                count: 0
            }
            console.log('constructor')
        }
        // static propTypes = {
        //     prop: PropTypes // react里的defaultProps来设置默认的props值
        // }
    
        static getDerivedStateFromProps(props, state){
            console.log(props, state,'getDerivedStateFromProps')
            return true
        }
    
        componentDidMount(){
            console.log('componentDidMount')
        }
    
        // 根据更新后的state或props判断是否重新渲染DOM,返回值为布尔值,常用来性能优化
        /**
         * 判断是否需要更新视图,执行后面的render方法
         * 1. 如果返回 false ,则不需要执行后面的render方法,视图也不会改变
         * 2. 返回true, 需要执行render方法,视图也会对应的改变
         */
        // 下一个和当前状态对比 nextState === this.state.xxx 没有变化就 return false 否则 true
        shouldComponentUpdate(nextProps, nextState){
            console.log(nextProps, nextState, 'shouldComponentUpdate')
            return true
        }
        
        // 该函数会在update后 DOM 更新前被调用,用于读取最新的 DOM 数据,返回值将作为 componentDidUpdate 的第三个参数
        getSnapshotBeforeUpdate(prevProps, prevState){
            console.log(prevProps, prevState,'getSnapshotBeforeUpdate')
            return true
        }
    
        // state或props更新后调用
        componentDidUpdate(props, state, snapshot){
            console.log(props, state, snapshot,'componentDidUpdate')
        }
    
        // 组件销毁或卸载时调用
        componentWillUnmount(){
            console.log('componentWillUnmount')
        }
    
        // 错误处理
        // 后代组件跑出错误时调用,并返回一个值以更新state
        static getDerivedStateFromError(callback){
            console.log(callback)
        }
        
        // 后代组件抛出错误后调用,参数info包含有关组件错误的栈信息
        componentDidCatch(error, info){
            console.log(error, info)
        }
    
        handleChange = () => {
            this.setState({
                count: 12
            })
        }
    
        // 渲染React组件  PureComponet 和 shouldComponentUpdate 处理渲染性能优化问题
        // 初始化
        // setState()在任何情况下都会导致组件的重新渲染,即使state未发生变化
        // 只要父组件重新渲染了,那么子组件就会重新渲染
        render() {
            console.log('render')
            const { count } = this.state
            return (
                <div>
                    <h1>react 17 生命周期</h1>
                    <button onClick={this.handleChange}>更改状态{count}</button>
                </div>
            )
        }
    }
    
    LifeCycle.propTypes = {
        name: PropTypes.string
    };

    未经允许,请勿随意转载!!谢谢合作!!!

  • 相关阅读:
    IISManager 的启动
    基于hadoop集群的hive 安装(mysql,derby)
    Struts中央控制器
    在Spring中配置Hibernate事务
    java 实现多线程下载
    hello,博客园
    easyui datagrid中添加右键菜单事件
    C#项目打包
    easyui datagrid中单击添加菜单事件
    SQL多条件查询拼接in中条件方法
  • 原文地址:https://www.cnblogs.com/lhl66/p/14583735.html
Copyright © 2020-2023  润新知