《深入浅出React和Redux》一书的部分章节例子代码演练及相关知识点

React状态管理:Redux Toolkit与传统Redux的比较 本文深入探讨了React中状态管理的策略,特别是Redux Toolkit如何简化传统Redux的复杂性。我们回顾了Redux的历史和局限性,并展示了Redux Toolkit如何通过提供更加简洁的API和更少的样板代码来提高开发效率。文章还介绍了如何在React应用中集成Redux Toolkit,实现用户管理功能。 阅读详情

个人学习心得项目地址

前言

针对《深入浅出React和Redux》一书中,某一个被挑选的例子,完成之后,会创建一个相应的分支。

  1. 《深入浅出React和Redux》原书例子代码,传送门
  2. 在原书代码的基础上,把相关依赖升级到当前最新版(截止 2018-11-06)。
    • react v16.6.0
    • redux v4.0.1
    • react-redux v5.1.0
  3. 第一章代码位于 chapter-01,第二章的代码位于 chapter-02,依次类推。
  4. 子目录名即为分支名,如第四章代码目录下的子目录:todo_controlled_component,会有一个对应分支也叫 todo_controlled_component。

PropTypes 依赖变化

react 的类型检查 PropTypes 自 React v15.5 起已弃用,请使用 prop-types。
《深入浅出React和Redux》一书示例代码使用的 react 是 15.4.1 版本,需要调整 PropTypes 的引用:

// 书中的代码是
import { PropTypes } from 'react';
// 要改为:
import PropTypes from 'prop-types';

扩展阅读:使用 PropTypes 进行类型检查

第二章,分支 controlpanel

# 切换至该分支
git checkout controlpanel
git pull

知识点

  1. 组件。
  2. 组件的 state、props。
  3. 父组件通过 props 向子组件传递数据。

第二章,分支 controlpanel_with_summary

# 切换至该分支
git checkout controlpanel_with_summary
git pull

知识点

  1. 组件的 props,父组件向子组件传递数据,包括传递函数。
  2. 子组件通过调用父组件的函数,来达到向父组件传递数据的目的。

第三章,分支 react-redux

# 切换至该分支
git checkout react-redux
git pull

到项目根目录,添加 redux 和 react-redux 依赖。
以下操作会添加最新版的 redux(截止 2018-11-06,版本为:4.0.1) 和 react-redux(截止 2018-11-06,版本为:5.1.0)

cnpm i redux --save
cnpm i react-redux --save

如果不事先添加 redux 依赖而直接添加 react-redux 依赖,会有警告:

peerDependencies WARNING react-redux@* requires a peer of redux@^2.0.0 || ^3.0.0 || ^4.0.0-0 but none was installed

知识点

  1. UI 组件(presentational component)(傻瓜组件)
  2. 容器组件(container component)
  3. 应用 redux 的三大原则
  4. redux 库:const store = createStore(reducer, initValues)
  5. React-Redux 库
    • connect(mapStateToProps, mapDispatchToProps)(componentName)
    • mapStateToProps
    • mapDispatchToProps

相关知识点,已经总结到文档:redux 知识点、参考链接

第四章,分支 todo_controlled_component

# 切换至该分支
git checkout todo_controlled_component
git pull

知识点

代码文件组织结构,以及确定模块的边界。

参考《深入浅出React和Redux》P75-81。

  1. 推荐目录组织方式:按照功能组织。
  2. 把一个目录看做一个模块,那么我们要做的是明确这个模块对外的接口,而这个接口应该实现把内部封装起来。
  3. 目录下人 index.js 文件,就是我们的模块接口。
  4. 各个模块之间只能假设其他模块包含 index.js 文件,要引用模块只能导入 index.js,不能够直接去导人其他文件。
  5. 导人一个目录的时候,默认导人的就是这个目录下的 index.js 文件, index.js 文件中导出的内容,就是这个模块想要公开出来的接口。
  6. 推荐使用 export(命名式)的方式导出模块,而不是用 export default(默认)的方式,因为 export default 在导入时,会增加代码量。

状态树的设计

参考《深入浅出React和Redux》P81-83。

  1. 一个模块控制一个状态节点。
  2. 避免冗余数据。
  3. 树形结构扁平。
  4. 只能通过 reducer 纯函数修改 state,不能直接修改 state。
    • 所以,push 和 unshift 会改变原来那个数组,是不能直接作用于 state 的。
    • 利用扩展操作符。

combineReducers

  • 利用 combineReducers 可以把多个只针对局部状态的“小的”reducer 合并为一个操纵整个状态树的“大的“ reducer。

  • 更妙的是,没有两个”小的“ reducer 会发生冲突,因为无论怎么组合,状态树上一个子状态都只会被一个 reducer 处理,Redux 就是用这种方法隔绝了各个模块。

  • 很明显,无论我们有多少“小的” reducer,也无论如何组合,都不用在乎它们被因为调用的顺序,因为调用顺序和结果没有关系。

  • 随着应用变得复杂,需要对 reducer 函数进行拆分,拆分后的每一块独立负责管理 state 的一部分。

  • combineReducers 辅助函数的作用是,把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用 createStore。

  • 合并后的 reducer 可以调用各个子 reducer,并把它们的结果合并成一个 state 对象。state 对象的结构由传入的多个 reducer 的 key 决定。

  • 最终,state 对象的结构会是这样的:

    {
      todos: ...
      filter: ...
    }
    
  • 通过为传入对象的 reducer 命名不同来控制 state key 的命名。例如,你可以调用 combineReducers({ todos: todoReducer, filter: filterReducer }) 将 state 结构变为 { todos, counter }。

  • 个人认为,更好的做法是直接用 reducer 名作为 state 的 key,使用 ES6 的简写方法:combineReducers({ todos, filter })。这与 combineReducers({ todos: todoReducer, filter: filterReducer }) 产生的 state 结果是一样的。

关于 state key 的使用,实际开发过程中还需要注意些什么呢?看笔者总结的踩坑经验:state 的 key

bindActionCreators

把原来笨重的函数调用过程封装起来,使最终的业务代码更加优雅。

代码修改及完善

添加新的依赖

cnpm i --save react-addons-perf
...
peerDependencies WARNING react-addons-perf@* requires a peer of react-dom@^15.4.2 but react-dom@16.6.0 was installed

意思是,需要 react v15.4.2 支持,所以,将 Store.js 修改如下:

// 以下代码删除
import Perf from 'react-addons-perf'
win.Perf = Perf;
const middlewares = [];
if (process.env.NODE_ENV !== 'production') {
  middlewares.push(require('redux-immutable-state-invariant')());
}

const storeEnhancers = compose(
  applyMiddleware(...middlewares),
  (win && win.devToolsExtension) ? win.devToolsExtension() : (f) => f,
);

export default createStore(reducer, {}, storeEnhancers);
// 上一行代码改为
export default createStore(reducer, {}, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());

createStore 第三个参数:window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),是为了支持 Redux DevTools 插件。

警告 Warning: A component is changing an uncontrolled input of type checkbox to be controlled…

完整的警告如下:

Warning: A component is changing an uncontrolled input of type checkbox to be controlled. 
Input elements should not switch from uncontrolled to controlled (or vice versa). 
Decide between using a controlled or uncontrolled input element for the lifetime of the component. 
More info: https://fb.me/react-controlled-components
    in input (at todoItem.js:13)
    in li (at todoItem.js:7)
    in TodoItem (at todoList.js:14)
    in ul (at todoList.js:11)
    in TodoList (created by Connect(TodoList))
    in Connect(TodoList) (at todos.js:11)
    in div (at todos.js:9)
    in Unknown (at TodoApp.js:8)
    in div (at TodoApp.js:7)
    in TodoApp (at src/index.js:10)
    in Provider (at src/index.js:9)

这是因为 todoItem.js:13 代码中的 checkbox 的 checked 属性没有用 state 来记录,所以会警告,但这并不影响该示例的正常运行。
关于页面控件是否受控,以及相关问题,请看官方文档:Controlled Components

解决

