【发布时间】:2021-10-29 18:36:32
【问题描述】:
我刚刚学习了 useRef 并且对它的实际工作原理感到困惑。例如, #1
function Ref() {
const rerenderCount = useRef(0);
useEffect(() => {
rerenderCount.current = rerenderCount.current + 1;
});
return <div>{rerenderCount.current}</div>;
}
这里,useRef 给出的输出与下面代码中的 useState 相同,#2
function State() {
const [rerenderCount, setRerenderCount] = useState(0);
useEffect(() => {
setRerenderCount(prevCount => prevCount + 1);
});
return <div>{rerenderCount}</div>;
}
但是在这个#3 代码中,previousName.current 值总是显示前一个值。但它被设置为名称。
const [name, setName] = useState("");
const previousName = useRef(null);
useEffect(() => {
previousName.current = name;
}, [name]);
return (
<div className="App">
<input value={name} onChange={(e) => setName(e.target.value)} />
<div>
My name is {name} and it used to be {previousName.current}
</div>
</div>
);
请有人解释为什么这个名字在整数按时更新的地方倒退了一步。另外,useEffect 中 [name] 的用途是什么。无论有没有它,我都会得到相同的结果和渲染计数。
【问题讨论】:
-
[name]in useEffect 是一个依赖项。在此数组中,您声明了一个依赖项列表,并且当其中至少一个更改时,执行 useEffect 中的代码。代码也在第一次渲染时运行。因此,每次在输入文本中键入内容时,您都会更改previousName.current。如果你不添加任何依赖,useEffect将在每次组件重新渲染时运行。 -
@Antonio 能否解释一下为什么 perviousName.current 总是在名称后面加一个字母?就像我输入'abcd'.. name = 'abcd' 但是 perviousName.current = 'abc'?它在 useEffect 里面,所以当名称更新时为什么 useRef 不是?