【发布时间】:2021-08-15 08:11:30
【问题描述】:
我有两个组件,parentComponent 和 ChildrenComponent。当我单击该按钮时,它将呈现handleClick 方法以更新ChildrenComponent 中的childrenValue。在ChildrenComponent 内部,我使用useEffect 来观察childrenValue 的变化。
当我在useEffect 内部有一个计时器时,而不是在ParentComponent 上重新渲染一次,为什么每次父组件值更改时都会渲染它?
父组件:
import React, { useState } from "react";
import { ChildrenComponent } from "./ChildrenComponent";
export const ParentComponent = () => {
const [test1, setTest1] = useState(false);
const [test2, setTest2] = useState(false);
const [test3, setTest3] = useState(false);
console.log("ParentComponent render", test1, test2, test3);
const handleChangeParentValue = () => {
setTest1(true);
setTest2(true);
setTest3(true);
};
return (
<>
<ChildrenComponent handleChangeParentValue={handleChangeParentValue} />
</>
);
};
子组件:
import React, { useState, useEffect } from "react";
export const ChildrenComponent = (props) => {
const { handleChangeParentValue } = props;
const [childrenValue, setChildrenValue] = useState(false);
useEffect(() => {
if (childrenValue) {
// handleChangeParentValue();
// if I use handleChangeParentValue() instead of a timer,
// the parent component only render once with three true value:
// ParentComponent render true true true
const timerSuccess = setTimeout(() => {
handleChangeParentValue();
}, 1000);
return () => {
clearTimeout(timerSuccess);
};
}
}, [childrenValue]);
const handleClick = () => {
setChildrenValue((prev) => !prev);
};
return (
<>
<div>ChildrenComponent</div>
<button onClick={handleClick}>CLick me</button>
</>
);
};
当我使用计时器时,每次 setTest 运行时父级都会渲染:
ParentComponent render true false false
ParentComponent render true true false
ParentComponent render true true true
为什么会这样?如果我想使用子组件上的计时器进行值延迟更新,但仍希望父组件渲染一次或一起而不是单独更新父值,我该怎么办?
【问题讨论】:
-
我对你的问题有点困惑。你是在问为什么当你的状态改变时反应会重新渲染父组件?组件中调用的任何 setState 都会强制重新渲染该组件,即使值相同。
-
没有。我知道父组件会重新渲染。我想知道为什么当我有计时器时它会重新渲染 3 次。如果没有那个计时器,它只会重新渲染一次。
标签: javascript reactjs settimeout use-effect