为了消除以上警告,同时,为了更方便理解 state 变化会引起页面的重新渲染,作如下修改:

  1. 将 checkbox 的 onClick 事件删除,这样,点击 checkbox 控件不会有任何反应(checkbox 设置了只读属性)。
  2. 将设置待办事项状态的点击事件放到 label 上,添加了 a 标签。

    不过,a 标签的 href 属性只是 # 会引发另外的警告,这个下面再解决。

  3. 同时将 checkbox 的 checked 属性添加上去,其值就是待办事项的数据:currentState.completed,这是一个 bool 变量。
  4. 将变量 checkedProp 定义行 const checkedProp = completed ? {checked: true} : {}; 删除。
    最后,关键代码如下:
    <input className="toggle" type="checkbox" checked={completed} readOnly/>
    <label className="text"><a href="#" onClick={onToggle}>{text}</a></label>

a 标签的 href 属性只是 # 会引发的警告

./src/todos/views/todoItem.js
  Line 13:  The href attribute requires a valid value to be accessible. 
  Provide a valid, navigable address as the href value. 
  If you cannot provide a valid href, but still need the element to resemble a link, 
  use a button and change it with appropriate styles. 
  Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md  
  jsx-a11y/anchor-is-valid

项目中用到的 Link 组件 ./src/filter/views/link.js 也有同样的警告,一起修改。

./src/filter/views/link.js
  Line 11:  The href attribute requires a valid value to be accessible.
  ...
解决

参照文章anchor-is-valid,作如下调整:

将 a 标签 <a href="#" onClick={onToggle}>{text}</a> 换成 button 控件,同时增加 button 相关的 style.css 文件放到 src 根目录下。

<button
    type="button"
    className="link-button"
    onClick={onToggle}>
    {text}
</button>

将 link.js 组件中的 a 标签也换成 button,这里就不贴代码了,直接看代码文件吧。

最后还有一个警告,在点击【添加】按钮的时候触发的,不过 chrome 浏览器才有该警告,QQ 浏览器没有,没再深入研究。

[Deprecation] Using unescaped '#' characters in a data URI body is deprecated and will be removed in M71, around December 2018. 
Please use '%23' instead. See https://www.chromestatus.com/features/5656049583390720 for more details.

关于作者

React与Redux开发实践深度解析 本文是对React和Redux开发实践的深度解析,涵盖从组件构建、数据流管理到性能优化的各项技术细节。介绍了React组件的生命周期、状态与属性的管理、测试方法以及React生态系统中的各种工具使用。同时,深入探讨了Redux架构及其在应用中的实现,并对Webpack构建工具进行了配置和优化介绍。 阅读详情

相关推荐

掌握React与Redux的融合之道

本文将探讨如何在React项目中集成jQuery Bootstrap组件,并深入理解React的组件生命周期方法。同时,我们将探索Redux架构,这是管理JavaScript应用程序状态的高级概念。通过分析Redux的核心原则和Flux模式,我们能够理解Redux如何通过单一存储方法和只读状态来简化组件间通信。

weixin_42581846的博客 351

react的<a></a>必须提供一个有效的href属性

“The href attribute requires a valid value to be accessible. Provide a valid, navigable address as the href value.”

hdj0511的博客 1014

React全栈 Redux Flux webpack Babel整合开发.中文完整版.pdf

React全栈 Redux Flux webpack Babel整合开发.中文完整版.pdf。学习用,如有侵权请联系我删除

The href attribute requires a valid value to be accessible.Provide a valid, navigable address as the

在react中使用a标签报错, 解决办法将<a href="#" >个人博客</a> 改成<a href="/#" >个人博客</a> 加个/ 即可

qq_40011214的博客 4840

《React与Redux开发实例精解》PDF

《React与Redux开发实例精解》

TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

文章目录TCP介绍三次握手四次挥手滑动窗口拥塞避免算法 TCP介绍 三次握手 四次挥手

热爱编程的菜鸟 1万+

React + Ant Design 4 使用过程中问题搜集

React 和 Ant Design 使用过程中问题搜集

FreedomX20的博客 6625

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

天穹云原生 9169

2020/09/29 a标签报错 The href attribute requires a valid value to be accessible. Provide a valid

报错详情 The href attribute requires a valid value to be accessible. Provide a valid, 出错代码 解决方法 #号那里改成 /# 即可

Nighsloth的博客 912

