react16新特性

前言

這里將列出react16所有新特性。我覺(jué)得重要的:
1馆截、render 支持返回?cái)?shù)組和字符串
2、新生命周期getDerivedStateFromProps,getSnapshotBeforeUpate
3框产、createPortal,modal傳送到任意位置
4错洁、新增指針事件
5秉宿、給函數(shù)式組件加memo,實(shí)現(xiàn)性能優(yōu)化
6屯碴、懶加載組件描睦,lazy, suspense
7、react hooks

1导而、render 支持返回?cái)?shù)組和字符串

class Example extends React.Component {
  render() {
    return [
      <div key="1">first element</div>,
      <div key="2">second element</div>,
    ];
  }
}

2忱叭、Error Boundary(錯(cuò)誤邊界)

<ErrorBoundary>
   <BuggyCounter />
</ErrorBoundary>

包裹在組件外,組件出錯(cuò)嗡载,可以拋出異常窑多,但是不會(huì)讓頁(yè)面白屏。


3洼滚、createPortal

ReactDOM.createPortal(
      // Any valid React child: JSX, strings, arrays, etc.
      this.props.children,
      // A DOM element
      this.el,
  )

傳送門(mén)埂息,通過(guò)createPortal生成的組件,可以任意定義你需要放的位置遥巴。比如彈框放在body上面千康,就可以document.body..appendChild(this.el)。


4铲掐、自定義屬性

ReactDOM.render(
  <h1 custom="hello">Hello, world!</h1>,
  document.getElementById("root")
);

custom就是自定義的屬性拾弃,以前的有白名單的,自定義就拋錯(cuò)摆霉。


5豪椿、優(yōu)化SSR

  • 生成更簡(jiǎn)潔的HTML
  • 寬松的客戶端一致性校驗(yàn)
  • 無(wú)需提前編譯
  • react 16服務(wù)端渲染速度更快
  • 支持流式渲染

6奔坟、Fiber:react對(duì)于對(duì)比更新的一種新算法,它影響著生命周期函數(shù)的變化跟異步渲染搭盾。學(xué)習(xí)地址


7咳秉、 Fragement:可以通過(guò)Fragement直接返回多個(gè)組件,好處是有時(shí)間我們不想用div鸯隅,但是不得不用導(dǎo)致嵌套過(guò)深。

render() {
 return (
    <>
      <ChildA />
      <ChildB />
    </>
  );
}

或者

render() {
  return (
    <Fragement>
      1
      <h2>2</h2>
    </Fragement>
  );
}

8炕舵、新的生命周期(新算法導(dǎo)致生命周期更改)
拋棄并兼容:componentWillMount, componentWillReceiveProps,componentWillUpdate

1徊件、getDerivedStateFromProps替換componentWillReceiveProps
2、getSnapshotBeforeUpate替代componentWillUpdate


9、新的context API:全局變量捎迫,不需要向之前一樣傳遞下去

const ThemeContext = React.createContext('light');

class App extends React.Component {
  render() {
 return (
      <ThemeContext.Provider value="dark">
        <Toolbar />
      </ThemeContext.Provider>
    );
  }
}

class Toolbar extends React.Component {
  static contextType = ThemeContext;
  render() {
   return <Button theme={this.context} />;
  }
}

10崔兴、createRef API:refs擴(kuò)展
react16之前:

<input type="text" ref={element => this.textInput = element} />

react16:

class MyComponent extends React.Component {
  constructor(props) {
 super(props);

 this.inputRef = React.createRef();
  }

  render() {
 return <input type="text" ref={this.inputRef} />;
  }

  componentDidMount() {
 this.inputRef.current.focus();
  }
}

11堰燎、forwardRef API: 父組件需要將自己的引用傳給子組件赊淑,自行研究吧,個(gè)人不喜歡用处渣。


12、strictMode component:嚴(yán)格模式用來(lái)幫助開(kāi)發(fā)者發(fā)現(xiàn)潛在問(wèn)題的工具

  • 識(shí)別出使用不安全生命周期的組件
  • 對(duì)使用string ref進(jìn)行告警
  • 對(duì)使用findDOMNode進(jìn)行告警
  • 探測(cè)某些產(chǎn)生副作用的方法
  • 對(duì)使用棄用context API進(jìn)行警告
function ExampleApplication() {
 return (
    <div>
      <Header />
      <React.StrictMode>
        <div>
          <ComponentOne />
          <ComponentTwo />
        </div>
      </React.StrictMode>
      <Footer />
    </div>
  );
}

13柑贞、新增指針事件(鼠標(biāo)有决,觸控筆书幕,或者手指觸摸)

  • onPointerDown
  • onPointerMove
  • onPointerEnter
  • onPointerLeave
  • onPointerOver
  • onPointerOut

14新荤、React Profiler:谷歌插件下載即可,可以檢測(cè)到組件渲染耗時(shí)台汇。


image.png

15苛骨、memo

import React, { memo } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function Demo(props) {
  console.log("render");
  return <div>{props.name}</div>;
}

