React+Redux 实战:打造高质量的社交平台

阅读时长 20 分钟读完

前言

在现今社交化的时代,社交平台可以帮助用户轻松完成信息共享、社交互动等操作。为了满足用户的需求,越来越多的社交平台开始采用 React+Redux 技术栈来开发高质量的社交平台。本文将会探讨如何使用 React+Redux 技术栈实现一款高质量的社交平台,并提供一些示例代码,帮助读者更好地理解该技术栈的应用。

React 组件化开发

React 是一个用于构建用户界面的库。React 倡导使用组件化的方式构建应用,每个组件都是一个单独的模块,避免了代码的冗长和重复。通过将单一职责的组件组合成更加复杂的组件,我们可以构建出高可复用性且易于维护的应用程序。

下面是一个基本的组件实现:

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

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

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

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

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

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

------ ------- ------------
展开代码

在这个例子中,我们把一个组件的状态和行为封装在了这个组件内部,没有和其他组件产生强耦合,从而保证了应用程序的可维护性。

Redux 状态管理

Redux 是 JavaScript 的一个状态管理容器,它可以把应用程序的状态存储到一个共享的容器中,通过不同的操作来进行状态的修改和更新。Redux 包含一个中心化的 Store,以及一系列的 Action 和 Reducer。

下面是一个基本的 Redux 实现:

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

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

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

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

---------------- ----- ----------- ---
---------------- ----- ----------- ---
---------------- ----- ----------- ---
展开代码

在这个例子中,我们定义了一个 reducer 函数,以及两个 Action,分别用于增加和减少状态值 count 的大小。我们将这个 reducer 函数结合 createStore 函数使用,创建了一个 Redux Store。通过 dispatch 方法,我们可以将 Action 提交到 Store 中,从而更新 Store 中的状态。为了在每次状态更新时获取最新的状态,我们使用了 subscribe 方法监听了 Store 的更新事件。

React+Redux 实践

下面我们将结合以上介绍的 React 和 Redux 技术,创建一个高质量的社交平台。

项目结构

开始引入 Redux 管理项目状态前,我们需要考虑项目的结构。社交平台一般包含用户模块、消息模块、动态模块等,因此我们可以将项目目录结构划分为以下几部分:

其中,components/ 目录用于存放 React 组件,containers/ 目录用于存放组件的 Connect Wrapper 连接器,用于将组件和 Redux Store 进行连接,actions/ 目录用于存放 Redux 的 Action 相关内容,reducers/ 目录用于存放 Redux 的 Reducer 相关内容,store/ 目录用于存放 Redux 的 Store 相关信息,utils/ 目录存放业务无关的工具函数。

User 组件

我们首先来设计用户界面,为用户提供一个单独的页面,用于完成用户信息的展示和修改。

app/components/User.js 中编写以下代码:

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

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

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

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

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

------ ------- -----
展开代码

在这个 User 组件中,我们定义了一个状态管理 name 和 age 的 state,输入框的值绑定到了 state 上,并提供了一个提交按钮,按钮的点击事件会将用户信息传递给 onUpdate 方法进行更新,由父组件处理后传递给 Redux Store。

app/containers/UserContainer.js 路径下,我们可以将 User 组件和 Redux Store 进行连接。在这个连接器里,我们定义了两个方法:mapStateToProps 和 mapDispatchToProps,用于将 User 组件需要的状态和操作从 Redux Store 中映射到本组件中。这里的 mapStateToProps 方法返回了 user 状态,用于将用户信息传递到本组件中,mapDispatchToProps 则提供了 onUpdate 方法,用于将组件中的用户信息更新到 Redux Store 中。

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

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

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

------ ------- --------
  ----------------
  ------------------
--------
展开代码

app/reducers/user.js 文件中,我们定义了更新用户信息的 Action 以及对应的 Reducer:

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

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

-- -------
------ ------- -------- ----------------- - - ----- --- ---- - -- ------- -
  ------------------- -
    ---- ------------
      ------ ------------
    --------
      ------ ------
  -
-
展开代码

在这个 Reducer 中,我们定义了一个更新用户信息的 Action:UPDATE_USER,在 dispatch 该 Action 的时候,可以通过 user 参数来更新用户信息。我们在 Reducer 中根据不同的 Action 类型来更新 Store 中的状态,这样我们就实现了将用户信息存放进 Redux Store 中并在 User 组件中进行展示和修改。

Message 组件

接下来,我们将会设计消息页面,为用户提供一个发送消息和查看消息的页面。

app/components/Message.js 中编写以下代码:

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

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

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

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

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

------ ------- --------
展开代码

