Redux-persist 的使用说明及注意事项

面试官:小伙子,你的代码为什么这么丝滑?

简介

Redux 是一种极为流行的状态管理库,在 React 应用中广泛使用。但 Redux 的默认行为是将整个状态树保存在内存中,当页面重新渲染时,状态树被重新初始化,并且应用无法记住最后一次使用的状态。这对于一些需要即使刷新也不希望重置状态的场景来说是非常不方便的。

Redux-persist 是一个解决 Redux 持久化问题的解决方案。它可以将 Redux 状态存储在本地存储中,使得即使关闭浏览器,下次打开应用时仍然可以记住上一次使用的状态。

Redux-persist 可以与各种存储引擎一起使用,包括 localStorage,sessionStorage,AsyncStorage(在 React Native 中使用),IndexedDB 等等。

本文将详细介绍 Redux-persist 的使用方法和相关注意事项,并提供示例代码,帮助读者更好地使用 Redux-persist。

安装和基本用法

要使用 Redux-persist,需要先安装它:

--- ------- ------ -------------

在应用的 Redux 配置中,需要将 Redux-persist 的配置应用到 store 上:

------ - ----------- - ---- --------
------ - ------------- -------------- - ---- ----------------
------ ------- ---- ---------------------------- -- --- ------------

------ ----------- ---- -------------

----- ------------- - -
  ---- -------
  --------
--

----- ---------------- - ----------------------------- -------------

------ ----- ----- - ------------------------------
------ ----- --------- - --------------------

以上代码使用了 Redux-persist 的 persistReducerpersistStore 两个核心 API,来创建一个持久化的 Redux store。

persistReducer 接收一个 Redux reducer 和一个配置对象 persistConfig,然后返回一个新的 reducer,在这个新的 reducer 中,被包装起来的 reducer 会被添加一个新的处理过程,以从本地存储中加载以及存储状态。

persistConfig 配置对象有以下属性:

  • key:用于在本地存储中存储 state 的 key。
  • storage:设置 state 已序列化的存储引擎,例如 localStorage 或 sessionStorage。
  • stateReconciler:(可选)对于 persistReducer 而言,合并已加载的 state 和初始 state 的函数。默认为 autoMergeLevel1,可以使用 autoMergeLevel2 或自定义函数。
  • transforms:(可选)在存储和加载之前转换 state 树的数据的一组转换器。例如,使用 ImmutableJSredux-immutable-state-invariant 等。
  • blacklistwhitelist:(可选)指定 state 中应该忽略或仅存储哪些属性。

persistStore 接收一个 Redux Store,返回一个新的 Store,它可以将 state 持久化到本地,以便在应用重新加载时将其还原。

自定义存储引擎

redux-persist 提供了一些预定义的存储引擎,包括:

  • localStorage
  • sessionStorage
  • AsyncStorage(在 React Native 中使用)
  • IndexedDB

从 redux-persist v6.0.0 开始,为了避免直接依赖这些存储引擎,这些预定义的 storage 引擎已被移动到单独的仓库 redux-persist-webstorage 和 redux-persist-filesystem,而 redux-persist 仅支持引擎适配器(storage adapters),也就是说,任何实现了接口层的存储引擎都可以在 Redux-persist 中使用。

这里提供了一个自定义存储引擎的示例(使用 localforage):

------ ----------- ---- --------------
------ - ------------------------- - ---- ---------------------------

-- --- -----------
--------------------
  ------- ---------------------- -- -----------
  ----- --------
  -------- ----
---

-- -----
----- ------- - ---------------------------
  -------- ------------ -- -- -----------
---

-- ------- ----- - ---------
----- ----- - ------------------------------
----- --------- - ------------------- ----- -- -- -
  ----------------- -- ---- ----- ---------
---

注意事项

下面介绍一些使用 Redux-persist 的注意事项。

调试 Redux DevTools

使用 Redux DevTools 将被 Redux-persist 确切地包裹在 "redux-persist" 的 "store" 对象中,这意味着它不再是 Redux store 的直接子代。因此,当启用 Redux DevTools 时,必须使用 devToolsEnhancer() 而不是 window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() 以启用 DevTools。

------ - ---------------- - ---- ---------------------------

------ ----- ----- - ------------
  -----------------
  --------------------- --------- ------------------ --
--

链式调用时的注意事项

