• 技术文章 >web前端 >前端问答

    react16和react17有什么区别

    青灯夜游青灯夜游2021-11-25 14:31:00原创1108

    区别: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有什么区别的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:react
    上一篇:react遍历方法有哪些 下一篇:react是软件吗
    PHP编程就业班

    相关文章推荐

    • reactjs和vuejs的区别是什么• react和vuejs有什么区别• react跟javascript有什么区别• Vue3中 ref VS reactive,浅谈它们间有何区别?• vuejs和React是什么

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网