交通小白首投TRB就中Oral?我的完整时间线与避坑指南(附Editorial Manager实操截图)

本文详细解析了交通领域新手如何高效完成TRB国际会议投稿的全流程,从选题策略到投稿系统实操,再到评审过程解析和常见误区避坑指南。特别针对初次投稿者提供了实用建议,包括时间规划、选题考量、Editorial Manager系统操作技巧,以及如何应对评审意见。文章还分享了从录用到会议参与的关键步骤,帮助研究者提升投稿成功率。

weixin_27303545的博客 387

C语言实现定时任务

例:设置定时任务,每周周X的X时X分自动重启系统 思路:将设置好的重启时间保存到本地配置文件中,设置定时器定时一分钟,每一分钟信号触发一次事件,事件函数中获取配置文件信息与当前系统时间信息,将两个时间进行时间差计算,符合条件的自动重启系统. //创建定时器函数(通过信号触发事件timer_task函数启动) int create_timer() { struct sigevent evp; int ret = 0; memset(&evp, 0, sizeof(stru

佳佳鸽的博客 5036

The href attribute requires a valid value to be accessible

警告原因 href="javascript:;" 上面这段代码的存在。 解决办法 使用href="/#"代替

Always-Learning 1099

手把手教你用DCA1000EVM解析IWR6843毫米波雷达数据(附MATLAB代码)

本文提供了一份详尽的实战指南,手把手教你使用DCA1000EVM采集并解析TI毫米波雷达IWR6843的原始数据。内容涵盖硬件连接配置、mmWave Studio参数设置、LVDS数据流结构解析,并附有核心MATLAB代码,详细演示了从原始二进制文件到距离-速度谱的信号处理全链路,帮助开发者快速掌握数据解析与处理的关键步骤。

terraform7cloud的博客 227

推荐开源项目:React-and-Redux - 深入理解与实践React和Redux

推荐开源项目:React-and-Redux - 深入理解与实践React和Redux 1. 项目介绍 react-and-redux 是一个基于 GitHub 的开源项目,它源于一本名为《深入浅出React和Redux》的技术书籍。这本书籍由机械工业出版社出版,为读者提供了深入学习React和Redux框架的全面资源。项目仓库中包含了书中所有实例代码,帮助开发者们在实践中理解和掌握这两种流行的技...

gitblog_00100的博客 371

一文看懂 SAP Integration Suite:从架构治理、接口编排到事件驱动的集成全景

SAP Integration Suite是企业数字化转型中的关键集成平台,通过统一的方法论和工具链解决系统互联、数据对齐和流程协同等复杂问题。其核心能力包括:1)集成评估(Integration Assessment)提供战略规划框架;2)迁移评估(Migration Assessment)支持从传统平台向云的平滑过渡;3)云集成(Cloud Integration)实现日常业务流程编排;4)集成顾问(Integration Advisor)简化B2B标准映射;5)贸易伙伴管理(TPM)优化外部协作流程;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 503

SAP物料主数据中的销售视图。这是一个在销售与分销模块中至关重要的核心主数据,直接关系到从报价到交货的整个销售流程

SAP物料主数据的销售视图是销售流程的核心基础,它定义了物料如何被销售、定价、开票和交付。销售视图包含五个关键控制点:1)基本销售数据控制物料销售状态;2)销售组织数据决定销售渠道和产品分类;3)通用物料数据管理销售描述和税务分类;4)交货计划控制交付参数;5)开票计划管理定价规则。这些设置直接影响销售流程顺畅度、数据准确性、客户满意度、财务合规性和业务灵活性。建议将销售视图创建纳入新产品引入流程,并建立规范的维护机制,确保业务变化时及时更新配置。

金牌架构师 666

Lesson 42 使用真正的 Redux 和 React-redux

Lesson 42 使用真正的 Redux 和 React-redux

Mr_zzr的博客 236

自动识别象棋棋子的OpenCV应用

