欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

十分鐘帶你快速了解React16新特性

 更新時(shí)間:2017年11月10日 11:36:02   作者:弧度里的微笑  
這篇文章主要介紹了十分鐘帶你快速了解React16新特性,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前段時(shí)間React的16版本發(fā)布了,采用了MIT開(kāi)源許可證,新增了一些新的特性。

  1. Error Boundary
  2. render方法新增返回類(lèi)型
  3. Portals
  4. 支持自定義DOM屬性
  5. setState傳入null時(shí)不會(huì)再觸發(fā)更新
  6. 更好的服務(wù)器端渲染
  7. 新的打包策略
  8. ...

1. 使用Error Boundary處理錯(cuò)誤組件

之前,一旦某個(gè)組件發(fā)生錯(cuò)誤,整個(gè)組件樹(shù)將會(huì)從根節(jié)點(diǎn)被unmount下來(lái)。React 16修復(fù)了這一點(diǎn),引入了Error Boundary的概念,中文譯為“錯(cuò)誤邊界”,當(dāng)某個(gè)組件發(fā)生錯(cuò)誤時(shí),我們可以通過(guò)Error Boundary捕獲到錯(cuò)誤并對(duì)錯(cuò)誤做優(yōu)雅處理,如使用Error Boundary提供的內(nèi)容替代錯(cuò)誤組件。Error Boundary可以看作是一種特殊的React組件,新增了componentDidCatch這個(gè)生命周期函數(shù),它可以捕獲自身及子樹(shù)上的錯(cuò)誤并對(duì)錯(cuò)誤做優(yōu)雅處理,包括上報(bào)錯(cuò)誤日志、展示出錯(cuò)提示,而不是卸載整個(gè)組件樹(shù)。(注:它并不能捕獲runtime所有的錯(cuò)誤,比如組件回調(diào)事件里的錯(cuò)誤,可以把它想象成傳統(tǒng)的try-catch語(yǔ)句)

//最佳實(shí)踐:將ErrorBoundary抽象為一個(gè)公用的組件類(lèi)

import React, { Component } from 'react'

export default class ErrorBoundary extends Component {
  constructor(props) {
    super(props)
    this.state = { hasError: false }
  }
  componentDidCatch(err, info) {
    this.setState({ hasError: true })
    //sendErrorReport(err,info)
  }
  render(){
    if(this.state.hasError){
      return <div>Something went wrong!</div>
    }
    return this.props.children
  }
}

我們可以在容易出錯(cuò)的組件外使用ErrorBoundary將它包裹起來(lái),如下

//使用方式
render(){
  return (
    <div>
      <ErrorBoundary>
        <Profile user={this.state.user} />
      </ErrorBoundary>
      <button onClick={this.onClick}>Update</button>
    </div>
  )
}

如果Profile組件發(fā)生錯(cuò)誤,將會(huì)使用ErrorBoundary提供的<div>Something went wrong</div>代替它,而不會(huì)引起整個(gè)組件樹(shù)的卸載。

2. render方法新增返回類(lèi)型

在React 16中,render方法支持直接返回string,number,boolean,null,portal,以及fragments(帶有key屬性的數(shù)組),這可以在一定程度上減少頁(yè)面的DOM層級(jí)。

//string
render(){
  return 'hello,world'
}

//number
render(){
  return 12345
}

//boolean
render(){
  return isTrue?true:false
}

//null
render(){
  return null
}

//fragments,未加key標(biāo)識(shí)符,控制臺(tái)會(huì)出現(xiàn)warning
render(){
  return [
    <div>hello</div>,
    <span>world</span>,
    <p>oh</p>
  ]
}

以上各種類(lèi)型現(xiàn)在均可以直接在render中返回,不需要再在外層包裹一層容器元素,不過(guò)在返回的數(shù)組類(lèi)型中,需要在每個(gè)元素上加一個(gè)唯一且不變的key值,否則控制臺(tái)會(huì)報(bào)一個(gè)warning。

3.使用createPortal將組件渲染到當(dāng)前組件樹(shù)之外

Portals機(jī)制提供了一種最直接的方式可以把一個(gè)子組件渲染到父組件渲染的DOM樹(shù)之外。默認(rèn)情況下,React組件樹(shù)和DOM樹(shù)是完全對(duì)應(yīng)的,因此對(duì)于一些Modal,Overlay之類(lèi)的組件,通常是將它們放在頂層,但邏輯上它們可能只是屬于某個(gè)子組件,不利于組件的代碼組織。通過(guò)使用createPortal,我們可以將組件渲染到我們想要的任意DOM節(jié)點(diǎn)中,但該組件依然處在React的父組件之內(nèi)。帶來(lái)的一個(gè)特性就是,在子組件產(chǎn)生的event依然可以被React父組件捕獲,但在DOM結(jié)構(gòu)中,它卻不是你的父組件。對(duì)于組件組織,代碼切割來(lái)說(shuō),這是一個(gè)很好的屬性。