const Demo1 = memo(function Demo(props) {
  console.log("render");
  return <div>{props.name}</div>;
});

class App extends React.Component {
  state = { count: 0 };
  handleClick = () => {
    this.setState({ count: 1 });
  };
  render() {
    return (
      <div className="App">
        <h1>Hello Memo</h1>
        <button onClick={this.handleClick}>
          This is Memo Demo{this.state.count}
        </button>
        <Demo1 name={"daisy"} />
      </div>
    );
  }
}

在你的函數(shù)前面加Memo就可以像PureComponent實(shí)現(xiàn)shouldComponentUpdate優(yōu)化渲染功能。


16苟呐、lazy智袭、suspense

<!--import B from "./B";-->

// 需要用到的時(shí)候才加載進(jìn)來(lái),當(dāng)然還有預(yù)加載更好
const B = lazy(() => import("./B"));

 <Suspense fallback={<div>Loading...</div>}>
    <TabPanel>
    <B />
    </TabPanel>
 </Suspense>

17掠抬、簡(jiǎn)化static contextType吼野,就是不需要包裹c(diǎn)onsumer,用this.context即可两波。這個(gè)文檔需要各位親好好查查瞳步,就是新版context的使用方式闷哆,redux的connect原理就是基于它而生。


18单起、static getDerivedStateFromError

class ErrorBoundary extends React.Component {
  state = { hasError: false };
  
  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    // 更新state所以下次render可以立刻顯示fallback UI
    return { hasError: true };
  }
  
  componentDidCatch(error, info) {
    // You can also log the error to an error reporting service
    logErrorToMyService(error, info);
  }
  
  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return <h1>Something went wrong.</h1>;
    }
    
    return this.props.children; 
  }

最牛逼的登場(chǎng)了1д!嘀倒!
19屈留、react hooks:建議好好研究下,我這邊只說(shuō)個(gè)大概测蘑。
之前class

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}

hooks

import React, { useState } from 'react';
    
    function Example() {
      // count表示預(yù)設(shè)置參數(shù)灌危;setCount表示方法,useState(0)設(shè)置初始值0
      const [count, setCount] = useState(0);
      const [ok, setOk] = useState("yes");

      return (
        <div>
          <p>You clicked {count} times</p>
          <button onClick={() => setCount(count + 1)}>
            Click me
          </button>
        </div>
      );
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碳胳,一起剝皮案震驚了整個(gè)濱河市勇蝙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挨约,老刑警劉巖味混,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诫惭,居然都是意外死亡翁锡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)夕土,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盗誊,“玉大人,你說(shuō)我怎么就攤上這事隘弊」猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵梨熙,是天一觀的道長(zhǎng)开镣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咽扇,這世上最難降的妖魔是什么邪财? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮质欲,結(jié)果婚禮上树埠,老公的妹妹穿的比我還像新娘。我一直安慰自己嘶伟,他們只是感情好怎憋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般绊袋。 火紅的嫁衣襯著肌膚如雪毕匀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天癌别,我揣著相機(jī)與錄音皂岔,去河邊找鬼。 笑死展姐,一個(gè)胖子當(dāng)著我的面吹牛躁垛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圾笨,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼教馆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了墅拭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涣狗,失蹤者是張志新(化名)和其女友劉穎谍婉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體镀钓,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穗熬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丁溅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唤蔗。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窟赏,靈堂內(nèi)的尸體忽然破棺而出妓柜,到底是詐尸還是另有隱情,我是刑警寧澤涯穷,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布棍掐,位于F島的核電站,受9級(jí)特大地震影響拷况,放射性物質(zhì)發(fā)生泄漏作煌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一赚瘦、第九天 我趴在偏房一處隱蔽的房頂上張望粟誓。 院中可真熱鬧,春花似錦起意、人聲如沸鹰服。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)获诈。三九已至仍源,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舔涎,已是汗流浹背笼踩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亡嫌,地道東北人嚎于。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挟冠,于是被迫代替她去往敵國(guó)和親于购。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前段時(shí)間React的16版本發(fā)布了知染,采用了MIT開(kāi)源許可證肋僧,新增了一些新的特性。 Error Boundary r...
    海龜大神閱讀 630評(píng)論 0 1
  • 多了一個(gè)錯(cuò)誤組件Error Boundaries控淡,需要加上生命周期 componentDidCatch 用來(lái)記...
    SpinachC閱讀 410評(píng)論 0 0
  • http://www.ruanyifeng.com/blog/2014/05/restful_api.htmlht...
    woow_wu7閱讀 3,403評(píng)論 0 3
  • 1嫌吠、React新特性介紹 React v16.0 render 支持返回?cái)?shù)組和字符串、Error Boundari...
    做最棒的閱讀 4,729評(píng)論 0 4
  • 你好我共鳴名模公民明明明明哦共鳴呢名民工你你公公民工你你你后悔民工
    我阿德閱讀 154評(píng)論 0 0