【发布时间】:2020-09-06 19:50:08
【问题描述】:
这是现场演示:https://codesandbox.io/s/strange-bash-qj7ld?file=/src/App.js
所以我有一个这样的组件
const fn = () => {
console.log("useState");
return ["string"];
};
export default function App() {
const [counter, setCounter] = useState(0);
const [nonprimitive, setNonprimitive] = useState(fn());
useEffect(() => {
console.log("useEffect");
}, [nonprimitive]);
return (
<>
<button onClick={() => setCounter(counter + 1)}>Counter {counter}</button>
<div>{nonprimitive[0]}</div>
</>
);
}
每次点击按钮,计数器都会增加,组件会重新渲染。然后再次调用fn(),然后它会返回一个数组。当nonprimitive 发生变化时会触发useEffect。我有两个问题:
- 为什么
useEffect只被触发一次,而不是每次后续调用?nonprimitive是一个数组,它是一种非原始类型,因此即使其中的字符串项保持不变,它也应该每次都不同。看起来 React 正在做一些深入的比较。 - 为什么每当组件重新渲染时
useState会被打印两次?即,当我按下按钮时,fn内的console.log("useState");会被调用两次。
【问题讨论】:
标签: javascript reactjs