当前位置: 首页 > 知识库问答 >
问题:

双console.log除了组件didMount在React

宓和同
2023-03-14

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

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之外的消息?谁来操纵控制台。componentDidMount的日志只打印一次。下面是组件的整个代码的编写方式:

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个答案

陈斌
2023-03-14

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

根据文件:

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

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

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

 类似资料:
  • 寻求澄清“此”在本上下文中的含义。为什么我需要在ajax请求之后将“this”绑定到回调?当我检查调试器时,不管我是否调用bind,它都会说'this'绑定到构造函数。

  • 我试图访问this.myref.current,但我不能做到这一点时,组件didMount被调用。有没有另一个函数我可以调用,当所有引用都链接时,它会起作用? 请注意,问题不仅仅是我不能访问.当前,更具体地说,我不能在组件安装期间访问它。我可以稍后在其他活动中访问它。

  • 问题内容: 它是在beta中,但不是在发布中? 问题答案: 对于后备甚至更好的是:

  • 我想删除double[]数组中的重复项。不幸的是,我不能使用ArrayList或其他任何东西,它必须是“普通”双数组。我试图使用类数组的binarySearch()方法,但找不到一个很好的解决方案,因为我不仅要搜索,还要删除重复项。那么,每次删除这样的副本时,我都必须缩短长度。 这个问题有什么解决办法吗?

  • 我对以下组件的输出感到非常困惑: 它至少在Chrome和Firefox中产生以下输出: 转载:https://codesandbox.io/s/leagle-frost-dmcsl 编辑:我知道严格模式会导致额外的呈现,但如前所述,我会期待相同的消息计数。

  • 问题内容: 我正在使用postgreSQL9.1,并且想使用此提示从表中删除重复项: 另一种可能的方式是 我在ORDER BY (SELECT 0)上面使用,因为在打平的情况下保留哪一行是任意的。 为了保留最新的RowID顺序,例如,您可以使用ORDER BY RowID DESC 执行计划 执行计划通常比接受的答案更简单,更有效,因为它不需要自我连接。 执行计划 但是,情况并非总是如此。一种GR