首页 >web前端 >前端问答 >react16和react17有什么区别

react16和react17有什么区别

青灯夜游
青灯夜游原创
2021-11-25 14:31:007695浏览

区别:1、React16中JSX会转换为“React.createElement”,而react17不会;2、React17不再在后台的文档级别附加事件处理程序,而React16会;3、React16中有事件池,React17去除了事件池。

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有什么区别的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn