您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

react16和react17有什么区别

2024/5/5 2:18:20发布23次查看
区别:1、react16中jsx会转换为“react.createelement”,而react17不会;2、react17不再在后台的文档级别附加事件处理程序,而react16会;3、react16中有事件池,react17去除了事件池。
本教程操作环境:windows7系统、react17.0.1版、dell g3电脑。
react17相对react16改进了一些:1、新的jsx转换
react 16原理
babel-loader会预编译jsx为react.createelement(...)
react 17原理
react 17中的 jsx 转换不会将 jsx 转换为 react.createelement,
而是自动从 react 的 package 中引入新的入口函数并调用。
另外此次升级不会改变 jsx 语法,旧的 jsx 转换也将继续工作。
总结
react 17支持新的jsx转换。我们还将对它支持到react 16.14.0,react 15.7.0和0.14.10。
需要注意的是,这是完全选择启用的,您也不必使用它。
之前的jsx转换的方式将继续存在,并且没有计划停止对其支持。
2、事件代理更改
在react 17中,将不再在后台的文档级别附加事件处理程序,不在document对象上绑定事件,改为绑定于每个react应用的rootnode节点,因为各个应用的rootnode肯定不同,所以这样可以使多个版本的react应用同时安全的存在于页面中,不会因为事件绑定系统起冲突。react应用之间也可以安全的进行嵌套。
import react from "react";import reactdom from "react-dom";import app from "./app";reactdom.render(<app />, rootnode);
总结
在react 16和更早的版本中,react将对大多数事件执行document.addeventlistener()。
react 17将在后调用rootnode.addeventlistener()。
3、事件池(event pooling)的改变
react 17去除了事件池(event pooling),不在需要e.persist(),现在可以直接在异步事件中(回掉或timeout等)拿到事件对象,操作更加直观,不会令人迷惑。e.persist()仍然可用,但是不会有任何效果。
function handlechange(e) { // v16中,在异步方法中是拿不到e的,需要事先执行e.persist() // e.persist(); settimeout(() => { console.log(e); }, 1000);}
4、异步执行
react 17将副作用清理函数(如果存在)改为异步执行,即在浏览器渲染完毕后执行。
useeffect(() => { return () => { // 会在浏览器渲染完毕后执行 }})
5、forwardref 和 memo组件的行为
react 17中forwardref 和 memo组件的行为会与常规函数组件和class组件保持一致。它们在返回undefined时会报错。
const button = forwardref(() => { // 这里忘记写return,所以返回了undefined // react17不会忽略检测它,会返回err <button />;});const button = memo(() => { // 这里忘记写return,所以返回了undefined // react17不会忽略检测它,会返回err <button />;});
推荐学习:《react视频教程》
以上就是react16和react17有什么区别的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product