当我将函数参数传递给 useState() 时,如下所示:
const [testA, setTestA] = useState(returnTestA()); // run every rendering
const [testB, setTestB] = useState(returnTestB); // run only mount
- 带有 () 的函数在每次渲染时运行
- 但不带 () 的函数仅在第一次渲染(mount)时运行
这是我的整个代码:(info.js
)
import React, { useState } from "react";
let count = 0;
const returnTestA = () => {
count++;
console.log("test A: " + count);
return "test";
};
const returnTestB = () => {
count++;
console.log("test B: " + count);
return "test";
};
const Info = () => {
const [name, setName] = useState("");
const [testA, setTestA] = useState(returnTestA()); // run every rendering
const [testB, setTestB] = useState(returnTestB); // run only mount
const onChangeName = e => {
setName(e.target.value);
};
return (
<div>
<div>
<input name="name" value={name} onChange={onChangeName} />
</div>
<div>
<div>
<b>Name:</b> {name}
</div>
</div>
</div>
);
};
export default Info;
结果是:
为什么会这样?最佳实践是什么?
最佳答案
官方解释参见:https://reactjs.org/docs/hooks-reference.html#lazy-initial-state
const [testB, setTestB] = useState(returnTestB);
它类似于:
const [testB, setTestB] = useState(() => returnTestB());
你将一个函数作为参数传递给useState()
方法,该函数在挂载时只会运行一次。
但是对于
const [testA, setTestA] = useState(returnTestA());
你将一个计算对象作为参数传递给useState()
,该对象将在每次渲染时被计算。
关于javascript - useState 中没有 () 的函数( react 钩子(Hook)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60500859/