除了 React 中的 componentDidMount 外,双 console.log

IT技术 reactjs
2021-05-02 23:15:21

我试图更好地了解 React 组件生命周期。我正在尝试将与 React 组件生命周期相关的消息打印到控制台。在下面显示的组件中,我使用了 3 次 console.log。但是,其中 2 个在控制台中打印了两次。我正在使用铬。这就是打印到控制台的内容。

Menu Component constructor is invoked
Menu Component constructor is invoked
Menu Componen render is invoked
Menu Componen render is invoked
Menu Component componentDidMount is invoked

除了 componentDidMount 之外,为什么要重复打印三个 console.log 消息中的两个?Whid 只打印一次 componentDidMount 的 console.log。以下是组件的整个代码:

import React, { Component } from 'react';
import { Card, CardImage, CardImgOverlay, CardText, CardBody, CardTitle, CardImg } from 'reactstrap';

class Menu extends Component {

    constructor(props) {
        super(props);

        this.state = {
            selectedDish: null
        }
        console.log('Menu Component constructor is invoked');
    }

    componentDidMount() {
        console.log('Menu Component componentDidMount is invoked');
    }

    onDishSelect(dish) {
        this.setState({ selectedDish: dish});
    }

    renderDish(dish) {
        if (dish != null) {
            return(
                <Card>
                    <CardImg width="100%" src={dish.image} alt={dish.name} />
                    <CardBody>
                        <CardTitle>{dish.name}</CardTitle>
                        <CardText>{dish.description}</CardText>
                    </CardBody>
                </Card>
            );
        } else {
            return(
                <div></div>
            );
        }
    }

    render() {

        const menu =  this.props.dishes.map((dish) => {
            return (
                <div key={dish.id} className="col-12 col-md-5 m-1">
                    <Card onClick={() => this.onDishSelect(dish)}>
                        <CardImg width="100%" src={dish.image} alt={dish.name} />
                        <CardImgOverlay>
                            <CardTitle>{dish.name}</CardTitle>
                        </CardImgOverlay>
                    </Card>
                </div>
            );
        });

        console.log('Menu Componen render is invoked');

        return (
            <div className="container">
                <div className="row">
                    {menu}
                </div>
                <div className="row">
                    {this.renderDish(this.state.selectedDish)}
                </div>
            </div>
        );
    }
}

export default Menu;
1个回答

随着 React.StrictMode 的引入,我假设您的 React 应用程序已经拥有它,React 提供了一种通过调用渲染阶段生命周期两次来检测意外副作用的方法。

根据文档

渲染阶段生命周期包括以下类组件方法:

- constructor
- componentWillMount (or UNSAFE_componentWillMount)
- componentWillReceiveProps (or UNSAFE_componentWillReceiveProps)
- componentWillUpdate (or UNSAFE_componentWillUpdate)
- getDerivedStateFromProps
- shouldComponentUpdate
- render
- setState updater functions (the first argument)

然而componentDidMount不是渲染阶段生命周期而是提交阶段生命周期,因此它只被调用一次。