《React进阶之路》第九章示例 bbs-redux-reselect 解读

(路由按需加载)react论坛提问回复功能基本实现例子(react+redux)最终版 1.例子查看及说明文章:http://blog.youkuaiyun.com/dknightl/article/details/79168962。 2.路由按需加载文章:http://blog.youkuaiyun.com/dknightl/article/details/79261867 一。用npm install 可以下载安装package.json中的模块。运行时如果一直在map to regist,可以尝试换镜像。 二。npm run server 可以开户站点。 立即下载

对应源码项目地址

能学到些啥?

作为学习的例子,只有三个页面,但是麻雀虽小,五脏俱全。通过该例子可以学习到以下知识点:

  1. 项目的目录结构设计最佳实践。
  2. 项目的 state 设计和模块设计技巧。
  3. 异步获取 API 数据,以及将获取到的数据展示到页面上。

三个核心页面

  1. 登录页面。
  2. 帖子列表页面,仅展示帖子的基本信息。
  3. 帖子详情页面,展示帖子的详细内容,包括用户的评论列表。

测试账号

  • 该bbs内置三个用户
    • tom
    • jack
    • steve
  • 密码都是:123456

state 设计

{
  app: {
    requestQuantity: 0, // 当前应用中正在进行的 API 请求数
    error: null         // 应用全局错误信息
  },
  auth: {
    userId: '59e5d570fe26fff867fc94c0', // 当前登录用户的 id
    username: 'jack'                    // 当前登录用户的用户名
  },
  ui: {
    addDialogOpen: false, // 用于新增帖子的对话框的显示状态
    editDialogOpen: false // 用于编辑帖子的对话框的显示状态
  },
  posts: {
    allIds: [],  // 维护数据的有序性
    byId: {}     // 根据 id 获取帖子的相关内容
    }
  },
  comments: {
    byPost: {
      '5c10b55d34ce789876fc00ed': [] // 帖子 id 与该帖子下的评价 id 的映射。
    },
    byId: {}                         // 根据评论 id 获取到的该条评论相关内容。
    }
  },
  users: {}
  }
}

state 解读

一共六个子 state

  1. app:记录应用业务状态数据
    • requestQuantity:当前应用中正在进行的 API 请求数。
    • error:应用全局错误信息。
  2. auth:登录认证状态
    • userId:当前登录用户的 id。
    • username:当前登录用户的用户名。
  3. ui:UI 状态数据
    • addDialogOpen:用于新增帖子的对话框的显示状态。
    • editDialogOpen:用于编辑帖子的对话框的显示状态。
  4. posts:帖子列表
    • allIds:保存帖子列表的 id,维护数据的有序性。
    • byId:以帖子 id 为 key 的列表,每一个子项为帖子的相关内容。
  5. comments
    • byPost 保存以某一个帖子的 id 为 key 的、该帖子 id 下的评论列表 id,即:帖子 id 与该帖子下的评价 id 的映射。
    • byId 与 posts 下的 byId 类似,该项是以评论 id 为 key 的列表,每一个子项为评论相关的内容。
  6. users:当前页面相关的用户信息列表

模块设计

对应 state 的设计,模块设计基本上也出来了,除了对应上面的六个子 state 都有相应的模块之外,还有一个 Redux 模块。

Redux 模块,位于 redux/modules 目录下,各个功能相关的 reducer、action types、action creators 都定义到一个文件中。各个功能的 reducer 又通过 redux/modules/index.js 合并成一个根 reducer,以供 react-redux 创建 store 并进行统一管理。

运行时数据

首页,即帖子列表页面

看一下运行起来的 state,仅保留了两篇帖子的数据。

