reactjs 为什么ref对象的值与UI上的赋值不一样,尽管它在useEffect的控制台中显示的是相同的?

hc8w905p  于 2023-04-29  发布在  React
关注(0)|答案(1)|浏览(147)

由于到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()*/}
    </>
  );
}

liwlm1x9

liwlm1x91#

让我提醒您,useEffect的回调会在组件呈现在页面上、挂载时以及每次更改后运行。而且只有setState调用可以在组件内部触发新的重新呈现。
因此,每次调用setInputValue时,UI都会更新为inputValue等于键入的文本。并且只有在UI更新后,才会调用useEffect的回调,在回调中:

previousInputValue.current = inputValue

此时,两者是相等的,但UI不会更新,因为ref更新不会触发重新渲染。
你必须等待下一个输入,才能得到上一个

previousInputValue.current = inputValue

在屏幕上显示为previousInputValue.current的值,并再次运行useEffect的回调。这就是你所看到的行为。

相关问题