Reactjs 停止react功能组件(使用挂钩)重新渲染

Reactjs 停止react功能组件(使用挂钩)重新渲染,reactjs,frontend,react-hooks,web-frameworks,rerender,Reactjs,Frontend,React Hooks,Web Frameworks,Rerender,我有一个纯功能组件,在其中使用useEffect获取一些数据。我将一个空字符串传递给useEffect,因此它的行为就像一个安装了的组件一样 const getData = () => { setTimeout(() => { setLocalState({ a: 2 }); setIsLoading(false); }, 0); }; useEffect(() => getData(), []); 我的整个组件现在重新渲染了

我有一个纯功能组件,在其中使用useEffect获取一些数据。我将一个空字符串传递给useEffect,因此它的行为就像一个安装了的组件一样

const getData = () => {
    setTimeout(() => {
        setLocalState({ a: 2 });
        setIsLoading(false);
    }, 0);
};

useEffect(() => getData(), []);
我的整个组件现在重新渲染了两次。我希望控制此行为,并且仅在特定条件下重新渲染

在这里,我希望组件在setLocalState设置localState时重新启动,而不是在setIsLoading将isLoading设置为false时

以下是解决此问题的代码沙盒:

如果我们在react之外调用多个状态设置器,基于react的事件将触发多个呈现,但类内组件的状态更改将被批处理在一起。但在长期计划中,这将是固定的,正如前面提到的

这似乎是正常的反应行为。它的工作原理完全相同 如果要在类组件中多次调用setState()

React当前将批处理状态更新(如果从中触发) 在基于React的事件中,如按钮单击或输入更改。信息技术 如果在React事件之外触发更新,则不会批处理更新 处理程序,如setTimeout()

我认为有长期计划总是批量事件,但不确定 关于细节


您是否可以使用
isLoading=false
将isLoading设置为false,而不是
setIsLoading(false)
useState()
钩子的工作原理与
this.setState({…})
class
组件中类似,根据定义,以这种方式更改
state
会导致重新渲染。@sal我确实考虑过它,但它对我的情况没有帮助,因为如果我place@sallf我试图编辑上面的评论,但超时了。我同意,这是一个解决方案,以正常方式声明
isLoading
变量,而不是将其与
useState
绑定,并从
useState
获取setter方法。但是我想找到一种方法来停止对
shouldComponentUpdate
行的重新渲染,其中我使用
useState
为变量设置state,但是停止它重新渲染,因为它不是必需的。更新-将
isLoading
声明为
变量或使用关键字没有帮助
let
,因为我在I
setLocalState({data})
之后立即将其设置为false。但这不会导致重新渲染,因此
isLoading
保持为真。这应该符合你的要求,尽管不能说这是最佳实践。如果这不起作用,你能更具体地说明你想要完成什么吗?谢谢你告诉我。从现在起,我将遵循这种做法。