【问题标题】:Why redux instead of session storage为什么使用 redux 而不是 session 存储
【发布时间】:2019-11-17 07:02:41
【问题描述】:

假设我的组件“App”状态中有一个小对象。 那么要将状态保存在redux中,为什么我不能将其保存在会话存储中?这有什么明显的区别吗?

【问题讨论】:

  • 如果你愿意,你可以。不过,它们非常不同。 Redux 不会在重新加载或加载新页面时出现,并且会话存储不会有反应性或 Redux 带来的任何其他功能。虽然它们可以用作互补的东西

标签: html reactjs browser react-redux


【解决方案1】:

您可以这样做。

不同的是,

React 足够聪明,可以在您使用state 时更新您的DOM,并使用setState 更新state。当您在 react 应用程序中使用 setState 时,它只会重新渲染您的组件,如果您在组件中使用该状态值来显示一些值/数据,这些值/数据会在您的组件上更新。

当您将数据存储在 sessionStorage 中时,您的应用程序将不会在 reacts 中自动更改 sessionStorage 值。在这种情况下,您的组件将不会重新渲染,并且您的更改不会在您的组件上更新。 但是对于这种情况,您有一个名为 forceUpdate()

的解决方案

来自文档,

调用 forceUpdate() 将导致在组件上调用 render(),跳过 shouldComponentUpdate()。这将触发子组件的正常生命周期方法,包括每个子组件的 shouldComponentUpdate() 方法。如果标记发生变化,React 仍然只会更新 DOM。

虽然你有forceUpdate,但通常你应该尽量避免使用forceUpdate(),并且只读取render()中的this.propsthis.state

【讨论】:

    【解决方案2】:

    浏览器存储只允许与字符串值相关联的键,没有什么复杂的,因此只需将不同类型的数据传入和传出本地/会话所需的代码本身就是令人讨厌的。

    Redux 的“存储状态”部分确实是最不有趣的部分。 Redux 的重要部分是使用 action 和 reducer 的模式,组件可以订阅这些状态更改,因此如果 reducer 更新状态,使用它的组件将自动重新渲染。使用浏览器存储技术实际上只解决了“状态在哪里”部分。您仍然需要更新该状态并让组件知道在状态更新时重新渲染的机制

    会话存储也可能为零,例如在 Safari(包括 iOS)中简单地使用隐私浏览模式会将存储配额设置为零

    还为 React 应用程序处理 localStorage 和 sessionStorage ,将其视为状态。它是代码库中最容易出错、不可预测、最令人头疼的代码。

    如果您仍然想使用它们,您也可以使用redux-locastorage 将存储保存到本地存储或使用redux-sessionstorage 保存到会话存储

    【讨论】:

      【解决方案3】:

      您的组件不会通过更改会话存储而重新渲染, 但如果该组件连接到 redux,它将通过更改 redux 状态..

      【讨论】:

        【解决方案4】:

        Redux 允许任何组件“连接”到状态并了解任何状态更改并相应地更新。当您使用会话存储时,您无法轻松让组件了解状态,因此您无法以最佳方式使用 react。

        此外,与更新 redux 存储相比,写入和读取会话存储的成本更高/效率低。

        会话存储速度:Speed of sessionStorage

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-22
          • 2017-10-26
          • 2020-10-14
          • 2019-06-15
          • 2015-12-04
          • 1970-01-01
          相关资源
          最近更新 更多