【发布时间】:2022-04-28 10:22:58
【问题描述】:
import React, { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function App() {
const [minus, setMinus] = useState(3);
const ref = useRef(null);
const handleClick = () => {
setMinus(minus - 1);
};
console.log(
"--> ref and state",
ref.current?.innerHTML ?? ref.current,
minus
);
// first useEffect
useEffect(() => {
console.log(`denp[ref.current] >`, ref.current?.innerHTML ?? ref.current);
}, [ref.current]);
// second useEffect
useEffect(() => {
console.log(`denp[minus]>`, ref.current?.innerHTML ?? ref.current);
}, [minus]);
return (
<div className="App">
{(minus >= 0 || minus <= -5) && <h1 ref={ref}>num: {minus}</h1>}
<button onClick={handleClick}>minus</button>
</div>
);
}
export default App;
在第一次渲染时:运行第一个 useEffect 并注销:denp[ref.current] > num: 3
我按下按钮,状态减号更新为2,组件重新渲染
在第二次渲染时:运行第一个 useEffect 并注销:denp[ref.current] > num: 2
我按下按钮,状态减号更新为1,组件重新渲染
在第三次渲染时:第一个 useEffect 不再运行
为什么第一个 useEffect 没有在第三个渲染上运行?
【问题讨论】:
-
ref.current 似乎不是一个可靠的依赖项,因为 React 发出了这个警告:React Hook useEffect 有一个不必要的依赖项:'ref.current'。排除它或删除依赖数组。像 'ref.current' 这样的可变值不是有效的依赖项,因为改变它们不会重新渲染组件。 (react-hooks/exhaustive-deps)
-
是的,我阅读了警告和文档,但我不知道到底发生了什么?你能解释一下每次重新渲染的作用吗?
-
很遗憾,我不知道这里发生了什么,抱歉
标签: reactjs use-effect use-ref