//實(shí)現(xiàn)一個(gè)簡(jiǎn)易蒙層效果,抽象出一個(gè)通用的Overlay組件
import React, { Component } from 'react';
import ReactDOM from 'react-dom';

export default class Overlay extends Component {
  constructor(props) {
    super(props);
    this.container = document.createElement('div');
    document.body.appendChild(this.container);
  }
  componentWillUnmount() {
    document.body.removeChild(this.container);
  }
  render() {
    return ReactDOM.createPortal(
      <div className='overlay'>
        <span className='overlay-close' onClick={this.props.onClose}>&times;</span>
        {this.props.children}
      </div>,
      this.container
    )
  }
}
//該組件對(duì)應(yīng)的樣式如下
.overlay{
  box-sizing:border-box;
  position: fixed;
  top:50%;
  left:50%;
  width:260px;
  height:200px;
  margin-left:-130px;
  margin-top:-100px;
  padding:10px;
  background-color: #fff;
  outline: rgba(0,0,0,.5) solid 9999px;
}
.overlay-close{
  position: absolute;
  top:10px;
  right:10px;
  color:red;
  cursor: pointer;
}

使用方式如下:

class App extends Component {
 constructor(props) {
  super(props);
  this.state = {
   overlayActive: false
  }
  this.closeOverlay = this.closeOverlay.bind(this);
  this.showOverlay = this.showOverlay.bind(this);
 }
 closeOverlay() {
  this.setState({ overlayActive: false })
 }
 showOverlay() {
  this.setState({ overlayActive: true })
 }
 render() {
  return (
   <div className="App">
    <div>hello world!</div>
    {this.state.overlayActive &&
     <Overlay onClose={this.closeOverlay}>overlay content</Overlay>}
    <button onClick={this.showOverlay}>show</button>
   </div>
  );
 }
}

效果如圖:


4.支持自定義DOM屬性

在之前的版本中,React會(huì)忽略無(wú)法識(shí)別的HTML和SVG屬性,自定義屬性只能通過(guò)data-*形式添加,現(xiàn)在它會(huì)把這些屬性直接傳遞給DOM(這個(gè)改動(dòng)讓React可以去掉屬性白名單,從而減少了文件大?。?,不過(guò)有些寫(xiě)法仍然是無(wú)效的。如DOM傳遞的自定義屬性是函數(shù)類(lèi)型或event handler時(shí),依然會(huì)被React忽略。

//錯(cuò)誤寫(xiě)法
render(){
  return(
    <div a={()=>{}} onclick={this.showOverlay}></div>
  )
)
//Warning: Invalid event handler property `onclick`. Did you mean `onClick`?
//Warning: Invalid value for prop `a` on <div> tag. Either remove it from the element, or pass a string or number value to keep it in the DOM.

現(xiàn)在class和tabindex等屬性可以被傳遞給DOM,但依然會(huì)報(bào)一個(gè)Warning,建議使用標(biāo)準(zhǔn)的駝峰式className,tabIndex等。

5.setState傳入null時(shí)不會(huì)再觸發(fā)更新

比如在一個(gè)選擇城市的函數(shù)中,當(dāng)點(diǎn)擊某個(gè)城市時(shí),newValue的值可能發(fā)生改變,也可能是點(diǎn)擊了原來(lái)的城市,值沒(méi)有變化,返回null則可以直接避免觸發(fā)更新,不會(huì)引起重復(fù)渲染,不需要在shouldComponentUpdate函數(shù)里面去判斷。

selectCity(e){
  const newValue = e.target.value;
  this.setState((state)=>{
    if(state.city===newValue){
      return null;
    }
    return {city:newValue}
  })
)

注意:現(xiàn)在setState回調(diào)(第二個(gè)參數(shù))會(huì)在componentDidMount/componentDidUpdate后立即觸發(fā),而不是等到所有組件渲染完成之后。

6.更好的服務(wù)器端渲染

React 16的SSR被完全重寫(xiě),新的實(shí)現(xiàn)非???,接近3倍性能于React 15,現(xiàn)在提供一種流模式streaming,可以更快地把渲染的字節(jié)發(fā)送到客戶(hù)端。另外,React 16在hydrating(注:指在客戶(hù)端基于服務(wù)器返回的HTML再次重新渲染)方面也表現(xiàn)的更好,React 16不再要求客戶(hù)端的初始渲染完全和服務(wù)器返回的渲染結(jié)果一致,而是盡量重用已經(jīng)存在的DOM元素。不會(huì)再有checksum(標(biāo)記驗(yàn)證)!并對(duì)不一致發(fā)出警告。一般來(lái)說(shuō),在服務(wù)器和客戶(hù)端渲染不同的內(nèi)容是不建議的,但這樣做在某些情況下也是有用的(比如,生成timestamp)。

7.新的打包策略

新的打包策略中去掉了process.env檢查。

React 16的體積比上個(gè)版本減小了32%(30% post-gzip),文件尺寸的減小一部分要?dú)w功于打包方法的改變。

