React16.6发布,一大波新功带你看未来的React开发方式

栏目: 服务器 · 发布时间: 6年前

内容简介:就在今天(2018-10-29),React官方发布了最让人期待的功能肯定就是做过

就在今天(2018-10-29),React官方发布了 16.6 版本,开放了一堆新的功能,而这其中的一些新功能,代表这未来的React开发方式,让我们来一起窥探未来吧。

lazy

最让人期待的功能肯定就是 lazy 功能了,配合发布了一个 Suspense 组件,也就是最开始命名为 Placeholder 的组件,用来配合 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 (
      <>
        <ProviderComp />
        <ConsumerComp />  // show default value
      </>
    );
  }
}
复制代码

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

static getDerivedStateFromError()

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

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

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

StrictMode下的新提醒

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

也代表着这两个下个大版本肯定会被移除。所以兄弟们还不赶紧更新!

我是Jocky,一个专注于React技巧和深度分析的前端工程师,React绝对是一个越深入学习,越能让你觉得他的设计精巧,思想超前的框架。关注我获取最新的React动态,以及最深度的React学习。 更多的文章看这里


以上所述就是小编给大家介绍的《React16.6发布,一大波新功带你看未来的React开发方式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字乌托邦

数字乌托邦

[美]弗雷德·特纳 / 张行舟、王芳、叶富华、余倩 / 译言·东西文库/电子工业出版社 / 2013-5-1 / 49.80元

20世纪60年代早期,在美国大众眼中,计算机只是冷战中冰冷的机器,然而到了90年代互联网到来之时,计算机却呈现出一个截然不同的世界——它们模拟出了一个数字乌托邦般的协同体,而这正是曾经最反对冷战的嬉皮士们的共同愿景。 本书正是探索这次非同寻常,且颇具讽刺意味的变革的第一本书。作者挖掘出那些在旧金山湾区的先驱者——斯图尔特·布兰德和他的“全球网络”鲜为人知的故事。1968年到1998年期间,通......一起来看看 《数字乌托邦》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具