{
  app: {
    requestQuantity: 0,
    error: null
  },
  auth: {
    userId: '59e5d570fe26fff867fc94c0',
    username: 'jack'
  },
  ui: {
    addDialogOpen: false,
    editDialogOpen: false
  },
  posts: {
    allIds: [
      '5c10b579a41380ad2bf95cfd',
      '5c0f145bd76a23857943793c'
    ],
    byId: {
      '5c10b579a41380ad2bf95cfd': {
        id: '5c10b579a41380ad2bf95cfd',
        title: 'fs',
        vote: 0,
        updatedAt: '2018-12-12T07:16:10.863Z',
        author: '59e5d570fe26fff867fc94c0'
      },
      '5c0f145bd76a23857943793c': {
        id: '5c0f145bd76a23857943793c',
        title: '',
        vote: 0,
        updatedAt: '2018-12-11T01:35:23.187Z',
        author: '59e5d570fe26fff867fc94c0'
      }
    }
  },
  comments: {
    byPost: {},
    byId: {}
  },
  users: {
    '59e5d22f6722f75272b3bbcf': {
      id: '59e5d22f6722f75272b3bbcf',
      username: 'tom'
    },
    '59e5d570fe26fff867fc94c0': {
      id: '59e5d570fe26fff867fc94c0',
      username: 'jack'
    }
  }
}

帖子详情页面

再看有三条评论的帖子,进入详情页面时,state 的内容。帖子是 jack 发的,三条评论都是 tom 发的,所以users有两个用户的信息。

{
  app: {
    requestQuantity: 0,
    error: null
  },
  auth: {
    userId: '59e5d570fe26fff867fc94c0',
    username: 'jack'
  },
  ui: {
    addDialogOpen: false,
    editDialogOpen: false
  },
  posts: {
    allIds: [],
    byId: {
      '5c10b55d34ce789876fc00ed': {
        id: '5c10b55d34ce789876fc00ed',
        title: 'asd',
        content: 'ads',
        vote: 0,
        updatedAt: '2018-12-12T07:14:37.395Z',
        author: '59e5d570fe26fff867fc94c0'
      }
    }
  },
  comments: {
    byPost: {
      '5c10b55d34ce789876fc00ed': [
        '5c1215a60dbbbd7c0a640389',
        '5c12159eb50852373a0d1a9e',
        '5c12151f9536aad30f94f59f'
      ]
    },
    byId: {
      '5c1215a60dbbbd7c0a640389': {
        id: '5c1215a60dbbbd7c0a640389',
        content: 'sadf',
        updatedAt: '2018-12-13T08:17:42.783Z',
        author: '59e5d22f6722f75272b3bbcf'
      },
      '5c12159eb50852373a0d1a9e': {
        id: '5c12159eb50852373a0d1a9e',
        content: 'sad',
        updatedAt: '2018-12-13T08:17:34.272Z',
        author: '59e5d22f6722f75272b3bbcf'
      },
      '5c12151f9536aad30f94f59f': {
        id: '5c12151f9536aad30f94f59f',
        content: 'sa',
        updatedAt: '2018-12-13T08:15:27.067Z',
        author: '59e5d22f6722f75272b3bbcf'
      }
    }
  },
  users: {
    '59e5d570fe26fff867fc94c0': {
      id: '59e5d570fe26fff867fc94c0',
      username: 'jack'
    },
    '59e5d22f6722f75272b3bbcf': {
      id: '59e5d22f6722f75272b3bbcf',
      username: 'tom'
    }
  }
}

对应源码结构(模块设计)

源码结构与state设计是相辅相成的。

