react--react16的新特性

react16的新特性主要在以下四个方面:

  新的生命周期

  新的语法

  优化

  hook

新的生命周期

在react16中,不建议使用以下生命周期函数:

  componentWillMount()

  componentWillReceiveProps(nextProps, nextState)

  componentWillUpdate()

新增了以下生命周期函数:

  static getDerivedStateFromProps(nextProps, prevState)

  getSnapshotBeforeUpdate(prevProps, prevState)

  componentDidCatch(error, info)

static getDerivedStateFromProps(nextProps, prevState)

在组件实例内无法调用静态方法,静态方法中也无法通过this使用实例中的其他属性或方法。可以防止对组件实例的错误操作。

主要用来在组件实例后、接受到新的prop后,进行调用。此方法返回一个对象,这个对象会被更新到实例的state中;如果返回为空,则不会更新。

getSnapshotBeforeUpdate(prevProps, prevState)

在DOM更新前调用,返回值将被传给componentDidUpdate

componentDidCatch(error, info)

在之前,只要某个组件中出现错误,整个应用就会崩溃。通过此函数,在发生错误的组件的父组件中进行错误捕获。如果组件的父组件中未处理,则去父组件的父组件中进行查看是否有处理函数,层层递归。

新的语法

在之前,ref是通过在元素上指定ref值进行使用,并通过this.refs.xxx进行获取,在react16中,新增了以下两个定义方式:

// 第一种方式
constructor(){
   this.inputRef = React.createRef()
}

render(){
   return (
      <input ref={this.inputRef} />
   )
}

// 第二种方式
render(){
   return (
      <input ref={(ref) => {this.inputRef = ref}} />
   )
}

如果是需要层层传递的props,可以通过React.createContext避免嵌套。

性能方面的优化

fragment

react要求jsx元素是树结构,但每次需要在最外层包裹一个容器会造成浪费。react提供了fragment,让我们在实现元素列表时,无需增加额外节点

render(){
   return (
      <> // 也可以用<React.Fragments>
        <tr><td></td></tr>
        <tr><td></td></tr>
      </> //也可以用</React.Fragments>
   )
}

React.memo()

用来控制组件何时重新渲染。在之前,只要有更新就会引起该组件及其所有子组件重新渲染。使用memo就可以实现仅仅部分组件渲染。类似之前的pureComponent,但可以在函数组件中使用。

React.lazy & React.Suspens

实现React的Code Spliting对React代码进行拆包,有效的减少一次性加载太多代码的问题。

用法:

const IconDemo = lazy(() => import('./icon'));

<Suspense fallback={<div className="loading">Loading...</div>}>
    <Route path="/" component={Home} exact />
    <Route path="/icon" component={IconDemo} />
</Suspense> 

hook

实现了在函数组件中使用state,详解参考官网

posted @ 2020-10-26 15:30  ashen1999  阅读(348)  评论(0编辑  收藏  举报