【发布时间】:2019-07-27 14:09:43
【问题描述】:
我有一个纯函数组件,我在其中使用 useEffect 获取一些数据。我将一个空字符串传递给 useEffect,所以它就像一个 组件确实挂载了。
const getData = () => {
setTimeout(() => {
setLocalState({ a: 2 });
setIsLoading(false);
}, 0);
};
useEffect(() => getData(), []);
我的整个组件现在重新渲染两次。我想控制这种行为,并且只在某些条件下重新渲染。
这里,我希望组件在 setLocalState 已设置 localState 时重新渲染,但在 setIsLoading 已设置 isLoading em> 为假。
以下是针对此问题的代码沙箱: https://codesandbox.io/s/0oyp6j506p
【问题讨论】:
-
你能用
isLoading = false而不是setIsLoading(false)将isLoading设置为false吗?useState()钩子就像class组件中的this.setState({ ... })一样工作,根据定义,以这种方式更改state会导致重新渲染。 -
@sal 我确实想过,但这对我的情况没有帮助,因为如果我放置
-
@sallf 我试图编辑 ^ 上面的评论,但我超时了。我同意以正常方式声明
isLoading变量而不是将其与useState绑定并从useState获取setter 方法是一种解决方案。但我想找到一种方法来停止在shouldComponentUpdate的行上重新渲染,其中我setState使用useState的变量但阻止它重新渲染,因为它没有必要。 -
更新 - 将
isLoading声明为variable或使用关键字let没有帮助,因为我在 @987654338 之后将其设置为 false @。但这不会导致重新渲染,因此isLoading仍然正确。 -
所以
if (condition) { setIsLoading(bool) } else { isLoading = bool }。这应该适用于您的要求,但不能说这是最佳实践。如果这不起作用,您能否更具体地说明您要完成的工作?
标签: reactjs frontend react-hooks web-frameworks rerender