React 16.6.X版本的更新功能

React发布了16.6版本,在此版本中带来了一些非常有用的新特性。主要的新特性包括:

React.lazy()

React.memo()

static contextType()

static getDerivedStateFromError()

StrictMode下的新提醒

下面一起来看看吧

lazy

新版本的更新让人期待的功能之一肯定就是lazy功能啦,搭配发布了一个Suspense组件,用来配合render方法内部的异步操作的,让我们先来看一下lazy的用法

import React, { lazy, Suspense } from 'react';
const OtherComponent = lazy(() => import('./OtherComponent'));
function MyComponent() {
    return (
        <Suspense fallback={<div>Loading...</div>}>
            <OtherComponent />
        </Suspense>
    );
}

做过code-splitting的同学能闻到熟悉的味道。以前我们要用第三方包或者自己处理异步过程,现在,React原生支持啦,而且你可以把异步的过程直接扔到render方法里面,就跟写普通组件一样,而且可以方便得通过Suspense组件来提供fallback

然而这并不仅仅Suspense的唯一用处,事实上这次React正式开放Suspense组件代表着所有异步的操作都可以在render方法里面做了,其实我很意外,我以为正式开放肯定要等到17版本

那么异步操作还能做啥?如果同学们看过年初Dan在冰岛的分享,应该就知道,Suspense能够让我们加载数据的操作变得异常简单。没看过的同学可以看这里,现在npm上也有一个包提供数据加载的功能了,simple-cache-provider,但是现在还不要在正式环境使用他哦。

关于这部分如何实现的,我会在之后的源码分析上详细讲解,有兴趣的同学可以关注我。

React.memo

ClassComponent可以通过继承类PureComponent或者实现shouldComponentUpdate来主动判断组件是否需要重新渲染,以此来提高性能,但是FunctionalComponent到目前为止没有类似的功能。

所以今天React发布了React.memo方法,来实现类似PureComponent的功能,即浅比较props是否有变化,如果没有变化,就不重新渲染当前组件

const FunctionalComponent = React.memo((props) => {  
    // only render if props change 
})

static contextType

在React16.3中提供了我们一个标准的用于替代老的context的API,也就是React.createContext,然后通过context.Providercontext.Consumer来传递值,这种方式消除了老的context API性能低下的问题,这个问题我在之前也有详细分析,感兴趣的同学可以看这里,而且老的API代码量很多,所以下个大版本React会移除老的API。

但是在让生态插件升级到新的API的过程中,有人提出在ClassComponent中用新的API很麻烦(???没感觉啊),所以React提供了一种在ClassComponent中使用新API的方法

import React, { Component } from 'react';
const context = React.createContext('defaultValue')
const ProviderComp = ({ children }) => (
    <context.Provider value="provider">
        {children}
    </context.Provider>
)
class ConsumerComp extends Component {
    static contextType = context
    componentDidMount() {
        console.log(this.context)
    }
    render() {
        return (
            <p>{this.context}</p>)
    }
}
class App extends Component {
    render() {
        return (
            <ProviderComp>
                <ConsumerComp />
            </ProviderComp>);
    }
}

通过声明static contextType = context,让ClassComponent可以订阅最近的一个context provider注意这里contextType是固定声明,换成别的名字都不行。如果ConsumerComp不在Provider的子树中,那么会使用defaultValue

class App extends Component {
    render() {
        return (
            <div>
                <ProviderComp />
                <ConsumerComp />
            // show default value      
            </div>
        );
    }
}

这也是为了提高React的整体性能,移除老旧API做努力。

static getDerivedStateFromError()

在发布Error Boundaries的时候,React提供了一个新的生命周期方法componentDidCatch,在捕获到错误的时候会触发,你可以在里面修改state以显示错误提醒的UI,或者将错误信息发送给服务端进行log用于后期分析。但是这里有个问题,就是在捕获到错误的瞬间,React会在这次渲染周期中将这个组件渲染为null,这就有可能导致他的父组件设置他上面的ref获得null而导致一些问题,所以现在提供了这个方法。

这个方法跟getDerivedStateFromProps类似,唯一的区别是他只有在出现错误的时候才触发,他相对于componentDidCatch的优势是在当前的渲染周期中就可以修改state,以在当前渲染就可以出现错误的UI,而不需要一个null的中间态。

而这个方法的出现,也意味着以后出现错误的时候,修改state应该放在这里去做,而后续收集错误信息之类的放到componentDidCatch里面。

StrictMode下的新提醒

StrictMode是用来提醒开发者用了即将被废弃的API的,像componentWillMount这些声明周期都会提醒,这次新加了两个API的提醒,ReactDOM.findDOMNode(),和老的context api

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359

推荐阅读更多精彩内容

  • 本文将开始详细分析如何搭建一个React应用架构。 一. 前言 现在已经有很多脚手架工具,如create-reac...
    字节跳动技术团队阅读 4,346评论 1 23
  • 自React v16.5首次发布以来不到2个月,React团队的优秀人员已经向我们赠送了第101版的React。这...
    张义飞阅读 490评论 0 3
  • React 16.6.0 新特性 16.6.0版本发布于10.23号,下面就来看看他们带来了什么新特性吧: Rea...
    frozenRabbit阅读 213评论 0 0
  • 夸口说一句,在读书那件事上,我就是那个所谓的别人家的孩子。 实在记不得是什么原因,小学一年级第一学期期末考试,我在...
    lihongbin阅读 413评论 7 4
  • 291976-陈国艳《2017-11-24》 [连续第286天总结] A目标完成情况。 听ppt课完成0% 亲子阅...
    科研女神经阅读 134评论 0 0