React 16版本后的新特性

ErrorBoundary (v16.0)

React v16 之前,如果渲染中出现错误,整个页面会直接崩掉。如果对 React 足够了解,可能会知道一个秘而不宣的API:unstable_handleError。此函数可用于捕获页面错误,然而由于文档没记录,知道的开发者也寥寥无几。现在我们有了新的、官方的、稳定的 API:componentDidCatch。就像try catch一样,可用于捕获render过程中的错误,常用于捕获错误并渲染不同的页面,避免整个页面崩溃。

Portal (v16.0)

API为ReactDOM.createPortal。可以简单的理解为“传送门”,即可以直接渲染在父组件以外的任意 DOM 节点,常用于弹出框、提示框等,并且支持事件冒泡,行为完全与子组件一致。demo 代码在src/Portal下。注意此方法并不能随心所欲调用,只有在组件的 render 方法调用,并作为合法element的代替返回。

Note: 新的 API 挂载在 react-dom 下,并不是 React 包内。

import React from 'react'

import { createPortal } from 'react-dom'

class Dialog extends React.Component {

    render() {  return createPortal((      <div></div>        ), document.querySelector('#dialog'))

    }

}

即使整个应用都在div#app下,createPortal 依然能在之外的div#poral下渲染 Element。

Fragment(v16.0) & StrictMode(v16.3)

这两个静态组件均挂载在 React 包下,通过React.Fragment和React.StrictMode可访问到。

Fragment静态组件,v16.0 推出,用于将多个 React render 返回值包裹成一个具有顶级元素的element。之前如果我们需要返回多个元素,一定要在外面包一层<div></div>或其他的元素,React 还会将其渲染成真实 DOM;或直接返回一个相应的数组(React v16.0支持),但是非常丑陋,并且必须附带key属性,即使用不到。

现在新的 Fragment 仅用于包裹,并不会生成对应 DOM 了,就像普通的jsx一样,也不需要key属性了,还是非常不错的新功能。官方文档:Fragments

StrictMode 于 v16.3 推出。顾名思义,即严格模式,可用于在开发环境下提醒组件内使用不推荐写法和即将废弃的 API(该版本废弃了三个生命周期钩子)。与 Fragment 相同,并不会被渲染成真实 DOM。官方文档严格模式里详细介绍了会在哪些情况下发出警告。对于我们开发者来说,及时弃用不被推荐的写法即可规避这些警告。

Fragment 和 StrictMode 代码示例在src/NewComponent下:

import React, {Fragment, StrictMode} from 'react'

const FragmentItem = props => new Array(5).fill(null).map((k, i) => (

    <Fragment key={i}>

        <p>这是第{i}项</p>

        <p>{i} * {i} = {i * i}</p>

    </Fragment>

))

class OldLifecycleProvider extends React.Component {

    // 以下三个函数在 React v16.3 已不被推荐,未来的版本会废弃。

    componentWillMount() {

        console.log('componentWillMount')

    }

    componentWillUpdate() {

        console.log('componentWillUpdate')

    }

    componentWillReceiveProps() {

        console.log('componentWillReceiveProps')

    }

    render() {

        return (

            <FragmentItem></FragmentItem>

        )

    }

}

export default class NewComponent extends React.Component {

    state = {

        propFlag: 2

    }

    // 使 OldLifecycleProvider 进入 componentWillReceiveProps 函数

    componentDidMount() {

        this.setState({

            propFlag: 1

        })

    }

    render() {

        return (

            <StrictMode>

                <OldLifecycleProvider propFlag={this.state.propFlag}></OldLifecycleProvider>

            </StrictMode>

        )

    }

}

复制代码渲染层级为:NewComponent -> OldLifecycleProvider -> FragmentItem,可以看到在 React dev tool下依然可以看到多层结构(Fragment并没有显示,比较遗憾,希望 dev tool 新版本能修复这个问题),但渲染出的 DOM 层级还是扁平的,直接挂载在 div.view 下。

另外,由于故意在 StrictMode 下使用了三个即将废弃的API,打开 console ,可看到如下错误提醒:

Note: 项目可直接使用StrictMode,不必检测是否为开发环境,因为只在开发环境起作用。

如果非常注重项目代码未来的可升级性,甚至可以在最顶层用 StrictMode 包裹。但其实除此之外,如果项目稳定,开启此模式对开发人员没有一点好处,甚至还有额外的迁移工作,因此不建议在已开始项目使用;但对代码重构有非常大的好处,可随时提醒开发人员即将废弃的 API 以便迁移。相信在 React 生态中会与 JS 的 'use strict' 一样应用越来越广泛。

作者:fengkk

链接:https://juejin.im/post/5ad949e36fb9a07aa92544e4

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

推荐阅读更多精彩内容