0

0

React 16 新特性有哪些?react16的新特性和功能的介绍

寻∝梦

寻∝梦

发布时间:2018-09-11 16:05:55

|

3314人浏览过

|

来源于php中文网

原创

本篇文章主要的介绍了关于react16的一些新特性,还有关于react16的详细功能介绍。下面就让我们一起来看这篇文章的正文内容吧

React 16更新

新js环境要求

react16依靠Map和Set集合和requestAnimationFrame(一个针对动画效果的API)

新功能

- Fragments:render函数可以返回数组和字符串
- error boundaries:错误处理
- portals :支持声明性地将子树渲染到另一个DOM节点
- custom DOM attributes :ReactDom允许传递非标准属性
- improved server-side rendering:提升服务端渲染性能
  1. Fragments

    render() {
      return [
        <li key="A"/>First item</li>,
        <li key="B"/>Second item</li>,
        <li key="C"/>Third item</li>,
      ];
    }

    详见API

  2. error boundaries

    之前,一旦某个组件发生错误,整个组件树将会从根节点被unmount下来。React 16修复了这一点,引入了Error Boundary的概念,中文译为“错误边界”,当某个组件发生错误时,我们可以通过Error Boundary捕获到错误并对错误做优雅处理,如使用Error Boundary提供的内容替代错误组件。Error Boundary可以看作是一种特殊的React组件,新增了componentDidCatch这个生命周期函数,它可以捕获自身及子树上的错误并对错误做优雅处理,包括上报错误日志、展示出错提示,而不是卸载整个组件树。(注:它并不能捕获runtime所有的错误,比如组件回调事件里的错误,可以把它想象成传统的try-catch语句)

    实践:

    抽象出检查错误边界公共组件:

    class ErrorBoundary extends React.Component{
        constructor(props){
            super(props);
            this.state=({
                ifError:false
            });
        }
    
        componentDidCatch(err, info) {
            this.setState({ ifError: true })
            console.log(err);
        }
    
        render(){
            if(this.state.ifError){
                return `this or its children has error`;
            }
            return this.props.children
        }
    }

    创建一个简单的包含错误的子组件:

    class ErrorComponent extends React.Component{
        render(){
            const str = '123';
            return str.toFixed(2);
        }
    }

    使用错误边界组件包裹可能出错的组件

    class MainShowComponent extends React.Component{
        render(){
            return (
                <p>
                    <ErrorBoundary>
                        <ErrorComponent/>
                    </ErrorBoundary>
                </p>
            )
        }
    }

    当被错误边界组件包裹的子组件中出现错误,会将错误组件替换为字符串:this or its children has error,而不会导致整体组件树被卸载。(想看更多就到PHP中文网React参考手册栏目中学习)

  3. Portals

    Portals提供了一种一流的方法来将子代呈现到父组件的DOM层次结构之外的DOM节点。

    ReactDOM.createPortal(
      child,
      container
    );

    第一个参数(child)是任何可渲染的React子元素,如元素,字符串或片段。第二个参数(container)是一个DOM元素。

    通常,当您从组件的render方法返回一个元素时,它将作为最近的父节点的子元素装载到DOM中:

    render() {
      // React mounts a new p and renders the children into it
      return (
        <p>
          {this.props.children}
        </p>
      );
    }

    但是,有时将子项插入到DOM中的其他位置会很有用:

    render() {
      // React does *not* create a new p. It renders the children into `pNode`.
      // `pNode` is any valid DOM node, regardless of its location in the DOM.
      return React.createPortal(
        this.props.children,
        pNode,
      );
    }

    有关Portals 和其事件冒泡详见官网和CodePen例子

  4. custom DOM attributes

    支持非标准的自定义DOM属性,在之前的版本中,React会忽略无法识别的HTML和SVG属性,自定义属性只能通过data-*形式添加,现在它会把这些属性直接传递给DOM,这个改动让React可以去掉属性白名单,从而减少了文件大小。但当DOM传递的自定义属性是函数类型或event handler类型时,也会被React忽略掉。

    <p a={()=>{}}></p>   //错误
  5. improved server-side rendering

    提升服务端渲染性能,React 16的SSR被完全重写,新的实现非常快,接近3倍性能于React 15,现在提供一种流模式streaming,可以更快地把渲染的字节发送到客户端。