在某些情况下,你可能希望链式调用 Redux store 的某些方法,例如想要保存 state 后立即导航到其他页面。Redux-persist 的 persistStore 方法会返回 Promise,而且它将 store 作为 Promise 形式的参数传递。这意味着你无法在 Promise 结束前获取 store 实例,因此无法完成链式调用的操作。

-- ------------ ------- ----- --
--------------------------- -- -
  ---------------- ----- ------------- ---
  ------------------------
---

-- ------- ----------- --
------------------- ----- -- -- -
  ---------------- ----- ------------- ---
  ------------------------
---

对于链式调用的情况,可以使用 onSuccess 回调来解决这个问题,该回调会在 store 被成功地加载时触发,这样就可以使用 store 实例并完成操作了。

示例代码

下面是一个完整的使用示例(包括目录结构和 reducer 配置),以便更好地理解 Redux-persist 的使用。

目录结构

- ----
  - --------
    - --------
  - ---------
    - --------
  - --------

reducer 配置

-- -------------------
------ - --------------- - ---- --------
------ - -------------- - ---- ----------------
------ ------- ---- ----------------------------

------ - --------- ----------- - ---- -------------

----- ------------ - ------ - --- ------- -- -
  ------ ------------- -
    ---- ---------
      ------ ---------- - --- ---------- ----- ------------ ---------- ----- ---
    ---- ------------
      ------ -------------- --
        ------- --- --------- - - -------- ---------- --------------- - - ----
      --
    --------
      ------ ------
  -
--

----- ------------- - -
  ---- -------
  --------
--

----- ----------- - -----------------
  ------ -------------
---

------ ------- ----------------------------- -------------

action 配置

-- ------------------
------ - -- -- ---- - ---- -------

------ ----- -------- - -----------
------ ----- ----------- - --------------

------ ----- ------- - ---- -- --
  ----- ---------
  --- -------
  -----
---

------ ----- ---------- - -- -- --
  ----- ------------
  ---
---

store 配置

-- ----------
------ ----- ---- --------
------ - ------ - ---- ------------
------ - -------- - ---- --------------
------ - ----------- - ---- --------
------ - ------------- -------------- - ---- ----------------
------ ------- ---- ----------------------------

------ ----------- ---- -------------

------ --- ---- --------

------ - -- ------------- ---- ------------------

----- ------------- - -
  ---- -------
  --------
--

----- ---------------- - ----------------------------- -------------

----- ----- - ------------------------------
----- --------- - --------------------

-------
  --------- --------------
    ---- --
  ------------
  -------------------------------
--

---------------------------

结论

Redux-persist 是一种非常有用的工具,它为 Redux 应用提供了一种简单的方法来持久化状态,从而更好地适应各种情况,并提高了用户体验。本文详细介绍了 Redux-persist 的使用说明及注意事项,并提供了示例代码,帮助读者更好地了解如何使用 Redux-persist。希望能够对读者有所帮助。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66ff98601b0bf82c71cc95a1


