导图社区 React架构设计理论
下图整理了React架构设计理论的相关知识点,给大家罗列了设计需要注意的一些点,点击下图打开看看吧。
社区模板帮助中心,点此进入>>
互联网9大思维
安全教育的重要性
组织架构-单商户商城webAPP 思维导图。
个人日常活动安排思维导图
域控上线
西游记主要人物性格分析
17种头脑风暴法
python思维导图
css
CSS
React架构
React思想
组件编写顺序
1.组件划分原则
解耦
复用
适度
2.编写静态组件
3.分析State
哪些是State
1. 对组件进行两个灵魂质问
2. 对State集合进行检查和去重
State保存的位置
单一状态
状态上移
4. 添加交互行为
mock方式
server
public
Redux思想
使用redux是在解决什么问题
问题原因:数据状态包括API数据,本地数据和UI状态等随着项目扩大变的管理复杂
解决问题的目的:防止管理状态失控
解决问题的手段:使用redux将视图层和状态管理层从逻辑上解耦
State
集中管理,全局唯一
不可变性
定义原则与React State定义原则相同
Action
普通Acion
ActionCreators
ActionTypes
异步Action
异步action的创建
请求开始action
请求成功action
请求失败action
拓展reducer
请求数据相关的state数据结构的变化
请求数据相关的reducer内容扩充
集成redux-thunk
问题原因:净化react组件的代码,想将数据请求放在action当中做
解决问题的目的:实现异步Action
解决问题的手段:使用redux-thunk实现异步Action,抽离react中的数据请求代码
Reducer
combineReducers
Store
redux-devtools
浏览器插件
项目依赖库
React-Redux思想
使用react-redux是在解决什么问题
问题原因:reactUI层和redux状态层的相关代码冗杂在react组件中
解决问题的目的:既能链接reactUI层和redux状态层,又不让两者代码糅合
解决问题的手段:使用react-redux将视图层和状态管理层从代码上解耦
功能
Provider组件
connect高阶HOC组件
map api
容器性组件和展示性组件
关注点
对redux感知
读数据
写数据
如何创建
流程图总结
https://www.taopoppy.cn/react_redux_jiagou_react_redux.png
React-Router
服务端路由和客户端路由的区别
服务端路由:访问http://a就返回a.html,访问http://b就返回b.html,是服务器根据不同的路由返回不同的页面
客户端路由:无论访问什么路径,返回的页面信息都是相同的,是通过js通过判断路径的不同来渲染不同的组件而已,所以叫做客户端路由
BrowserRouter和HashRouter区别
之前说react-router-dom是将react-route和web-api做绑定,这些web-api具体指的就是HTML5 history API,利用这些pushState、replaceState等方法实现在客户端实现路由的操作
哈希路由是使用url的hash部分作为路由信息,是通过使用页面不同的哈希和不同的组件之间做映射来完成的,哈希的出现主要为了兼容老版本浏览器,因为老版本的浏览器不支持history的API,所以通过哈希的变化来实现路由的变化。但是这样的情况在现在已经很少了,而且哈希的本身含义就是页面的定位,其逻辑也不符合路由的需求
路由渲染组件的三种方式
component
render
children
全新思维
一切皆组件
动态路由离散式声明法
架构设计基础
React+Redux项目结构组织方式
type(按照类型)
定义
类型指的是该文件在项目当中充当的角色类型
特点
优点
目录结构清晰却明确,功能文件比较紧凑
缺点
新添功能需要在不同的文件中做修改
不利于多人合作下的代码表写和提交合并
function(按照功能模块)
功能指的是按照功能或者页面将相关的文件写在同一个文件夹
有利于新功能的开发和拓展
容易造成store当中存在大量重复性的数据
同一状态在不同的模块中会有不一致的风险
Ducks(鸭子类型)
将应用的状态作为模块的划分依据
目录结构清晰紧凑,添加新功能只需添加新模块文件即可
组件需要任何状态只需要引入对应的state模块文件即可
三种设计Redux-State的依据
API为依据
以后端API返回数据结构作为State的数据结构
大量数组类型的结构会造成重复数据的存在
UI为依据
不同的UI显示都对应一份State
State数量过多,容易出现错误的State和重复的State
数据库基本原则为依据
整个应用的状态按照领域分成若干子State,子State之间不能保存重复的数据
State以键值对的结构存储数据,以记录的key/Id作为记录的索引,记录中的其他字段都依赖于索引
State中不能保存可以通过已有数据计算而来的数据,即State中的字段不互相依赖
架构设计进阶
selector函数
使用selector是在解决什么问题
问题原因:redux和容器性组件存在部分耦合,redux中的state结构变化会影响后者
解决问题的目的:实现react容器性组件和redux状态层的终极解耦
解决问题的手段:selectors是作为不同层级之间的接口不仅彻底解耦了层级,还使得不同层级通过接口进行安全交互和通讯得以实现
selector带来的好处
selector限制了层级的内部变化影响范围最多到接口
selector防止不同层级互相知道内部结构的风险
selector可以负责计算和过滤的工作
redux中间件(Middleware)
middleware的写法
middleware的本质
redux增强器(Enhancer)
Enhancer的写法
Enhancer和Middleware的关系
实际上middleware是store enhancer的一种,中间件虽然比较低阶,但是它约束了我们的行为,而增强器enhancer虽然更加灵活,但是破坏redux底层结构的风险更大,所以如果你对redux整体的结构和逻辑都不是太熟悉,尽量就别用
架构设计高级
reducer如何返回新的state对象
Object.assign
ES6扩展语法
Immutable
Immutable的常规使用
Immutable的优化
Immutable的选择考虑
对项目的整体侵入性很强,我们需要改的地方很多,如果你的项目不是很大,且store当中的数据层级不是很多,结构不复杂,不推荐使用的,我们一定要根据需求去搭建架构,去决定是否使用某些工具
Reselect
使用Reselect是解决什么问题
store当中的state发生了变化,每个容器型组件的mapStateToProps都要重新执行,产生的结果就是上述的这些selectors函数也要重复执行,也就导致了重复计算,使用Reselect创建的selectors函数,只要使用到的state没有发生变化,这个selectors函数就不会去重新计算,比如getVisibleTodos函数使用到了state.filter和state.todos,修改state.text并不会影响state.filter和state.todos,所以getVisibleTodos函数也就不会重复执行
Reselect的常规使用
Reselect的选择考虑