2018-10-29

React 16.6.0 新特性

16.6.0版本发布于10.23号,下面就来看看他们带来了什么新特性吧:

React.memo

Class组件可以通过继承PureComponent类,或者实现shouldComponentUpdate接口,达到对于不变的输入属性来说,不用多次渲染。现在对于函数式组件(function component)来说,可以使用React.memo方法达到同样的效果。

const MyComponent = React.memo(function MyComponent(props) {
  /* only rerenders if props change */
});

React.lazy

与Suspense结合使用可以达到代码分割的效果:

import React, {lazy, Suspense} from 'react';
const OtherComponent = lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <OtherComponent />
    </Suspense>
  );
}

Suspense组件支持fallback属性,当异步加载的组件未完成时,可以展示fallback的内容。

目前该功能还不支持服务器端渲染,将在稍晚的发布中添加

static contextType

提供了一个便捷的API,在class内部消费context值。
例如:

const MyContext = React.createContext();


class MyClass extends React.Component {
  static contextType = MyContext;
  componentDidMount() {
    let value = this.context;
    /* perform a side-effect at mount using the value of MyContext */
  }
  componentDidUpdate() {
    let value = this.context;
    /* ... */
  }
  componentWillUnmount() {
    let value = this.context;
    /* ... */
  }
  render() {
    let value = this.context;
    /* render something based on the value of MyContext */
  }
}

这个API是针对用户的反馈而增加的。

static getDerivedStateFromError()

React16版本增加了错误边界的特性,用于处理React渲染时抛出的错误。之前已经有componentDidCatch这个生命周期方法,当错误发生时就会被调用。这个方法很适合记录服务器端的错误,通过使用setState,发生错误时也可以给用户显示一个不一样的UI。
在方法调用前,我们为该组件渲染null。但是有时候渲染一个null会破坏它们的父组件,因为父组件不希望得到一个空的节点。另外在服务器端渲染时,不会调用Did类型的生命周期函数。
增加的getDerivedStateFromError 函数,可以在渲染完成前就被调用。

目前getDerivedStateFromError还不能作用于服务器端渲染

StrictMode组件中移除了一些函数

  1. ReactDOM.findDOMNode()
  2. 旧的Context API

安装方法

React v16.6.0 可以通过npm获取。
通过Yarn安装:

yarn add react@^16.6.0 react-dom@^16.6.0

通过npm安装:

npm install --save react@^16.6.0 react-dom@^16.6.0

另外还提供CDN的方式,该build是UMD格式的模块

<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>

附:完整的Changelog

React

  • Add React.memo() as an alternative to PureComponent for functions. (@acdlite in #13748)
  • Add React.lazy() for code splitting components. (@acdlite in #13885)
  • React.StrictMode now warns about legacy context API. (@bvaughn in #13760)
  • React.StrictMode now warns about findDOMNode. (@sebmarkbage in #13841)
  • Rename unstable_AsyncMode to unstable_ConcurrentMode. (@trueadm in #13732)
  • Rename unstable_Placeholder to Suspense, and delayMs to maxDuration. (@gaearon in #13799 and @sebmarkbage in #13922)

React DOM

  • Add contextType as a more ergonomic way to subscribe to context from a class. (@bvaughn in #13728)
  • Add getDerivedStateFromError lifecycle method for catching errors in a future asynchronous server-side renderer. (@bvaughn in #13746)
  • Warn when <Context> is used instead of <Context.Consumer>. (@trueadm in #13829)
  • Fix gray overlay on iOS Safari. (@philipp-spiess in #13778)
  • Fix a bug caused by overwriting window.event in development. (@sergei-startsev in #13697)

React DOM Server

  • Add support for React.memo(). (@alexmckenley in #13855)
  • Add support for contextType. (@alexmckenley and @sebmarkbage in #13889)

Scheduler (Experimental)

  • Rename the package to scheduler. (@gaearon in #13683)
  • Support priority levels, continuations, and wrapped callbacks. (@acdlite in #13720 and #13842)
  • Improve the fallback mechanism in non-DOM environments. (@acdlite in #13740)
  • Schedule requestAnimationFrame earlier. (@acdlite in #13785)
  • Fix the DOM detection to be more thorough. (@trueadm in #13731)
  • Fix bugs with interaction tracing. (@bvaughn in #13590)
  • Add the envify transform to the package. (@mridgway in #13766)

原文地址 React v16.6.0: lazy, memo and contextType – React Blog

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

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,332评论 0 10
  • 我和她都还活着,但青梅竹马,两小无猜的情愫似乎不曾有过了,又如从“坟”中升起一缕缕青烟随风而去…… 小时候...
    小小佘阅读 326评论 1 1
  • 办公室里养着五盆吊兰。 这花静静的,样子像草。据说也是开花的,但刚养上没几天,花开也不知在何时。 ...
    东语西言阅读 423评论 0 0
  • 没有完全独立的个体,每个人都是存在关系中,决定我们行为的不是我们的个性,而是我们所处的关系不同。
    王朋彦阅读 139评论 0 0
  • 云杪杪在微博上推荐了这本小说,讲的是一个穿越到小妾身上的女主,偷偷逃出夫家,到山上落草,最后成为山寨一姐的故事。 ...
    downton阅读 471评论 0 1