由于到useEffect
结束时,inputValue
已经被分配给previousInputValue.current
,并且useEffect
在组件的渲染或重新渲染期间运行,因此我认为第二个<h2>
标记中的previousInputValue.current
也应该与inputValue
的值相同。但是,它如何能够显示先前的值?
export default function App() {
const [inputValue, setInputValue] = useState("");
const previousInputValue = useRef("");
useEffect(() => {
console.log(inputValue, previousInputValue.current); // ab ab,i think it should be "ab a"
previousInputValue.current = inputValue;
console.log("--", inputValue, previousInputValue.current); // ab ab
}, [inputValue]);
return (
<>
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<h2>Current Value: {inputValue}</h2> {/* ab */}
<h2>Previous Value: {previousInputValue.current}</h2> {/*a i think it should be ab, as it is assigning inputValue in the useEffect()*/}
</>
);
}
1条答案
按热度按时间liwlm1x91#
让我提醒您,
useEffect
的回调会在组件呈现在页面上、挂载时以及每次更改后运行。而且只有setState
调用可以在组件内部触发新的重新呈现。因此,每次调用
setInputValue
时,UI都会更新为inputValue
等于键入的文本。并且只有在UI更新后,才会调用useEffect
的回调,在回调中:此时,两者是相等的,但UI不会更新,因为
ref
更新不会触发重新渲染。你必须等待下一个输入,才能得到上一个
在屏幕上显示为
previousInputValue.current
的值,并再次运行useEffect
的回调。这就是你所看到的行为。