React v16.0 新功能介紹

Andy Tsai
ReactMaker
Published in
5 min readSep 17, 2017

React v16.0已經發佈了,詳細的更新內容附上官方連結,這篇文章主要針對兩個新功能進行介紹。

MIT License:

在爭議不斷的React license 事件後,從React v16.0開始,Facebook 決定要重新把 React 的 license 改回 MIT,這應該也是所有開發者開心的事情!

1. Returning array from render:

以往的render function必須要回傳只有一個root dom的element,否則會發生錯誤,如下面範例所示:

// 錯誤的renderrender() {   return (      <div>1</div>      <div>2</div>
)
}
// 正確的renderrender() { return ( <div> <div>1</div>
<div>2</div>
</div>
)
}

React v16.0 提供了returning array from render

// returning array from renderrender() {   return [      <div>1</div>,      <div>2</div>
]
}

2. Error handling:

先前的文章介紹過了React元件生命週期,還不清楚的朋友可以先看一下喔,這是React很重要的部分。

而React 16 beta則新增了一個生命週期『 componentDidCatch 』,用來抓取Component的錯誤,可以理解為Component 的 try / catch。

這裡要注意的是『 componentDidCatch 』是抓取子Component的錯誤,當本身Component發生錯誤的時候是不會進入的喔!

我們可以使用React的進階用法 『 Higher-Order Component 』來製作自己的 ErrorHandler 抓取Component的錯誤。

因為其特性只能抓取子Component的錯誤,因此將 ErrorHandler 放在最上層的Component使用,如此一來當Header或Content兩個Component發生錯誤的時候,就可以抓取到錯誤。

// Home.jsimport React, { Component } from 'react';import ErrorHandler from '../ErrorHandler';import Header from './components/Header.js';import Content from './components/Content.js';@ErrorHandlerexport default class Home extends Component {    render() {        return (            <div id="pageHome">               <Header />               <Content />            </div>        );     }}

Higher-Order Component 』:ErrorHandler程式碼如下:

// ErrorHandler.jsimport React, { Component } from 'react';import ErrorComponent from './ErrorComponent';export default (ComposedComponent) => {    class RefreshHandler extends Component {       state = {          isError: false,       }       // 抓取子Component錯誤       componentDidCatch(e) {          // 發生錯誤了          console.log(e);          this.setState({             isError: true,          });          // 此處可以呼叫api,將錯誤寫進資料庫       }       render() {
// ErrorComponent為自定義錯誤畫面Component
// ComposedComponent為Higher-Order Component包住的
Component,以本文章來說的話就是『 Home 』Component

// 當發生錯誤的時候顯示ErrorComponent,反之回傳
ComposedComponent
return ( this.state.isError ? <ErrorComponent /> : <ComposedComponent /> ); } } return RefreshHandler;};

自定義的錯誤畫面

// ErrorComponent.jsimport React, { Component } from 'react';export default class ErrorComponent extends Component {    render() {        return (           <div>              <p>發生錯誤!</p>              <p>請找工程師進行除錯。</p>           </div>        );    }}

總結:

React v16.0 提供了許多新功能,小編認為最實用的還是新增的生命週期: 『 componentDidCatch 』。

原先Component發生錯誤的時候畫面會變成一片空白,因為Component發生錯誤時就不會render畫面,這對於使用者體驗是非常糟糕的,但是現在可以顯示自定義錯誤畫面讓使用者知道發生錯誤!

而使用『 Higher-Order Component 』後就可以輕鬆的抓取子Component錯誤,不管是用在最上層的Component或者是個別Component都可以。

--

--