打破改变

  • 调度和生命周期的改变

    • 调用setState返回null将不会更新render,这样可以让你在更新方法中自己决定是否更新。

      this.setState(
          (state)=>{
              if(state.curCount%2 === 0){
                  return {curCount:state.curCount+1}
              }else{
                  return null;
              }
      
          }
      )
    • 在render方法中调用setState总是会导致更新,之前版本不支持,但尽量不要在render中调用setState。

    • setState的回调函数会在componentDidMount/ componentDidUpdate 执行之后立即执行,而不是在所有组件渲染之后。

          this.setState(
              (state)=>{
                  if(state.curCount%2 === 0){
                      return {curCount:state.curCount+1}
                  }else{
                      return null;
                  }
      
              },
              ()=>{
                  console.log(this.state.curCount);
              }
          )
  1. ReactDOM.render()和ReactDom.unstable_renderIntoContainer()如果在生命周期函数中调用将会返回null。所以解决此类问题可以使用portals或者refs

  2. setState的改变:

    宠物商店
    宠物商店

    目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0是深入掌握ASP.NET 2.0技术的捷径。本节将引领读者逐步了解PetShop 4.0的方方面面,包括应用程序安装、功能和用户界面简介、解决方案和体系

    下载
  3. 当两个组件<a></a><b> >发生替换时,B.componentWillMount总是会在A.componentWillUnmount之前执行,而在之前,A.componentWillUnmount有可能会提前执行。</b>

  4. 之前版本,当改变一个组件的ref时,ref和dom会在组件的render方法被调用之前分离。现在,我们延迟了ref的改变,直到dom元素被改变了,ref才会和dom分离。

  5. 对于不使用React而是使用其他方法来重新渲染容器是不安全的。这在以前的版本中也许会生效,但是我们觉得不支持这样做。现在对于这种情况我们会发出一个警告,而且你需要使用ReactDOM.unmountComponentAtNode来清空你的节点树。

    ReactDOM.render(<App />, p);
    p.innerHTML = 'nope';
    ReactDOM.render(<App />, p);//渲染一些没有被正确清理的东西

    而你需要:

    ReactDOM.render(<App />, p);
    ReactDOM.unmountComponentAtNode(p);
    p.innerHTML = 'nope';
    ReactDOM.render(<App />, p); // Now it's okay

    查看此issue

  6. componentDidUpdate生命周期不再接受prevContext参数。

  7. 使用不唯一的key可能会导致子组件的复制或者遗失,使用不唯一的key并不支持,并且也从未支持,但之前这是一个硬性错误。

  8. Shallow renderer(浅层渲染)不再触发componentDidUpdate(),因为DOM的refs是不可用的。这也使得它与componentDidMount()之前版本中的调用一致。

  9. Shallow renderer不再支持unstable_batchedUpdates()。

  10. ReactDOM.unstable_batchedUpdates 现在回调之后只有一个额外的参数。

  • 单文件浏览器版本的名称和路径已经改变,以强调开发和生产版本之间的差异

    • react/dist/react.js → react/umd/react.development.js

    • react/dist/react.min.js → react/umd/react.production.min.js

    • react-dom/dist/react-dom.js → react-dom/umd/react-dom.development.js

    • react-dom/dist/react-dom.min.js → react-dom/umd/react-dom.production.min.js

  • 重写并改进服务器渲染器

    • 服务器渲染不再使用标记验证,而是尽力附加到现有的DOM,警告不一致。它也不再使用每个节点上的空白组件和数据反馈属性的注释。

    • 为服务器渲染容器现在有一个明确的API。使用ReactDOM.hydrate而不是ReactDOM.render如果你正在恢复服务器呈现的HTML。继续使用,ReactDOM.render如果你只是做客户端渲染。

  • 当未知的属性传递给DOM组件时,如果是有效的值,React会渲染进DOM。查看文档

  • 在render和生命周期函数中的错误默认会卸载整个DOM树,为了阻止这个,可以在UI的相应位置添加错误边界。

  • 弃用

    • 不再构建react-with-addons.js,所有兼容的插件都是在npm上单独发布的,如果你需要它们,可以使用单文件浏览器版本。

    • 在15.x版本中的弃用已经从核心包中删除,React.createClass现在可以作为 create-react-class,React.PropTypes可以作为prop-types,React.DOM 作为 react-dom-factories,react-addons-test-utils 作为 react-dom/test-utils使用, shallow renderer 作为 react-test-renderer/shallow使用。参阅15.5.0和15.6.0文档参考。

    本篇文章到这就结束了(想看更多就到PHP中文网React使用手册栏目中学习),有问题的可以在下方留言提问。

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    Go高并发任务调度与Goroutine池化实践
    Go高并发任务调度与Goroutine池化实践

    本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

    2

    2026.03.10

    Kotlin Android模块化架构与组件化开发实践
    Kotlin Android模块化架构与组件化开发实践

    本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

    24

    2026.03.09

    JavaScript浏览器渲染机制与前端性能优化实践
    JavaScript浏览器渲染机制与前端性能优化实践

    本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

    80

    2026.03.06

    Rust内存安全机制与所有权模型深度实践
    Rust内存安全机制与所有权模型深度实践

    本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

    187

    2026.03.05

    PHP高性能API设计与Laravel服务架构实践
    PHP高性能API设计与Laravel服务架构实践

    本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

    339

    2026.03.04

    AI安装教程大全
    AI安装教程大全

    2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

    116

    2026.03.04

    Swift iOS架构设计与MVVM模式实战
    Swift iOS架构设计与MVVM模式实战

    本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

    180

    2026.03.03

    C++高性能网络编程与Reactor模型实践
    C++高性能网络编程与Reactor模型实践

    本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

    31

    2026.03.03

    Golang 测试体系与代码质量保障:工程级可靠性建设
    Golang 测试体系与代码质量保障:工程级可靠性建设

    Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

    81

    2026.02.28

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    React 教程
    React 教程

    共58课时 | 5.9万人学习

    国外Web开发全栈课程全集
    国外Web开发全栈课程全集

    共12课时 | 1万人学习

    React核心原理新老生命周期精讲
    React核心原理新老生命周期精讲

    共12课时 | 1.1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号