具有如此超简单的CRA应用程序:
/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')
);
/components/Home.tsx:
function Authorize () {
console.log("--> Authorize <--")
let myPromise = new Promise(function(myResolve, myReject) {
let x = 0;
if (x === 0)
myResolve("OK");
else
myReject("Error");
});
myPromise.then(
function(value) {console.log("--> Promise fulfilled <--")},
);
}
function Home() {
Authorize()
return (<div><b>Home Page</b></div>)
}
export default Home
当我通过npm start
启动应用程序时我得到:
--> Authorize <--
--> Promise fulfilled <--
--> Promise fulfilled <--
我的问题是为什么myPromise.then...
被称为TWICE(两行Promise fulfilled
(而--> Authorize <--
?只调用一次!
<React.StrictMode>
触发双重渲染,以便让我们发现是否有任何不安全的操作正在进行。这不会在生产构建中发生。
所以你可以在没有<React.StrictMode>
的情况下尝试,然后你会发现一条日志消息。
但有严格的模式是好的。您可以忽略双日志消息。
CodeSandbox链接试用
使用钩子模拟onMount,并仅在初始调用它,而不在重新渲染时调用它。在你的家里做:
useEffect(() => {
Authorize()
}, []);
return (<div><b>Home Page</b></div>)