在计算机视觉领域,OpenCV是一个广泛应用的开源计算机视觉库,它提供了丰富的图像处理和分析工具。本文将介绍如何使用OpenCV实现自动识别象棋棋子的功能,并提供相应的源代码。通过以上代码,我们可以实现对棋盘图像中棋子的自动识别。需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和算法优化,以获得更好的识别效果。函数利用预处理后的图像,寻找图像中的轮廓,并根据轮廓的面积筛选出可能的棋子轮廓,最后在原图像中提取棋子区域。在主程序中,我们读取输入图像,并调用。

WzisTypescript的博客 908

React+Typescript+Redux的使用步骤

目录 1. 安装Redux基本环境 2. 为项目引入Redux 2.1 rootReducer的创建 2.2 生成store 2.3 包裹根组件 3. 子模块中使用Redux 3.1 创建types文件 3.2 回顾一下Redux的工作流 3.3 分别创建子模块的reducer和actions reducer actions 3.4 子模块主文件的编写 react-red...

--Joern的物联领域-- 1138

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

redux 及 react-redux的详细使用过程和案例 。分享搬砖知识的一天,期间打瞌睡了几次。啊哈哈~

搬砖搬砖,分享点搬砖技巧。 第六章了,差不多结束了 ,还有些零零散散的,慢慢搬吧。 之前的章节内容可点这~ 第六章 — redux redux中文官网 6.1 什么是 redux 官方是这样子说的 :redux 是 JavaScript 应用程序的可预测状态容器 ,它可以帮助您编写行为一致、在不同环境(客户端、服务器和本机)中运行且易于测试的应用程序。 官方的解释有时候总是看不懂的 说一下我的理解。 JavaScript 应用程序 : redux 和 react 可是两回事,只是长的像而已。 redu.

FOR 的博客 1088

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

react-redux-typescript-guide Playground:用最新类型定义守护示例代码的类型安全验证场

[playground/README.md](https://link.gitcode.com/i/16ee478eb95b0e9aa3cebdae7bba815a) 篇幅虽短,却定义了 react-redux-typescript-guide 项目中最关键的一条工程质量线:**所有出现在指南中的 React + Redux + TypeScript 代码示例,都必须在一个可运行的 playgro

gitblog_00363的博客 851

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Lesson 36 动手实现 React-redux(一):初始化工程

Lesson 36 动手实现 React-redux(一):初始化工程

Mr_zzr的博客 300

动手实现 React-redux(六):React-redux 总结

到这里大家已经掌握了 React-redux 的基本用法和概念,并且自己动手实现了一个 React-redux,我们回顾一下这几节都干了什么事情。 React.js 除了状态提升以外并没有更好的办法帮我们解决组件之间共享状态的问题,而使用 context 全局变量让程序不可预测。通过 Redux 的章节,我们知道 store 里面的内容是不可以随意修改的,而是通过 dispatch 才...

dianyingtan8093的博客 129

Lesson 41 动手实现 React-redux(六):React-redux 总结

Lesson 41 动手实现 React-redux(六):React-redux 总结

Mr_zzr的博客 304

RuoYi-Vue-Plus 多租户后台管理系统:选型判断、最短部署路径与二次开发指南

接手一个需要多租户、审批流和权限体系的后台项目时,最容易浪费时间的不是业务本身,而是权限、租户隔离、定时任务这些"脏活"。RuoYi-Vue-Plus 就是冲着这块来的:一个基于 Spring Boot 4 和 JDK 21 的多租户后台管理系统,重写了 RuoYi-Vue 的全部功能,内置 Sa-Token 认证、Mybatis-Plus、WarmFlow 工作流、SpringDoc、Hutoo

gitblog_00970的博客 365

Redux新手必备:React Things带你从理论到实战的状态管理教程

Redux是React生态中最流行的状态管理库之一,而React Things作为一个专注于React学习的开源项目集合,为Redux初学者提供了从理论到实战的完整学习路径。本文将通过React Things项目中的精选资源,帮助你快速掌握Redux的核心概念和实际应用技巧。 ## 为什么选择Redux进行状态管理? 在React应用开发中,组件间的状态共享和数据流管理往往是新手面临的最大挑战

gitblog_01111的博客 375
上一篇: react 技术栈(全家桶)学习
下一篇: React+Redux工程目录结构,最佳实践
uncleAndyChen
博客等级 码龄22年 32粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值