从fetch获取数据但不将其存储在状态中

3
我们有一个React/Redux应用程序,您可以通过更改应用程序的语言并从API中获取所有字符串来使用它。将所有字符串存储在状态中似乎不是一个好主意,只将语言(en、es等)存储在状态中,将其余字符串存储在其他地方似乎是更好的选择。
那么,有没有一种方法可以保存从API调用中获取的数据,并且不将其保存在状态中?

你完全掌控请求,也许你只需要使用类似 fetch(myRequestParams).then(fetchRes => filterData(fetchRes)) 这样的方式,并使用这种 Promise 的结果?你如何处理服务器请求? - Victor Suzdalev
请求使用isomorphic-fetch库完成。在filterData(fetchRes)中,将其保存在全局中,以便我可以在任何地方访问数据? - matejs
但是你如何触发请求本身呢?我的意思是,你是在React组件的生命周期钩子上触发请求,还是使用Thunk中间件或其他类型的东西?并没有“唯一正确”的方法,您可以根据需要塑造API请求的结果,并将它们存储在应用程序状态树中(或不存储)。 - Victor Suzdalev
实际上,在componentWillMount中,我会加载默认语言字符串(或上次登录时首选的语言字符串),或者在用户想要更改语言并将接收到的数据保存在状态中时,使用thunk中间件触发异步操作。 - matejs
那么为什么不将过滤代码放入这个thunk函数中呢?您可以发出请求,收集数据,对其进行过滤,然后再将操作分派到您的存储中。 - Victor Suzdalev
1个回答

1

如果您不想使用存储,则不应使用操作来获取数据。

您可以将翻译存储在其他地方,并从状态中引用它们。如果您决定走这条路,最简单的选择是不使用存储并在redux外部获取翻译(即没有操作)。

另一个选择是将翻译存储在状态中。您可能不喜欢它,但它完全可行。将所有状态存储在一个单一对象中具有其优点(时间旅行,调试等)。

我认为在这种情况下没有明确的解决方案。

此外,在Github上有一个关于在存储中存储全部或部分状态的有趣讨论


将所有翻译都存储在状态中,有点违反了Redux尽可能保持最小状态的理念。那么用高阶组件包装组件并在上下文中提供翻译怎么样?然后我能否从操作中更改上下文本身? - matejs
我认为你是正确的。Redux 是关于存储状态,而不是数据。然而,你可以将语言选择存储在 store 中(例如 {..., language: 'en_EN'})。当你渲染组件时,你可以引用外部翻译对象 myTranslationObj[this.props.language].title。因此,上下文被保存在 store 中,因为它实际上是真正的状态。 - danielepolencic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接