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

React严格模式和双重渲染

柯易安
2023-03-14

拥有如此简单的CRAReactapp:

./index.tsx:

import React from 'react';
import ReactDOM from 'react-dom';
import Home from './components/Home';

ReactDOM.render(
  <React.StrictMode>
     <Home></Home>
  </React.StrictMode>,
  document.getElementById('root')
);

./组件/主页。tsx:

function Home() {
    let myPromise = new Promise(function(myResolve, myReject) {
        
        let x = 0;
        console.log("--> inside a Promise obj <--");
        
        if (x === 0) {
            myResolve("OK");
        } else {
            myReject("Error");
        }
    }); 

    myPromise.then(
        function(value) {console.log("--> Promise fulfilled <--")},
    );

    return (
        <div>
            <b>Home Page</b>
        </div>
    )
}

export default Home

我得到:

--> inside a Promise obj <--
--> Promise fulfilled <--
--> Promise fulfilled <--

在控制台上。

为什么promise履行代码会被触发2次?我知道,对于React Strict模式,组件渲染了两次,但示例显示了一些不一致性---


共有1个答案

向安福
2023-03-14

根据医生的说法:-

从React 17开始,React自动修改控制台方法,如console。log()以在对生命周期函数的第二次调用中使日志静音。但是,在可以使用变通方法的某些情况下,它可能会导致不期望的行为。

作为临时解决方法,您只需执行let log=console即可。在顶层记录,然后它将始终记录。

从https://github.com/facebook/react/issues/20090得到这个变通方法

下面是一个代码沙盒,您可以在其中看到预期的输出:-

promise的然后回调中的日志可以工作,因为它是React生命周期方法之外的异步行为。React不会在严格模式下关闭这些日志。但是console.log(Promise obj内)是在组件的函数体执行过程中发生的Promise执行器函数内的同步任务。

 类似资料:
  • 除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法。 同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。一些在正常模式下可以运行的语句,在严格模式下将不能运行。 设计目的 早期的 JavaScript 语言有很多设计不合理的地方,但是为了兼容以前的代码,又不能改变老的语法,只能不

  • 概述 进入标志 如何调用 语法和行为改变 全局变量显式声明 静态绑定 增强的安全措施 禁止删除变量 显式报错 重名错误 禁止八进制表示法 arguments对象的限制 函数必须声明在顶层 保留字 参考链接 概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。 设立”严格模式“的

  • ECMAScript 5 最早引入了“严格模式”(strict mode)的概念。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。使用严格模式的好处是可以提早知道代码中存在的错误,及时捕获一些可能导致编程错误的ECMAScript 行为。 理解严格模式的规则非常重要,ECMAScript 的下一个版本将以严格模式为基础制定。支持严格模式的浏览器包括IE10+、Firefox

  • 主要内容:什么是严格模式,启用严格模式,严格模式中的变化由于 JavaScript 语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用 var 关键字来提前声明(例如: ),此时 JavaScript 解释器会自动为您创建这个变量。为了使代码更加严谨,JavaScript 中引入了严格模式,一旦使用了严格模式,将不再允许使用那些不严谨的语法。 什么是严格模式 严格模式是在 ECMAScript5(ES5)中引入的,在严格模式下,JavaS

  • 要启用严格模式,只需在创建 Vuex store 的时候简单地传入 strict: true。 const store = new Vuex.Store({ // ... strict: true }) 在严格模式下,只要 Vuex 状态在 mutation 方法外被修改就会抛出错误。这确保了所有状态修改都会明确的被调试工具跟踪。 开发阶段 vs. 发布阶段 不要在发布阶段开启严格模式! 严格

  • 本文向大家介绍React的严格模式有什么用处?相关面试题,主要包含被问及React的严格模式有什么用处?时的应答技巧和注意事项,需要的朋友参考一下 react的strictMode 是一个突出显示应用程序中潜在问题的工具,与Fragment一样,strictMode 不会渲染任何的可见UI,它为其后代元素触发额外的检查和警告。 注意:严格模式仅在开发模式下运行,它们不会影响生产构建 可以为程序的任