• React的生命周期函数


    概述

    在React中,生命周期函数指的是组件在某一个时刻会自动执行的函数

    constructor

     在类或组件创建的时候被自动执行,我们可以说它是生命周期函数,但它并不是React所特有的,所有的Es6对象都有这个函数,所以并不能说它是React的生命周期函数

    初始

    当数据发生变化时,render函数会被自动执行,符合我们对React生命周期函数的定义,所以它是React的生命周期函数,但在初始阶段,并不会有任何的React生命周期函数被执行,但会执行constructor构造函数,进行组件数据的初始化、

    复制代码
    import React,{Component} from 'react';
    
    class Demo extends Component{
        constructor(props){
            console.log("初始化数据...");
            super(props);
            this.state = {};
        }
        render(){
            return (
                
    Hello World
    ); } } export default Demo
    复制代码

    挂载

    页面挂载阶段,UNSAFE_componentWillMount 页面即将render挂载在html前执行,以前叫做componentWillMount但React团队认为这些生命周期函数经常被误解和巧妙的滥用,会带来潜在的问题,所以为他们加上了UNSAFE_前缀,当然这里的不安全不是指安全性,而是表示使用这些周期函数在未来的React版本中更有可能出现错误。即将挂载的函数执行完毕,会进行渲染挂载render,之后会执行componentDidMount函数,我们可以把完成挂载后的逻辑写在这个函数上。记住,只有组件第一次渲染页面才会执行mount

     

    复制代码
    import React,{Component} from 'react';
    
    class Demo extends Component{
        constructor(props){
            console.log("初始化数据...");
            super(props);
            this.state = {};
        }
        UNSAFE_componentWillMount(){
            console.log('UNSAFE_componentWillMount');
        }
    
        render(){
            console.log('render');
            return (
                
    Hello World
    ); } componentDidMount(){ console.log('componentDidMount'); } } export default Demo
    复制代码

     更新

    数据更新阶段,state或props发生变化,页面会重新渲染。state会在更新前先执行shouldComponentUpdate生命周期函数,这个函数比较特殊,它需要有一个返回值,true或者false,控制页面是否需要重新重新渲染,如果仅仅是数据发生变化,我们可以返回false,那么之后的生命周期函数都不会执行,这样可以有效的提升我们组件更新的效率。返回true后,会执行UNSAFE_componentWillUpdate函数做更新前的准备,在执行render进行页面的重新渲染,渲染完毕后执行componentDidUpdate函数

    复制代码
    import React,{Component} from 'react';
    
    class Demo extends Component{
        constructor(props){
            console.log("初始化数据...");
            super(props);
            this.handleClickTest = this.handleClickTest.bind(this);
            this.state = {
                number:1
            };
        }
    
        handleClickTest(){
            const number = this.state.number + 1;
            this.setState({
                number
            });
        }
    
        UNSAFE_componentWillMount(){
            console.log('UNSAFE_componentWillMount');
        }
    
        render(){
            console.log('render');
            return (
                
    this.handleClickTest}>Hello World
    ); } componentDidMount(){ console.log('componentDidMount'); } //更新前执行 shouldComponentUpdate(){ console.log('shouldComponentUpdate'); return true; } UNSAFE_componentWillUpdate(){ console.log('componentWillUpdate'); } componentDidUpdate(){ console.log('componentDidUpdate') } } export default Demo
    复制代码

     componentWillReceiveProps生命周期函数,只有一个组件接收props或者说当一个组件是子组件接收props的时候,它才会被执行,所以我们需要定义一个子组件接收父组件传值

    复制代码
    import React,{Component,Fragment} from 'react';
    import Demo2 from './Demo2';
    class Demo extends Component{
        constructor(props){
            console.log("初始化数据...");
            super(props);
            this.handleClickTest = this.handleClickTest.bind(this);
            this.state = {
                number:1
            };
        }
    
        handleClickTest(){
            const number = this.state.number + 1;
            this.setState({
                number
            });
        }
    
        UNSAFE_componentWillMount(){
            console.log('UNSAFE_componentWillMount');
        }
    
        render(){
            console.log('render');
            return (
                
                    
    this.handleClickTest}>Hello World
    this.state.number}/>
    ); } componentDidMount(){ console.log('componentDidMount'); } //更新前执行 shouldComponentUpdate(){ console.log('shouldComponentUpdate'); return true; } UNSAFE_componentWillUpdate(){ console.log('componentWillUpdate'); } componentDidUpdate(){ console.log('componentDidUpdate') } //组件从页面中移除前自动执行 componentWillUnmount(){ } } export default Demo
    复制代码

     子组件Demo2

    复制代码
    import React,{Component} from 'react';
    
    class Demo2 extends Component{
        componentWillReceiveProps(){
            console.log('componentWillReceiveProps');
        }
    
        render(){
            const {number} = this.props;
            return (
    {number}
    ); } } export default Demo2;
    复制代码

    当子组件接收参数发生变化时,就会执行componentWillReceiveProps函数,然后执行shouldComponentUpdate函数,返回值为true时依次执行componentWillUpdate,render,componentDidUpdate

    移除

    当组件从页面移除时自动执行componentWillUnmount函数,我们先定义一个路由

    复制代码
    import React from 'react';
    import ReactDom from 'react-dom';
    import TodoList from './TodoList';
    import {BrowserRouter,Routes,Route} from 'react-router-dom';
    import ButtonTest from './ButtonTest';
    import NewButton from './NewButton';
    import Demo from './Demo';
    class Entry extends React.Component{
        render(){
            return (
                
                    
                        {/*{}/>}*/}
                        {}/>}
                        {}/>}
                        }/>
                    
                
            )
        }
    }
    
    ReactDom.render(,document.getElementById('root'));
    复制代码

     

    从button组件跳转到list组件,button从页面移除时可观察到自动执行了componentWillUnmount函数

    复制代码
    import React,{Component} from 'react';
    import { Button } from 'antd';
    import {Link} from 'react-router-dom';
    class NewButton extends Component{
        render(){
            return (
                
                    
                
            );
        }
        //组件从页面中移除前自动执行
        componentWillUnmount(){
            console.log('componentWillUnmount-----------');
        }
    }
    export default NewButton;
    复制代码
    复制代码
    import React,{Component} from 'react';
    import { List, Avatar } from 'antd';
    
    const data = [
        {
            title: 'Ant Design Title 1',
        },
        {
            title: 'Ant Design Title 2',
        },
        {
            title: 'Ant Design Title 3',
        },
        {
            title: 'Ant Design Title 4',
        },
    ];
    
    class ButtonTest extends Component{
    
        render(){
            return (
                <List
                    itemLayout="horizontal"
                    dataSource={data}
                    renderItem={item => (
                        
                            <List.Item.Meta
                                avatar={}
                                title={{item.title}}
                                description="Ant Design, a design language for background applications, is refined by Ant UED Team"
                            />
                        
                    )}
                />
            );
        }
    }
    
    export default ButtonTest;
    复制代码

    执行结果

     

  • 相关阅读:
    车载音频系统中的数据通信
    Java基础复习巩固(二)
    MYSQL-入门
    python进阶(25)协程
    位图原理及实现
    【1. MySQL锁机制】
    嵌入式linux--sysfs文件系统以及操作GPIO
    Day12--渲染二级和三级分类列表
    mysql详细笔记
    Pytest----什么是实时标准输出和捕获标准输出
  • 原文地址:https://www.cnblogs.com/dslx/p/16641929.html