React设计模式相关
关于我在React设计模式上做的一些思考:
一,项目里实战的经历
最开始我根据组件不同的职能定义,拆分了展示组件和容器组件两大类,后来随着业务逻辑越来越复杂,容器组件代码越来越冗长,我又加入了HOC高阶组件的设计模式,将部分共享的通用功能逻辑抽出,来加强容器组件的可维护性和可扩展性;但是后来发现在多个HOC的一起使用时会经常出现props冲突的问题,而且数据来源比较混乱,于是我们又将这部分组件改用了render props,只取小部分定制化的state,来减小复杂度。
但其实无论是HOC还是render props,都是通过组件去解决组件的问题,将公共逻辑抽取到上层组件,然后利用props下传。不过也能理解,因为毕竟如果有生命周期逻辑复用这种的话,只能用组件。
不过后来有了hooks就不一样了,我们解决了HOC和render props的痛点,可以不再借助组件去抽离逻辑代码,真正的函数式思维,副作用更少,将状态管理和逻辑完全抽离React component,更好地实现复用,包括生命周期的逻辑复用。
二,总结:
HOC和render props都是为了共享代码逻辑以及部分生命周期而提出的设计模式,但是也各有利弊:
1,HOC的优点就是可扩展性更强,因为支持多参数传入,而缺点就是props要求必须统一,适合做一些复杂的功能型插件;
2,render props的优点就是只取需要的state,props自由命名,但是缺点就是可扩展性不强,而且很容易形成嵌套地域,因此适合做一些简单的UI层的组件;
3,Hooks可以用来优化render的前置处理,将相关的逻辑放在一起,而非散落在各个生命周期实例方法中
三,React Hooks原理
React Hooks的设计初衷就是为了解决复用逻辑状态等问题。
以useState为例:
1,通过闭包来实现状态的持久化;
2,状态的修改本质上还是借助setState;
3,利用一个 memoizedState 数组和 cursor 下标来解决多个状态存储问题:
(1) 初次渲染的时候,按照useState和useEffect的顺序,将state和deps等按顺序依次塞到 memoizedState 数组中去;
(2) 更新的时候,按照顺序从 memoizedState 中把上次记录的值取出;
memoizedState 和 cursor 是存在哪里的,它是怎么和每个函数组件一一对应的?
react会生成一棵组件树,树中每个节点都对应了一个组件,hooks的数据就作为组件的一个信息,存储在这些节点上。
React设计模式相关的更多相关文章
- React Test相关资料
karma 前端测试驱动器,生产测试报告,多个浏览器 mocha js的测试框架,相当于junit chai,单元测试的断言库,提供expect shudl assert enzyme sinon.j ...
- React其它相关知识点
React其它相关知识点 一,解释一下React Fiber? 简单来说,核心就是在虚拟dom和浏览器的调用栈之间多了一个虚拟调用栈,和虚拟dom一样,这个虚拟调用栈也是在内存中的,这个虚拟调用栈就类 ...
- Java设计模式相关面试
1.接口是什么?为什么要使用接口而不是直接使用具体类? 接口用于定义 API.它定义了类必须得遵循的规则.同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使 ...
- react 中间件相关的一些源码解析
零.随便说说中间件 在react的使用中,我们可以将数据放到redux,甚至将一些数据相关的业务逻辑放到redux,这样可以简化我们组件,也更方便组件抽离.封装.复用,只是redux不能很好的处理异步 ...
- React Native相关
安装相关工具参考(视频):http://ninghao.net/course/3001?a=26 学习参考:http://reactnative.cn/ 学习参考:http://www.ruanyif ...
- react redux 相关技术
React全都是围绕着组件的, 所以React基础也就是:写组件的jsx.组件的生命周期以及组件的属性和状态.jsx,只要是用过html模板的分分钟就能写了: 所谓生命周期就是组件在创建.销毁.更新阶 ...
- 《React设计模式与最佳实践》笔记
书里的demo都是15.3.2以下版本的,有些demo用最新的react 16.x版本会报错,安装包的时候记得改一下版本 第一章 React 基础 命令式编程描述代码如何工作,而声明式编程则表明想 ...
- React 设计模式 --- Container and Presentational pattern(容器和展示组件分离)
在React开发中,一个典型的React组件通常会混杂着逻辑操作部分和展示部分.逻辑操作部分指的是和页面UI无关的内容,如API的调用,数据的处理,事件处理函数. 展示部分则指的是创建页面UI 的内容 ...
- React (native) 相关知识
container component provider组件 react里的redux进阶玩法 react组件的生命周期 conductor / componentWillMount / render ...
随机推荐
- 为什么 2020 还要学 Node.js
更佳阅读体验 https://www.yuque.com/sunluyong/node 前言 前些日子刷知乎看到个 2019 年初的问题 2019年nodejs凉了吗?凉到什么程度了?才看到问题的时候 ...
- 算法图解(python2.7)高清PDF电子书
点击获取提取码:pzhb 内容简介 本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量.书中的前三章将帮助你打下基础,带你学习二分查找.大O表示法. ...
- Spring Joinpoint
如果用maven管理 则需要 <artifactId> aopalliance </artifactId> <artifactId> spring-aspects ...
- 【BZOJ1471】不相交路径 题解(拓扑排序+动态规划+容斥原理)
题目描述 在有向无环图上给你两个起点和终点分别为$a,b,c,d$.问有几种路径方案使得能从$a$走到$b$的同时能从$c$走到$d$,且两个路径没有交点. $1\leq n\leq 200,1\le ...
- 90行代码让微信地球转起来,太酷了!(python实现)
1.微信地球 手机重启后打开微信的一瞬间,会看到一幅有名的图片,上面站着一个 张小龙 . 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. ...
- IPv4地址段、地址掩码、可用地址等常用方法
package com.xxx.iptools; import java.util.ArrayList; import java.util.HashMap; import java.util.List ...
- html笔记 标签属性、图像和链接、超链接
HTML 标签属性: <b></b>:加粗 <i></i>:斜体 <u></u>:下划线 <s></s> ...
- ACL权限管理 学习
#查看权限 getfacl 文件名 例子:getfacl test 结果:# file: test# owner: root# group: rootuser::rw-group::r-xother: ...
- C#LeetCode刷题-拓扑排序
拓扑排序篇 # 题名 刷题 通过率 难度 207 课程表 40.0% 中等 210 课程表 II 39.8% 中等 329 矩阵中的最长递增路径 31.0% 困难
- C#LeetCode刷题之#100-相同的树(Same Tree)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4066 访问. 给定两个二叉树,编写一个函数来检验它们是否相同. ...