Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Reactjs:仅在渲染中更改状态几次_Javascript_Reactjs_Offlineapps - Fatal编程技术网

Javascript Reactjs:仅在渲染中更改状态几次

Javascript Reactjs:仅在渲染中更改状态几次,javascript,reactjs,offlineapps,Javascript,Reactjs,Offlineapps,我的理解是,您不应该更改渲染函数中的状态,因为这会导致无限重渲染或组件 这很有道理,但我发现自己处于一种特殊的情况。我正在构建一个脱机应用程序,并使用脱机存储系统检索数据。现在,每当调用一个方法来获取某些数据时,都会检查缓存,如果缓存未过期,组件将能够访问数据,因此不会发生任何事情,但是如果缓存过期,则会调用API,更新数据并重新呈现感兴趣的组件 这些方法将在第一次调用组件时更改组件的状态,因为它们将转到API获取新数据并重新渲染,然后它们将不再更改状态,因为数据已在缓存中 现在,我可以在com

我的理解是,您不应该更改渲染函数中的状态,因为这会导致无限重渲染或组件

这很有道理,但我发现自己处于一种特殊的情况。我正在构建一个脱机应用程序,并使用脱机存储系统检索数据。现在,每当调用一个方法来获取某些数据时,都会检查缓存,如果缓存未过期,组件将能够访问数据,因此不会发生任何事情,但是如果缓存过期,则会调用API,更新数据并重新呈现感兴趣的组件

这些方法将在第一次调用组件时更改组件的状态,因为它们将转到API获取新数据并重新渲染,然后它们将不再更改状态,因为数据已在缓存中

现在,我可以在component will mount中调用这些方法,这就是我现在正在做的,但是如果我被迫重新调用它们,我需要卸载并重新装载组件。这是唯一可行的方法吗


谢谢

第一步是理解状态管理和渲染需要解耦,这是您已经得到的

现在你可以做的是把你的外部状态/缓存元素看作一个可观察的对象(例如,我想做一些类似于VistabeBaseObjt)的事情。

onChangeHandler
非常简单:
this.setState({value:observeObject.value})
将触发组件重新呈现,该组件应该是一个纯函数,根据传递的
props
及其自身的
状态来输出DOM节点

这意味着检查缓存是否无效的逻辑不是基于每个值请求(在渲染内部),而是将对象视为自包含的。它定期检查自己是否需要通知其侦听器它已更改。由于JS不执行并行执行,所以您不必处理线程和同步。您知道,在渲染函数执行时,它将具有最新的值。如果在呈现之后,检查缓存的逻辑执行,并且它发现需要更新缓存,那么它只需像前面所说的那样通知其侦听器,并使组件重新呈现,因为
onChangeHandler
更改了
状态


希望我能帮上忙。

好的,所以当某些内容发生更改时,我已经在缓存中调用render()。您提出的解决方案是,我可以在组件中调用一个方法,根据需要更新缓存并调用缓存,而不是简单地调用render?是的,您基本上可以在外部
缓存/状态
和您自己的组件实例
状态
之间创建一个“链接”。如果一个改变了,另一个会得到通知。类似这样的内容:
this.props.myCache.listen('change',this.onCacheChange)
this.onCacheChange=()=>this.setState({value:this.props.myCache.getValue()})关于React的更多信息。是的,但这已经发生了。所以,假设有东西清除了缓存。缓存会触发感兴趣的所有页面的重新阅读。问题是在ComponentMount中调用的方法将被调用,需要再次调用API并更改缓存,这将导致重新渲染。这是否为我提供了一个解决方案,不仅从缓存中重新渲染,而且在我的组件中调用一个方法,该方法异步调用api,然后重新渲染。
componentWillMount
应该只执行一次。由于状态更改而重新渲染不会卸载组件。缓存更新只应通知侦听器。该句柄中的业务逻辑是每个组件的。在我的示例中,我使用了一个
setState
调用。这种方法可能更复杂。我不明白你是怎么看待无限重渲染的。对,我想那就是你当时的建议。我会选择这个作为答案。