在这个组件中,我们定义了一个 state 状态来存储用户输入的消息 message,用户消息的提交通过 onSubmit 方法和父组件进行交互,在用户点击发送按钮时,组件会通过 onSubmit 方法把当前的消息呈现出来,并将消息的状态清空。在 render 函数中,我们通过对 messages 数组做一个遍历,将每个消息呈现在一个列表中。

app/containers/MessageContainer.js 路径下,我们进行了 Connect 的连接操作,将 Message 组件和 Redux Store 连接。我们有两个方法:mapStateToProps 和 mapDispatchToProps,用于将 Message 组件需要的状态和操作从 Redux Store 中映射到本组件中。mapStateToProps 回传值包含 messages 这个状态,用于将消息传递到组件中进行展示,而 mapDispatchToProps 中的 onSubmit 方法将用户在组件中输入的消息通过 dispatch 方法提交到 Redux Store 中。

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

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

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

------ ------- --------
  ----------------
  ------------------
-----------
展开代码

app/reducers/message.js 文件中,我们定义了一个更新消息列表的 Action 以及对应的 Reducer:

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

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

-- -------
------ ------- -------- -------------------- - --- ------- -
  ------------------- -
    ---- ------------
      ------ ---------- ----------------
    --------
      ------ ------
  -
-
展开代码

在这个 Reducer 中,我们定义了一个添加消息的 Action:ADD_MESSAGE,在 dispatch 该 Action 的时候,可以通过 message 参数来添加新的消息。我们在 Reducer 中根据不同的 Action 类型来更新 Store 中的状态,这样我们就实现了将用户消息存放进 Redux Store 中,并在 Message 组件中进行展示。

Feed 组件

最后,我们将会设计用户动态的呈现,用户可以在该页面中查看好友的动态和进行评论等操作。

app/components/Feed.js 中编写以下代码:

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

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

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

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

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

------ ------- -----
展开代码

在这个组件中,我们定义了一个状态管理 content 和 feed 时间的 state,用于存储用户输入的动态和发布时间。我们通过 onSubmit 方法和父组件进行交互,在用户点击发布按钮时,组件会将当前的动态信息呈现出来,并将消息清空。我们通过在 feeds 数组上做一个遍历,来展示每一条动态。在每一条动态下,我们为每一条评论添加了一个 Comment 按钮,当用户点击 Comment 按钮时,我们将为每一条评论添加一个输入框和一个提交按钮,用户可以在该输入框中进行评论。

app/containers/FeedContainer.js 路径下,我们进行了 Connect 的连接操作,将 Feed 组件和 Redux Store 连接。我们有两个方法:mapStateToProps 和 mapDispatchToProps,用于将 Feed 组件需要的状态和操作从 Redux Store 中映射到本组件中。mapStateToProps 回传值包含 feeds 这个状态,用于将动态传递到组件中进行展示,而 mapDispatchToProps 中的 onUpdate 方法将用户在组件中输入的动态通过 dispatch 方法提交到 Redux Store 中,与此同时,onComment 方法也将呈现评论的状态更新到了 Redux Store。

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

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

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

------ ------- --------
  ----------------
  ------------------
--------
展开代码

app/reducers/feed.js 文件中,我们定义了一个更新动态列表的 Action 以及对应的 Reducer,以及一个 Comment 动态的 Action 和对应的 Reducer:

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

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

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

-- -------
------ ------- -------- ----------------- - --- ------- -
  ------------------- -
    ---- ------------
      ------ ---------- - -------- -------------------- ----- ----------------- -------------- ------ --------- -- ---
    ---- -------------
      ------ ------------- -- -- -
        -- -- --- ------------ -- ----------------- -
          ------ - ----- -------------- ---- --
        - ---- -
          ------ --
        -
      ---
    --------
      ------ ------
  -
-
展开代码

在这个 Reducer 中,我们定义了一个添加动态的 Action:UPDATE_FEED,在 dispatch 该 Action 的时候可以通过 feed 参数来添加新的动态。我们在 Reducer 中根据不同的 Action 类型来更新 Store 中的状态,这样我们就实现了将用户发布的动态存放进 Redux Store 中,并在 Feed 组件中进行展示和评论。

另外,我们还定义了一个 Comment 动态的 Action:COMMENT_FEED,在 dispatch 该 Action 的时候可以通过 index 参数来实现动态的评论。我们在 Reducer 中通过 map 方法,根据当前动态的 index 来更新 Store 中的状态,将每个动态的状态进行扩展,添加了一个 isCommentOpen 状态,用于判断是否展开评论。当用户点击评论按钮时,我们设置为 true,呈现出相应的输入框和提交按钮。

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

纠错
反馈

纠错反馈

程序员教程

精选优质教程,助你快速提升技术实力

程序员面试题库

海量优质面试题,助你轻松应对技术面试