react useEffect(): Hello 只记录一次
react useEffect(): Hello only logs one time
我想知道为什么 'Hello' 只记录一次,因为有 setCounter(1) 会触发重新渲染,对我来说 'Hello' 会记录两次。
也许与依赖数组有关?由于props.visible不传,useEffect()只会运行一次?
这是我的 CodeSandBox:https://codesandbox.io/s/peaceful-brattain-hw0mm?file=/src/App.js:23-287
感谢任何帮助。
import { useState, useEffect } from "react";
export default function App(props) {
const [counter, setCounter] = useState(0);
useEffect(() => {
console.log("Hello");
setCounter(1);
}, [props.visible]);
return <div className="App">{counter}</div>;
}
嗯,props.visible 不会改变,这就是为什么,如果您将计数器作为依赖项传递给 useEffect,那么您应该看到计数器每次更改时的输出。 (在你的情况下,再一次)
useEffect
中的函数在初始渲染时运行一次,然后在每次依赖数组中的值更改时运行。如果 props.visible
没有改变,即使组件由于状态改变而重新渲染,也不会触发 useEffect。
props.visible
来自父组件,因此在 useEffect
中添加了 depedecy 数组,如果 props.visible
发生变化,则 useEffect
再次调用。
如果您将 counter
添加为依赖项数组并更改 counter
值,那么将调用 useEffect
。
示例:
import { useState, useEffect } from "react";
export default function App(props) {
const [counter, setCounter] = useState(0);
useEffect(() => {
console.log("Hello");
}, [counter]);
return (
<div className="App">
{counter}
<button onClick={() => setCounter(counter + 1)} > Increment </button>
</div>;
)
}
您认为依赖项数组是问题的原因是正确的。
如果您在依赖项数组中提供值,则只有在提供的值发生更改时,React 才会重新呈现。您提供了 prop.visible
,它不会更新也不会导致重新渲染。
为了使此示例正确,您的代码需要如下所示:
export default function App(props) {
const [counter, setCounter] = useState(0);
useEffect(() => {
console.log("Hello");
setCounter(1);
}, [counter]);
return <div className="App">{counter}</div>;
}
我想知道为什么 'Hello' 只记录一次,因为有 setCounter(1) 会触发重新渲染,对我来说 'Hello' 会记录两次。 也许与依赖数组有关?由于props.visible不传,useEffect()只会运行一次?
这是我的 CodeSandBox:https://codesandbox.io/s/peaceful-brattain-hw0mm?file=/src/App.js:23-287
感谢任何帮助。
import { useState, useEffect } from "react";
export default function App(props) {
const [counter, setCounter] = useState(0);
useEffect(() => {
console.log("Hello");
setCounter(1);
}, [props.visible]);
return <div className="App">{counter}</div>;
}
嗯,props.visible 不会改变,这就是为什么,如果您将计数器作为依赖项传递给 useEffect,那么您应该看到计数器每次更改时的输出。 (在你的情况下,再一次)
useEffect
中的函数在初始渲染时运行一次,然后在每次依赖数组中的值更改时运行。如果 props.visible
没有改变,即使组件由于状态改变而重新渲染,也不会触发 useEffect。
props.visible
来自父组件,因此在 useEffect
中添加了 depedecy 数组,如果 props.visible
发生变化,则 useEffect
再次调用。
如果您将 counter
添加为依赖项数组并更改 counter
值,那么将调用 useEffect
。
示例:
import { useState, useEffect } from "react";
export default function App(props) {
const [counter, setCounter] = useState(0);
useEffect(() => {
console.log("Hello");
}, [counter]);
return (
<div className="App">
{counter}
<button onClick={() => setCounter(counter + 1)} > Increment </button>
</div>;
)
}
您认为依赖项数组是问题的原因是正确的。
如果您在依赖项数组中提供值,则只有在提供的值发生更改时,React 才会重新呈现。您提供了 prop.visible
,它不会更新也不会导致重新渲染。
为了使此示例正确,您的代码需要如下所示:
export default function App(props) {
const [counter, setCounter] = useState(0);
useEffect(() => {
console.log("Hello");
setCounter(1);
}, [counter]);
return <div className="App">{counter}</div>;
}