react 16.8版本新特性以及对react开发的影响
Facebook团队对社区上的MVC框架都不太满意的情况下,开发了一套开源的前端框架react,于2013年发布第一个版本。
react最开始倡导函数式编程,使用function以及内部方法React.creactClass创建组件,之后在ES6推出之后,使用类组件Class构建包含生命周期的组件。
- react 16.8版本更新
react16.8版本更新标志性的信息,是引入了hooks以及相关的一些api。
useState:
// 函数式组件初始化state和更改state:
const Counter = () =>{
const [num,setNum] = userState(0);
return(
<div>
<div>{count}</div>
<button onClick={()=>setCount(num+ 1)}>+</button>
</div>
);
};
- useEffect
userEffect副作用函数的组件,不仅取代了组件初始化,组件挂载成功,组件状态更新这三个阶段的生命周期函数
同时还能在这个阶段处理一些内存队列:包括定时器等,解决了在16.8版本之前,在组件移除之后,异步队列没有被移除,占据内存导致页面卡顿等问题
useEffect(() => {
compoment.subscribe(id);
return () => {
compoment.unsubscribe(theId) //取消订阅
}
});
react16.8版本更新解决了什么问题
- 组件复用更便捷
在更新的版本之前,复用组件,更多的是使用高阶组件,以及封装的组件,通过传参和父子组件通信的形式去复用,
更新之后,可以通过函数式组件返回状态的形式,去接受组件向外暴露的组件内容。
实例
//旧版本
function children() {
return function (WrappedComponent) {
return class HighComponent extends React.Component {
state = {
childProps: xxx
};
render() {
const { childProps } = this.state;
return <WrappedComponent childProps={childProps} />;
}
};
};
}
class App extends Component{
render(){
/**
* 调用高阶组件
*/
const { childProps} = this.props;
return (
<children
columns={[...]}
// tableProps包含pagination, onChange, dataSource等属性。
{...childProps}
/>
)
}
}
// 新版本
function children() {
const [childProps, setChildProps] = useState(xxx);
return childProps;
}
function App {
const { childProps} = useTable();
return (
<Table
columns={[...]}
// tableProps包含pagination, onChange, dataSource等属性
{...childProps}
/>
)
}
- 在我们上面提到的,清除定时器,以及解决在生命周期变化过程中,消除占用内存的队列等
- 函数式组件出现了状态管理,在以往的react函数式编程过程中,react只能被动去接收一个从父组件传递下来的一个props状态,在hooks更新之后,可以使用hooks更新的方法,提高组件的功能性以及扩展性,在函数式组件当中拥有了像class组件一样可控生命周期
- useEffect取代了一部分生命周期函数,从代码量的角度来说,简化了代码,解决了在class组件在编写过程中,需要不断使用bind或者箭头函数去绑定当前的this,更专注于当前状态的管理
hooks和react diff算法
- react diff这里不做深入讲解,简单来说diff算法是react以及vue2.0版本当中:
内部有一套虚拟dom的算法,在组件渲染过程中,对每个dom渲染一个key值,
在state状态更新过程时,对应渲染的虚拟dom会去对比真实渲染在页面上的dom元素,如果某个节点对比时发现有更改,对应更改当前虚拟dom节点的数据状态,再渲染真实的dom到页面当中。
两者的联系:
hooks在更新之后,减少了对生命周期函数的执行,同时更新状态更为迅速,这样在虚拟dom执行过程中,提高diff执行速度
hooks使得函数式组件有了自己内部的状态,在函数式组件执行过程中,不需要等待装载到父组件当中,自己可以更新状态,所以减少了部分dom的深度,在页面渲染过程中,也算是变相提高了页面渲染速度。
总结
hooks在出现之后,对react前端开发来说,标志性的特点应该是解决了类似定时器队列占据内存的问题,简化了react生命周期和组件代码,追溯数据流向和状态修改更为清晰。
在16.8版本之后的小版本更是出现了自定义hooks,还有usememo等api,
包含vue3.0新的api,这些版本的更新都在帮助前端开发者不用再花更多的时间去研究生命周期执行和运行的过程,去专注页面上状态的改变,快速和稳健开发前端业务。
文章个人博客地址:react 16.8版本新特性以及对react开发的影响
react 16.8版本新特性以及对react开发的影响的更多相关文章
- [译] React 16.3(.0-alpha) 新特性
原文地址:What's new in React 16.3(.0-alpha) 原文作者:Bartosz Szczeciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/ ...
- Atitit mac os 版本 新特性 attilax大总结
Atitit mac os 版本 新特性 attilax大总结 1. Macos概述1 2. 早期2 2.1. Macintosh OS (系统 1.0) 1984年2 2.2. Mac OS 7. ...
- Atitit opencv版本新特性attilax总结
Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...
- IOS第三天-新浪微博 - 版本新特性,OAuth授权认证
*********版本新特性 #import "HWNewfeatureViewController.h" #import "HWTabBarViewController ...
- 【开源】OSharp3.3框架解说系列:重新开源及3.3版本新特性
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明)
Atitit 发帖机系列(8) 词法分析器v5 版本新特性说明) v5 增加对sql单引号的内部支持.可以作为string 结构调整,使用递归法重构循环发..放弃循环发. V4 java dsl词 ...
- [iOS微博项目 - 1.7] - 版本新特性
A.版本新特性 1.需求 第一次使用新版本的时候,不直接进入app,而是展示新特性界面 github: https://github.com/hellovoidworld/HVWWeibo ...
- framework各版本新特性(为面试准备)
菜鸟D估计描述这些新特性的文章都是烂大街的货色,之所以拿出来分(e)享(xin)一下,有两个原因:1.当年面试的时候有人问到,我不知道该怎么回答:2.项目需要发布了,但是考虑到framework的版本 ...
- 《转》MySQL 5.7版本新特性连载
MySQL 5.7版本新特性连载(一) 本文将和大家一起分享下5.7的新特性,不过我们要先从即将被删除的特性以及建议不再使用的特性说起.根据这些情况,我们在新版本及以后的版本中,应该不再使用,避免未来 ...
随机推荐
- IDE中集成widfly
第一步:添加JBOss服务器,Tomcat同理添加 第二步:选择刚刚部署好的服务器 第三步:启动服务: 注意:与Tomcat略有不同的是,启动的根目录可能不相同,导致一直404 查看启动的根目录: 注 ...
- docker简介及安装(1)
Docker简介 软件开发中最为麻烦的事情可能就是配置环境了.由于用户使用的操作系统具有多样性,即便使用跨平台的开发语言(如Java和Python)都不能保证代码能够在各种平台下都可以正常的运转,而且 ...
- 基于Autolayout的动画
在修改了约束之后,只要执行下面代码,就能做动画效果 [UIView animateWithDuration:1.0 animations:^{ [添加了约束的view的父控件 layoutIfNeed ...
- 【转载】Nginx简介及使用Nginx实现负载均衡的原理
原文地址:http://blog.csdn.net/u014749862/article/details/50522276 是什么? Nginx 这个轻量级.高性能的 web server 主要可以干 ...
- maven转web项目时 在Project Facets下转换时 Further configuration available没有出现
如果下边的 further configuration available不出来 把Dynamic web module 去掉勾选,应用与项目,然后再点开项目的properties,再选中Dynami ...
- shell脚本之循环语句与函数
shell脚本之循环语句与函数 echo的用法: echo -n #表示不换行输出 echo -e #输出转义字符,将转义后的内容输出到屏幕上 转义字符: \n :换行,被输出的字符从"\n ...
- xshell脚本之条件语句
xshell脚本之条件语句 1.test命令: 如果test命令中列出的条件成立,test命令就会退出并返回状态码0, 如果条件不成立,test命令就会退出并返回非零的退出状态码,这使得if-then ...
- 简单的JSON数组转树形结构
function toTree(data) { let result = [] if(!Array.isArray(data)) { return result } data.forEach(item ...
- 浅谈Java正则表达式
正则表达式我们都知道,它定义了字符串的模式,可以用来搜索.编辑或处理文本.我们在某些特定场景中用起来是非常方便的.它等于是给我们划定了一个范围,让我们可以精准的匹配到我们想要的结果.比如我想判断一个几 ...
- Spark入门案例 - 统计单词个数 / wordcount
Scala版 import org.apache.spark.{SparkConf, SparkContext} object WordCountScala { def main(args: Arra ...