如何使用 React-Redux 实现页面局部渲染

阅读时长 12 分钟读完

React 是一个使用简便且高效的前端框架,但对于一些需要实时修改的数据,React 的自身渲染方式会存在性能特别低下的问题。而 Redux 则是一个优秀的状态管理工具,与 React 搭配使用可以实现页面的局部渲染,提高渲染效率。下面,本文将介绍如何使用 React-Redux 实现页面局部渲染。

Redux 状态管理

状态

状态是应用中存储数据的唯一渠道。您应该与所有组件保持状态同步。状态是以一种结构化的方式进行组织的,即存储在一个状态容器(state container)中。Redux 实际上是将整个应用程序状态放在全局存储中,在任何组件中都可以直接访问。

动作

动作是用于描述发生在应用程序状态上的事情的纯 JavaScript 对象。每个动作都必须具有一个 type 属性,该属性描述该动作的类型。动作是将相关数据传递到应用程序状态中的一种机制。

例如:

调度程序

调度程序(Reducers)是一个纯函数,它接收先前的状态和动作,并返回一个新状态。Redux 调度程序应该总是返回一个新的状态对象。Redux 调度程序返回的新状态对象总是与之前的 state 对象不同,即使在状态树中的某些子树保持不变的情况下也是如此。

例如:

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

存储

状态由 Redux 存储管理,Redux 的 Store 可以看作应用状态的源头。Store 是由调度程序(Reducers)管理的纯函数,它提供了:

  • getState():用于返回当前 Redux 数据库状态的快照。
  • dispatch(action):用于触发跟新状态的动作。
  • subscribe(listener):用于注册监听器。监听器将在状态出现更改时被调用。

例如:

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

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

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

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

React-Redux 页面局部渲染

React-Redux 将 React 与 Redux 状态管理库相结合,将 Redux 状态存储容器中的状态注入到 React 项目的组件层次结构中。这意味着组件可以轻松访问应用程序状态,而无需单独传递状态/属性。Redux 的 Store 仍然是应用状态的定义,但connect()函数提供了一种机制,使特定组件可以访问 Store 的状态,并自动订阅状态更改。

connect()函数

connect()函数是React-Redux提供的一个高阶函数,用来将组件和 Redux 关联起来。其接受三个参数:

  • mapStateToProps(state, [ownProps]): 该函数用于将 Redux Store 中的状态映射到组件的 props(属性)上。
  • mapDispatchToProps(dispatch, [ownProps]): 该函数应该返回需要注入到组件的回调函数,通常是触发自定义动作的方式。
  • mergeProps(stateProps, dispatchProps, ownProps): 可选项,该函数接受前两个参数,将其合并,并返回最终更新组件的所有属性集。

例如:

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

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

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

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

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

Provider 组件

Provider 组件是一个顶级组件,用于接收 Redux Store 实例,并将其作为 React 应用程序的上下文传递下去。这使得在应用程序中的任何位置,使用 connect() 方法的组件都可以访问 Redux Store。

例如:

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

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

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

示例代码

下面是一个使用 React-Redux 实现的简单的购物车示例:

reducers/cartReducer.js

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

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

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

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

components/ProductList.js

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

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

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

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

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

components/Cart.js

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

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

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

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

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

index.js

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

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

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

总结

本文介绍了如何使用 React-Redux 实现页面的局部渲染。首先讲了经典 Redux 模式的状态管理过程,其中有状态、动作、调度程序和存储等四种元素,而 React-Redux 将 React 和 Redux 结合起来,将 Redux 中储存的状态注入到 React 项目的组件层次结构中,connect() 和 Provider 组件使通过状态的传递更加方便与高效。最后,通过实例讲了如何使用 React-Redux 实现购物车的加减等功能,以便读者深刻理解,欢迎移步实践。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645ee15e968c7c53b010e6f2

纠错
反馈