如何在 useEffect Hook 中重新渲染组件
How to rerender component in useEffect Hook
好的:
useEffect(() => {
}, [props.lang]);
每次 props.lang 更改时,我应该在 useEffect 中做什么来重新渲染组件?
将您的 useEffect 视为 componentDidMount
、componentDidUpdate
和 componentWillUnmount
的混合,如 React 文档中所述。
要表现得像 componentDidMount
,您需要像这样设置 useEffect
:
useEffect(() => console.log('mounted'), []);
第一个参数是将基于第二个参数触发的回调,第二个参数是一个值数组。如果第二个参数中的任何值发生变化,您在 useEffect
中定义的回调函数将被触发。
然而,在我展示的示例中,我传递了一个空数组作为我的第二个参数,并且永远不会更改,因此回调函数将在组件安装时调用一次。
那种总结useEffect
。如果您有一个参数而不是空值,就像您的情况一样:
useEffect(() => {
}, [props.lang]);
意思是每次props.lang
变化,你的回调函数都会被调用。 useEffect
不会真正重新渲染您的组件,除非您在该回调函数中管理可能触发重新渲染的某些状态。
更新:
如果你想触发重新渲染,你的渲染函数需要有一个你正在更新的状态 useEffect
。
例如,在这里,渲染函数首先显示英语作为默认语言,在我的使用效果中,我在 3 秒后更改了该语言,因此渲染被重新渲染并开始显示“西班牙语”。
function App() {
const [lang, setLang] = useState("english");
useEffect(() => {
setTimeout(() => {
setLang("spanish");
}, 3000);
}, []);
return (
<div className="App">
<h1>Lang:</h1>
<p>{lang}</p>
</div>
);
}
完整代码:
const [state, set] = useState(0);
useEffect(() => {
fn();
},[state])
function fn() {
setTimeout((), {
set(prev => prev + 1)
}, 3000)
}
上面的代码将每 3 秒重新渲染一次 fn
函数。
最简单的方法
添加一个虚拟状态,您可以切换以始终启动重新渲染。
const [rerender, setRerender] = useState(false);
useEffect(()=>{
...
setRerender(!rerender);
}, []);
这将确保重新渲染,因为组件总是在状态更改时重新渲染。
您可以随时随地调用 setRerender(!rerender)
来启动重新渲染。
好的:
useEffect(() => {
}, [props.lang]);
每次 props.lang 更改时,我应该在 useEffect 中做什么来重新渲染组件?
将您的 useEffect 视为 componentDidMount
、componentDidUpdate
和 componentWillUnmount
的混合,如 React 文档中所述。
要表现得像 componentDidMount
,您需要像这样设置 useEffect
:
useEffect(() => console.log('mounted'), []);
第一个参数是将基于第二个参数触发的回调,第二个参数是一个值数组。如果第二个参数中的任何值发生变化,您在 useEffect
中定义的回调函数将被触发。
然而,在我展示的示例中,我传递了一个空数组作为我的第二个参数,并且永远不会更改,因此回调函数将在组件安装时调用一次。
那种总结useEffect
。如果您有一个参数而不是空值,就像您的情况一样:
useEffect(() => {
}, [props.lang]);
意思是每次props.lang
变化,你的回调函数都会被调用。 useEffect
不会真正重新渲染您的组件,除非您在该回调函数中管理可能触发重新渲染的某些状态。
更新:
如果你想触发重新渲染,你的渲染函数需要有一个你正在更新的状态 useEffect
。
例如,在这里,渲染函数首先显示英语作为默认语言,在我的使用效果中,我在 3 秒后更改了该语言,因此渲染被重新渲染并开始显示“西班牙语”。
function App() {
const [lang, setLang] = useState("english");
useEffect(() => {
setTimeout(() => {
setLang("spanish");
}, 3000);
}, []);
return (
<div className="App">
<h1>Lang:</h1>
<p>{lang}</p>
</div>
);
}
完整代码:
const [state, set] = useState(0);
useEffect(() => {
fn();
},[state])
function fn() {
setTimeout((), {
set(prev => prev + 1)
}, 3000)
}
上面的代码将每 3 秒重新渲染一次 fn
函数。
最简单的方法
添加一个虚拟状态,您可以切换以始终启动重新渲染。
const [rerender, setRerender] = useState(false);
useEffect(()=>{
...
setRerender(!rerender);
}, []);
这将确保重新渲染,因为组件总是在状态更改时重新渲染。
您可以随时随地调用 setRerender(!rerender)
来启动重新渲染。