react16和react17有什么区别

区别: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有什么区别的详细内容,更多请关注美工之家9502669.com其它相关文章!