│  index.js
│
├─components // 全局通用组件
│  ├─Header
│  │      index.js
│  │      style.css
│  │
│  ├─Loading
│  │      index.js
│  │      style.css
│  │
│  └─ModalDialog
│          index.js
│          style.css
│
├─containers
│  ├─App
│  │      index.js
│  │
│  ├─Home
│  │      index.js
│  │
│  ├─Login
│  │      index.js
│  │      style.css
│  │
│  ├─Post
│  │  │  index.js // Post 容器组件
│  │  │  style.css
│  │  │
│  │  └─components // Post 专用组件
│  │      ├─CommentList
│  │      │      index.js
│  │      │      style.css
│  │      │
│  │      ├─CommentsView
│  │      │      index.js
│  │      │      style.css
│  │      │
│  │      ├─PostEditor
│  │      │      index.js
│  │      │      style.css
│  │      │
│  │      └─PostView
│  │              index.js
│  │              style.css
│  │
│  └─PostList
│      │  index.js // PostList 容器组件
│      │  style.css
│      │
│      └─components // PostList 专用组件
│          ├─PostItem
│          │      index.js
│          │      style.css
│          │
│          └─PostsView
│                  index.js
│
├─images
│      like-default.png
│      like.png
│
├─redux
│  │  configureStore.js
│  │
│  └─modules
│          app.js
│          auth.js
│          comments.js
│          index.js  // Redux 的根模块,仅将其余模块的 reducer 合并成一个根 reducer。
│          posts.js
│          ui.js
│          users.js
│
└─utils
        AsyncComponent.js
        connectRoute.js
        date.js
        request.js  // 对 fetch 的封装
        SHA1.js
        url.js  // API 配置

关于目录结构设计的最佳实践,请看:React+Redux工程目录结构,最佳实践

redux 模块

redux 模块,指的是在 redux/modules 下定义的模块。

一个 redux 模块,不仅包含 action types、action creators、reducers,还包含从该模块获取 state 数据的 selectors 函数。

selectors 函数的使命:

  • 封装:对外提供数据接口,外部调用者不需要知道内部实现细节,也不用关心内部 state 的具体结构。
  • 解耦:内部 state 结构如果有变化,修改对外接口即可,不会影响到外部调用方,降低模块间依赖关系,最大限度解耦。

全局 selector 函数

当需要从多个模块的 state 中获取数据时,最好的做法,是在 redux/module/index.js 文件中定义全局 selector 函数,该 selector 再通过各个模块的 selector 获取需要的数据。这样,容器组件通过调用全局 selector 函数,可以非常便利地对全局数据进行处理。

《React进阶之路》第九章示例原书代码

关于作者

深度学习动画实战:用MotorNerve系统5步实现自然角色交互 本文详细介绍了如何利用腾讯游戏的MotorNerve系统,通过深度学习技术5步实现自然角色动画交互。从环境搭建、基础运动控制到交互过渡和行走转向优化,该系统能显著提升游戏动画制作效率,尤其适合中小团队替代昂贵的动捕方案。重点解析了骨骼动画配置、PFNN控制器使用及Blender工作流集成等核心技术。 阅读详情

相关推荐

基于单片机智能家居控制系统设计

*单片机设计介绍,基于单片机智能家居控制系统设计。

QQ2193276455的博客 1715

Reselect 为什么可以优化 React 项目性能?

如果觉得不能满足你的性能追求,reselect 完全支持用户通过使用自定义的memoize与。详细的使用在官方文档中也有提到,不再展开。Reselect 为什么可以优化 React 项目性能?我想认真看完以上分析的各位应该都能回答一二。reselect 使用闭包保存上一次的参数lastArgs与结果lastResult,只有当依赖中的某个 Redux state 发生了变化,导致前后参数比对不一致了,才会触发 selector 的再次计算。

z_l_x_的博客 555

VMware 虚拟机里连不上网的五种解决方案

在VMware虚拟机里的虚拟机系统连接不上网络 首先,注意查看适配器选项里的网络连接这两个网络连接是否存在,如果不存在可以重新装一下VM 如果存在,连不上网 解决办法一: 虚拟机设置里,找到“网络适配器”,右边的网络连接选择“NAT 模式”,如果不行的话再linux系统。还是不行的话接着看第二种解决方案。 解决方法二: 可能原因是VMware NET Service...

墨轩 18万+

React中间件——Reselect简介

为什么使用reselect 在使用redux时,我们通常会创建很多selector来从store中读取数据。下面的代码取自于redux的todomvc示例。 const getVisibleTodos = (todos, filter) => { switch (filter) { case 'SHOW_ALL': return todos case 'SH

悦涵仙子的技术笔记本 6678

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 264

HMC5883L磁力计驱动开发:I²C通信、校准与FreeRTOS集成

磁力计是惯性导航与电子罗盘系统的核心传感器,其输出原始磁场数据需经精确采集、单位换算与误差补偿才能用于姿态解算。基于各向异性磁阻(AMR)原理的三轴磁力计,如HMC5883L,依赖稳定I²C通信获取12位有符号磁场采样值,并通过增益配置、硬软铁校准及温度补偿提升物理量精度。在嵌入式实时系统中,驱动层须保障数据的时间一致性与抗干扰鲁棒性,避免总线挂死、字节错位或量程误配等典型问题。本文围绕HMC5883L这一广泛使用的停产但仍在产线服役的磁传感器,详解寄存器配置、定点单位转换、八方位校准算法及FreeRTOS

weixin_42594427的博客 145

使用 GraalVM Native Image 构建并运行支持远程 JMX 管理的原生可执行文件

本文以 GraalVM Native Image 为背景,系统讲解如何在原生可执行文件中启用远程 JMX(Java Management Extensions)管理能力:从特性支持范围、`--enable-monitoring` 构建选项,到自定义标准 MBean 的动态代理元数据配置,再到使用 VisualVM 远程监视与操作 MBean 的完整实战流程。读完本文,你将掌握把 JMX 服务端/客

gitblog_00010的博客 468

有效Dk值提取方法的仿真分析

通过本文的仿真对比分析,提取有效Dk值方面,TDR技术在一些固定的场景下,依然有其参考应用价值,而随着VNA功能的不断增强和高精度测量手段的不断更新,双端口Delta-L技术才是主流评估方法,而单端口Delta-L技术则可以作为其降本增效的方案补充。

一只豌豆象的博客 1827

React性能优化:reselect

项目地址:reduxjs/reselect 轮子作用:减少不必要的数据计算。 适用场景:从redux store中取数据的时候。 在一个大型的项目中,我们会在store中保存很多数据,同时也会有很多的大小组件。不同的组件需要不同的数据,所以我们保存在store中的数据往往是很完整和庞大的,在存进store之前都不会对从服务器请求回来的数据进行过多处理。 而我们每一个组件所需要的数据可能都是不同的,...

weixin_34292959的博客 731

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1117

【华为OD机试】真题E卷-一种字符串压缩表示的解压(C++)

有一种简易压缩算法:针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如:字符串aaabbccccd 经过压缩变成字符串 3abb4cd请您编写解压函数,根据输入的字符串, 判断其是否为合法压缩过的字符串若输入合法则输出解压缩后的字符串 否则输出字符串!error来报告错误。

u014481728的博客 894

学react(redux核心、action creator、combineReducer、react-redux、bindActionCreators、selector、reselect)框架的第5天

Redux优化 redux核心 store = createStore() 创建核心 store.getState() 获取数据 store.dispatch() 调用方法 store.subscribe 监听state数据,判断是否被修改 action creator 当redux变量增多,需要区分,首先修改case条件 高效的action action types 将type定义为变量 combineReducer...

weixin_48764743的博客 1130

电磁场仿真软件:Sonnet_(1).Sonnet软件概述

根据特定需求自定义仿真流程,如多频率点仿真、多边界条件仿真等。

kkchenjj的博客 1450

深入了解React Native的状态管理:Reselect与Redux对比

1.背景介绍 React Native是一种使用React编写的原生移动应用程序,它使用JavaScript和React Native组件来构建移动应用程序。React Native的状态管理是一项重要的任务,它确定了应用程序的行为和性能。在这篇文章中,我们将讨论两种流行的状态管理库:Reselect和Redux。我们将讨论它们的核心概念、联系和区别,并提供详细的代码实例和解释。 2.核心概念...

AI天才研究院 1344

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

解决React性能瓶颈:Reselect与useSelector最佳实践指南

你是否遇到过React组件频繁重渲染的问题?当应用状态复杂时,即使无关数据变化也会触发组件更新,导致页面卡顿、用户体验下降。本文将通过Reselect库与React Hooks的useSelector结合使用,教你如何优化状态选择逻辑,实现精准高效的组件更新控制。 读完本文你将掌握: - Reselect选择器(Selector)的工作原理与优势 - useSelector性能陷阱及解决方案 -...

gitblog_00515的博客 398

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

React性能优化:使用Reselect避免不必要的重新渲染

React性能优化:使用Reselect避免不必要的重新渲染 【免费下载链接】react-bits ✨ React patterns, techniques, tips and tricks ✨ 项目地址: https://git...

gitblog_00414的博客 350

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

reselect--react性能优化之避免冗余计算

react就像facebook自己说的,真的就是个写视图的库而已。当初学者开始着手项目时,会发现想将项目功能实现或扩展、优化,总需要一些其他的库或工具函数。今天想来写一个比较常用且实用的库,reselect。当我们接触redux的时候,我们发现,虽然用redux之后要额外写一堆东西,但确实让数据流通变得规范、状态管理变得可控。通过用react-redux提供的connect函数,mapStateT...

weixin_36094484的博客 3711

教你用三天时间撸个论坛(react+egg.js包括上线)

引言 论坛系统也是一个很经典的系统了,很多人大学的时候估计也写过,但是三天就能从开写到部署上线这是以前怎么也不敢想的,得益于现代前端工作流和一些优秀开源框架,让这成为可能。能很快看到自己写的东西部署在网上,相信带来的成就感也是推动很多人持续学习的动力吧。 需要用到的 前端:react、react-redux、antd、axios、stylus 后端:egg.js 数据库相关:mysql、...

weixin_34209406的博客 2126

使用react实现select_react-select

A Select control built with and for ReactJSReact-SelectThe Select control for React. Initially built for use in KeystoneJS.See react-select.com for live demos and comprehensive docs.See our upgrade gu...

weixin_42213451的博客 481

react学习记录

在react中使用elementUi 步骤: ①npm i element-react --save npm install element-theme-default --save:安装主题 npm install react-hot-loader:安装依赖 ② import { 组件名} from 'element-react':引入element-react import 'elemen...

我的博客 216

10.6 react性能优化 Reselect,路由懒加载dynamic import(),项目的构建与部署,打包路径问题

一、Reselect 1、使页面更关注组件本身而不是状态量,避免页面组件需要计算得到selector。 2、reselect可以提升redux性能。 // 前几次参数是selector,最后一个回调函数是,前面selector的集合,并操作。 export const getTotalPrice = createSelector( getQuantity, getProduct, (q...

qq_40196738的博客 926

React纯组件渲染性能反模式

React纯组件的渲染可以非常高效,但是需要用户将其数据作为不可变的对象,才能正常工作。但是由于JavaScript的原因,有时做到这点可能非常具有挑战性。 反模式是在Render函数或者Redux的connect(mapState)中创建新的数组、对象、函数或者其他新的对象 纯渲染?说起React的纯渲染,我指的是组件应该通过浅比较来实现shouldComponentUpdate方法。例如Pu

fangjuanyuyue的专栏 3348

Immutable.js与React,Redux及reselect的实践

本篇文章将聚焦Immutable与Redux,reselect的项目实践,将从多方面阐述Immutable及Redux:包括什么是Immutable,为什么需要使用Immutable,Immutable.js与React,Redux及reselect的组合实践及优化,最后总结使用Immutable可能遇到的一些问题及解决方式。全文阅读:Immutable.js与React,Redux及resele...

u012996572的博客 1455
上一篇: ESLint 配置文件 .eslintrc 示例及说明
下一篇: Ant Design Pro v4 从后端下载 excel,后端返回的是文件流
uncleAndyChen
博客等级 码龄22年 32粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值