我有一个计数器和一个console.log()来useEffect记录我状态中的每个变化,但是useEffect在挂载时被调用两次。我正在使用 React 18。这是我项目的CodeSandbox和以下代码:
import { useState, useEffect } from "react";
const Counter = () => {
const [count, setCount] = useState(5);
useEffect(() => {
console.log("rendered", count);
}, [count]);
return (
<div>
<h1> Counter </h1>
<div> {count} </div>
<button onClick={() => setCount(count + 1)}> click to increase </button>
</div>
);
};
export default Counter;
Run Code Online (Sandbox Code Playgroud) import { useContext, useEffect, useState } from 'react';
const Log = () => {
useEffect(() => {
console.log('Running ...')
},[])
return(<p>here</p>)
}
export default Log;
Run Code Online (Sandbox Code Playgroud)
每当此代码运行时,我都会 在浏览器控制台中收到两次正在运行...消息。
我认为它应该运行一次,因为我在 useEffect 中有一个空的第二个参数。
谁能解释一下为什么它运行两次?
我正在使用 React Context API,发现提供程序在每次值更改时都会渲染两次。
这是我所做的。
问题 ?
每次我点击按钮更改上下文值时,提供程序都会渲染两次,但效果仅执行一次。
因此 ref 总是递增两次,但效果每次只获取最后一个值(它会跳过一个值!)。
另外,在提供程序的第一次渲染时,它会记录两次相同的引用值,这对我来说非常奇怪。
谁能告诉我为什么我会出现这种行为?
这是代码:
提供者:
const MyContext = React.createContext(0);
function Provider({ children }) {
const state = React.useState("Yes");
const ref = React.useRef(0);
ref.current += 1;
console.log("Context provider ", ref.current);
React.useEffect(() => {
console.log("effect on provider, ref value = ", ref.current);
});
return <MyContext.Provider value={state}>{children}</MyContext.Provider>;
}
Run Code Online (Sandbox Code Playgroud)
两个孩子
function DirectChild({ children }) {
console.log("provider direct child");
return children;
}
function Consumer() {
console.log("consumer");
const …Run Code Online (Sandbox Code Playgroud)