react is 5.3 kb (2.2 kb gzipped), down from 20.7 kb (6.9 kb gzipped).
react-dom is 103.7 kb (32.6 kb gzipped), down from 141 kb (42.9 kb gzipped).
react + react-dom is 109 kb (34.8 kb gzipped), down from 161.7 kb (49.8 kb gzipped).

寫(xiě)在最后,React 16采用了新的核心架構(gòu)React Fiber。官方解釋是“React Fiber是對(duì)核心算法的一次重新實(shí)現(xiàn)”,后續(xù)再深入學(xué)習(xí)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • react-router-dom 嵌套路由的實(shí)現(xiàn)

    react-router-dom 嵌套路由的實(shí)現(xiàn)

    這篇文章主要介紹了react-router-dom 嵌套路由的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • React函數(shù)式組件Hook中的useEffect函數(shù)的詳細(xì)解析

    React函數(shù)式組件Hook中的useEffect函數(shù)的詳細(xì)解析

    useEffect是react v16.8新引入的特性。我們可以把useEffect hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三個(gè)函數(shù)的組合
    2022-10-10
  • React?Native采用Hermes熱更新打包方案詳解

    React?Native采用Hermes熱更新打包方案詳解

    這篇文章主要介紹了React?Native采用Hermes熱更新打包實(shí)戰(zhàn),在傳統(tǒng)的熱更新方案中,我們實(shí)現(xiàn)熱更新需要借助code-push開(kāi)源方案,包括熱更新包的發(fā)布兩種方式詳解,感興趣的朋友一起看看吧
    2022-05-05
  • React中傳遞組件的三種方式小結(jié)

    React中傳遞組件的三種方式小結(jié)

    通過(guò)傳遞組件,我們可以將復(fù)雜組件內(nèi)部的一部分 UI 交由外部組件來(lái)控制渲染,這也是控制反轉(zhuǎn)(Inversion of Control)的一種體現(xiàn),在 React 中,我們可以通過(guò)三種方式來(lái)傳遞組件,本文就來(lái)給大家述說(shuō)這三種方式,需要的朋友可以參考下
    2023-07-07
  • 使用React?Hooks模擬生命周期的實(shí)現(xiàn)方法

    使用React?Hooks模擬生命周期的實(shí)現(xiàn)方法

    這篇文章主要介紹了使用React?Hooks模擬生命周期,本文舉例說(shuō)明如何使用 hooks 來(lái)模擬比較常見(jiàn)的 class 組件生命周期,需要的朋友可以參考下
    2023-02-02
  • 詳解React中共享組件邏輯的三種方式

    詳解React中共享組件邏輯的三種方式

    這篇文章主要介紹了詳解React中共享組件邏輯的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 解決React報(bào)錯(cuò)No duplicate props allowed

    解決React報(bào)錯(cuò)No duplicate props allowed

    這篇文章主要為大家介紹了React報(bào)錯(cuò)No duplicate props allowed解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React Native設(shè)備信息查看調(diào)試詳解

    React Native設(shè)備信息查看調(diào)試詳解

    這篇文章主要為大家介紹了React Native設(shè)備信息查看調(diào)試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解Redux的工作流程

    詳解Redux的工作流程

    這篇文章主要介紹了Redux的工作流程,redux是一個(gè)專(zhuān)門(mén)用于做狀態(tài)管理的JS庫(kù),它可以在react、angular、vue等項(xiàng)目中,但基本與react配合使用,需要的朋友可以參考下
    2022-08-08
  • react導(dǎo)出excel文件的四種方式

    react導(dǎo)出excel文件的四種方式

    本文主要介紹了react導(dǎo)出excel文件的四種方式,主要包括原生js導(dǎo)出,使用?js-export-excel,使用xlsx導(dǎo)出, 使用react-html-table-to-excel,感興趣的可以了解一下
    2023-11-11

最新評(píng)論