猜你喜欢

  • ES10 的新特性:RegExp.dotAll 及 s 标志

    在前端开发中,正则表达式是不可或缺的一部分,其在字符串匹配、替换和校验等方面的优势是不言而喻的。ES10 引入了一个新的特性:RegExp.dotAll 或 s 标志,它极大地简化了匹配多行文本的问题...

    14 天前
  • Sequelize 错误:sequelize-without-timestamps-register 被拒绝了

    引言 在使用 Sequelize 进行 Node.js 开发时,我们经常需要使用 sequelize-without-timestamps-register 这个插件来禁用自动生成的时间戳属性。

    14 天前
  • Redis 在高并发下的性能优化实践

    随着互联网的发展,网站流量越来越大,高并发已经成为许多网站需要面对的挑战。而在前端类的网站中,Redis 作为一种非关系型数据库,已经成为了存储数据的首选,但是如何在高并发的应用场景中优化 Redis...

    14 天前
  • 谷歌无障碍性人员的建议

    在当今互联网时代中,无障碍性已成为一个不可或缺的要素。即使您的网站或应用程序可能没有直接服务于残疾人群体,但构建一个无障碍性的网站或应用程序可以帮助优化和提高您的用户体验,并为您的品牌带来更多的潜在客...

    14 天前
  • Koa.js 如何自定义 404 页面?

    在开发 Web 应用程序时,404 错误页面是不可避免的。Koa.js 是一个流行的 Node.js Web 框架,可以帮助开发人员简化构建 Web 服务器的流程。

    14 天前
  • TailwindCSS 教程:如何在框架中使用它

    什么是 TailwindCSS TailwindCSS 是一个基于原子类的 CSS 框架,它为开发者提供了丰富的 CSS 工具集,这些工具类涵盖了常用的样式命令,如边距、宽度、高度、背景、字体等等。

    14 天前
  • 使用 Socket.io 实现即时双向数据通信

    随着 Web 应用程序的日益普及,即时双向数据通信需求也逐渐增加。例如在线聊天、数据交互等。在传统的 Web 开发中,使用传统的 Ajax 轮询机制实现即时通信相对简单,但相应的性能和用户体验问题也不...

    14 天前
  • 使用 Fastify 和 PostgreSQL 构建 RESTful API

    在现代 Web 应用程序中,构建可扩展和快速的 RESTful API 是非常重要的。这篇文章将介绍如何使用 Fastify 和 PostgreSQL 构建一个高性能的 RESTful API。

    14 天前
  • 编写高可用的 RESTful API

    RESTful API 是现代 Web 服务中的重要组成部分。它提供了一种统一的方式来访问和操作资源,是前后端分离架构中的重要接口。在构建高可用 Web 应用程序时,确保 RESTful API 的高...

    14 天前
  • Express.js 中的 Promise 使用方法

    简介 Promise 是 JavaScript 中异步编程的一种解决方案,它可以避免回调地狱和嵌套回调函数,使得代码更加简洁和易于维护。在 Express.js 中,也可以使用 Promise 来处理...

    14 天前
  • 如何创建具有无障碍性的 WordPress 插件?

    WordPress 是世界上最流行的内容管理系统之一,拥有众多的插件,使其可以用于不同的用途。然而,一些插件可能不够无障碍,这意味着一些用户无法像其他人一样轻松地使用这些插件。

    14 天前
  • 在 Material Design 中使用 TabLayout 的注意事项

    介绍 Material Design 是谷歌出品的现代化设计语言,目标是提供清晰、有意义且现代化的设计体验,以及带来自然且直观的交互体验。在移动端应用中,TabLayout 是 Material De...

    14 天前
  • Koa.js 如何处理 WebSocket 请求?

    WebSocket 是一种 Web 技术,可以在客户端和服务器之间建立双向通信的连接。在前端应用中,可以通过 WebSocket 实现实时消息推送、实时数据的获取等功能。

    14 天前
  • 使用 PM2 来优化 Node.js 应用的运行速度

    在 Node.js 开发中,我们经常需要管理多个 Node 进程,同时监控它们的健康状况。针对这种情况,PM2 是一个非常优秀的工具,它提供了一系列方便的功能,用于管理和监控 Node 进程。

    14 天前
  • Cypress 中如何模拟滚动事件

    Cypress 是一个流行的前端测试框架,它可以帮助我们编写可靠的端到端测试,以确保我们的应用程序在各种情况下都能正常运行。在我们的测试用例中,经常会涉及到模拟用户滚动页面的场景,以确保我们的应用程序...

    14 天前
  • Babel 编译 ReactJS 代码时的一点小技巧

    React 是一种流行的 JavaScript 框架,可用于构建 Web 和移动应用程序。在编写 ReactJS 代码时,我们通常使用 ECMAScript 6 和 JSX 语法。

    14 天前
  • ES11 之 Number 的 update

    在 ECMAScript 2020(简称 ES11) 中,有很多新特性,其中很重要的一点是 Number 类型的更新。这些更新可以帮助我们更好地处理数值。在本文中,我们将深入讨论 Number 的 u...

    14 天前
  • Docker 部署 Web 应用遇到 “Gateway Timeout” 错误怎么解决?

    前言 随着 Web 应用的不断发展和演进,Docker 已成为一种方便和高效的容器化解决方案。但在实际应用中,我们可能会遇到一些问题。比如当我们在 Docker 中部署 Web 应用时,经常会遇到 “...

    14 天前
  • Express.js 中通过 WebSocket 传递 Json 格式数据

    WebSocket 是一种 HTTP 协议的补充,它基于 TCP 协议,在客户端和服务端之间建立双向通信的实时网络通信协议。Express.js 是一个流行的 Node.js 框架,它可以轻松地将 W...

    14 天前
  • Server-sent Events 和 WebSockets 的区别及应用场景

    引言 前端开发中,经常需要实现实时更新和双向通讯的功能,而 Server-sent Events(以下简称 SSE)和 WebSockets 都可以实现这样的功能。

    14 天前

相关推荐

    暂无文章