最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解React中何時使用箭頭函數(shù)

 更新時間:2017年08月23日 09:56:41   作者:楓上霧棋  
對于剛學(xué)前端的大家來說,對于React中的事件監(jiān)聽寫法有所疑問很正常,特別是React中箭頭函數(shù)使用這塊,下面這篇文章主要給大家深入的講解了關(guān)于React中何時使用箭頭函數(shù)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習學(xué)習吧。

前言

相信大家當想起箭頭函數(shù)時,腦海里可能會浮現(xiàn) 棒,酷,簡潔,有趣 等形容詞,其實,我們存在一些 更充分的理由 使我們在聯(lián)想起 箭頭函數(shù) 時不得不想到的,本文詳細的給大家介紹了關(guān)于React何時使用箭頭函數(shù)的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習,下面話不多說了,來一起看看詳細的介紹:

解決 this 引起的問題

箭頭函數(shù)不會在函數(shù)體內(nèi)重新定義 this 的值,這使得在回調(diào)中的行為更容易預(yù)測,并且避免了 this 在回調(diào)中潛存的 bug

下面我們來看一個 example

我們期望點擊按鈕,改變按鈕顏色,代碼如下

class BrokenButton extends React.Component {
 render() {
 return (
  <button onClick={this.handleClick} style={this.state}>
  Set background to red
  </button>
 );
 }

 handleClick() {
 this.setState({ backgroundColor: "red" });
 }
}

render(<BrokenButton />, document.getElementById("root"));

然而,當我們點擊按鈕時,什么效果都沒有,為什么會這樣呢

其實,不是 handleClick 方法沒有起作用,因為 JavaScript 中壓根沒有方法, JavaScript 中只有函數(shù),而函數(shù)中的 this 存在一些規(guī)則,正是這些規(guī)則,讓上面的 handleClick 中的 this 值變成了 null

你需要清楚明白的是: 你無法確定一個方法函數(shù)中 this 的指向,因為它的值跟函數(shù)的調(diào)用方式有關(guān)

除非,你使用 箭頭函數(shù),因為箭頭函數(shù)中 this 的值是繼承自 外圍作用域

class Button extends React.Component {
 render() {
 return (
  <button
  onClick={() => this.setState({ backgroundColor: "red" })}
  style={this.state}
  >
  Set background to red
  </button>
 );
 }
}

render(<Button />, document.getElementById("root"));

現(xiàn)在就對了,接下來,我們繼續(xù)

瀏覽器支持

瀏覽器對 箭頭函數(shù) 的支持大概是 73%,因為目前,IE 并不支持。但如果你已經(jīng)意識到這一點,并且你還會代碼轉(zhuǎn)譯,這對你來說就不算什么問題

性能問題

大家都發(fā)現(xiàn)了,箭頭函數(shù) 書寫起來是非常容易的,但書寫忒多的函數(shù),也會造成一些問題

定義函數(shù)是昂貴的

瀏覽器每執(zhí)行一次 =>,就需要創(chuàng)建一個 新的函數(shù)對象,這其實是一個比較 昂貴 的操作

當然,如果你不是想構(gòu)建一個 性能超級無敵宇宙螺旋棒 的組件,渲染一個 非常長 的列表或 非常大 的表格,你也不會發(fā)現(xiàn)這是一個 問題

所以,如果你的組件只是在頁面中渲染個幾次,你也 沒必要忒擔心 性能這方面的問題

兩個相同的箭頭函數(shù)并不相等

為了讓大家意識到這個問題,接下來,我們用 == 比較一下兩個相同的箭頭函數(shù)相不相等

const a = x => x,
  b = x => x;

render(
 <div>
 <h3>
  Are <code>a</code> and <code>b</code> equal by <code>==</code>?
 </h3>
 <p>
  {a == b ? "Yes!" : "No :("}
 </p>
 </div>,
 document.getElementById("root")
);

如果你在 render 中使用箭頭函數(shù),那么你在每次調(diào)用 render 時都會去創(chuàng)建一個新的函數(shù)對象,此時,即使使用 PureComponent 和 shouldComponentUpdate 也起不到優(yōu)化作用

你可以在下面實例中看清這一點,其中, <PropChangeCounter /> 組件用于打印 props 改變的次數(shù)

import PropChangeCounter from "react-armory-prop-change-counter";

class App extends React.Component {
 constructor(props) {
 super(props);
 this.state = { email: "" };
 }
 render() {
 return (
  <div>
  <input
   placeholder="Email"
   value={this.state.email}
   onChange={e => this.setState({ email: e.target.value })}
  />
  <PropChangeCounter
   constant={"this doesn't change"}
   value={this.state.email}
   onChange={e => this.setState({ email: e.target.value })}
  />
  </div>
 );
 }
}

render(<App />, document.getElementById("root"));

只定義一次

如果你覺得 性能 對你的組件很重要,那么你肯定會想如果在組件中只定義箭頭函數(shù) 一次 該有多好

其中一種實現(xiàn)方式是在 constructor 中使用箭頭函數(shù),當然,對于復(fù)雜些的組價來說,這會變的很笨拙

如果你使用了 Babel 或 create-react-app 構(gòu)建你的應(yīng)用,你可以將箭頭函數(shù)設(shè)置為 class fields 或 arrow function methods

如下,你可以將 handleClick 重新定義為一個 arrow function method,來修復(fù)第一個 example 中的 bug

class Button extends React.Component {
 render() {
 return (
  <button onClick={this.handleClick} style={this.state}>
  Set background to red
  </button>
 );
 }

 // Note: this syntax is not yet part of JavaScript proper, but is slated
 // for inclusion in the next version. It should already work with Babel.
 handleClick = () => {
 this.setState({ backgroundColor: "red" });
 };
}

總結(jié)

  • 如果 環(huán)境支持 箭頭函數(shù),那么鼓勵使用
  • 盡量避免對 React 組件 使用箭頭函數(shù),它會使 調(diào)試 變的困難
  • 如果有需要,可以在 render 中使用箭頭函數(shù)
  • 為 性能 著想,避免在 render 中使用大量函數(shù)

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

原文鏈接:When should I use Arrow Functions? (James K Nelson)

相關(guān)文章

  • windows下create-react-app 升級至3.3.1版本踩坑記

    windows下create-react-app 升級至3.3.1版本踩坑記

    這篇文章主要介紹了windows下create-react-app 升級至3.3.1版本踩坑記,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-02-02
  • React Redux使用配置詳解

    React Redux使用配置詳解

    react-redux是redux官方react綁定庫,能夠使react組件從redux store中讀取數(shù)據(jù),并且向store分發(fā)actions以此來更新數(shù)據(jù),這篇文章主要介紹了react-redux的設(shè)置,需要的朋友可以參考下
    2022-08-08
  • React實現(xiàn)父組件調(diào)用子組件的兩種寫法

    React實現(xiàn)父組件調(diào)用子組件的兩種寫法

    react通信分很多種,比如:父子通信,兄弟通信等等,這里我們就簡單說一下父子通信,父子通信分為:父組件調(diào)用子組件里面的方法;子組件調(diào)用子組件里面的方法,這里我們著重說一下父組件調(diào)用子組件,需要的朋友可以參考下
    2024-04-04
  • react以create-react-app為基礎(chǔ)創(chuàng)建項目

    react以create-react-app為基礎(chǔ)創(chuàng)建項目

    這篇文章主要介紹了react以create-react-app為基礎(chǔ)創(chuàng)建項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 詳解升級react-router 4 踩坑指南

    詳解升級react-router 4 踩坑指南

    本篇文章主要介紹了詳解升級react-router 4 踩坑指南,主要是對react-router 4升級的踩坑總結(jié),有興趣的可以了解一下
    2017-08-08
  • 詳解如何在react中搭建d3力導(dǎo)向圖

    詳解如何在react中搭建d3力導(dǎo)向圖

    本篇文章主要介紹了如何在react中搭建d3力導(dǎo)向圖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 在react中對less實現(xiàn)scoped配置方式

    在react中對less實現(xiàn)scoped配置方式

    這篇文章主要介紹了在react中對less實現(xiàn)scoped配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • antd中form表單的wrapperCol和labelCol問題詳解

    antd中form表單的wrapperCol和labelCol問題詳解

    最近學(xué)習中遇到了些問題,所以給大家總結(jié),下面這篇文章主要給大家介紹了關(guān)于antd中form表單的wrapperCol和labelCol問題的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • react實現(xiàn)導(dǎo)航欄二級聯(lián)動

    react實現(xiàn)導(dǎo)航欄二級聯(lián)動

    這篇文章主要為大家詳細介紹了react實現(xiàn)導(dǎo)航欄二級聯(lián)動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解react的兩種動態(tài)改變css樣式的方法

    詳解react的兩種動態(tài)改變css樣式的方法

    這篇文章主要介紹了詳解react的兩種動態(tài)改變css樣式的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-04-04

最新評論

托克逊县| 察隅县| 星子县| 恩施市| 成安县| 平度市| 北海市| 达孜县| 赤壁市| 廉江市| 揭东县| 阿坝县| 沙洋县| 普兰店市| 新建县| 乌拉特后旗| 绥阳县| 襄城县| 承德市| 四川省| 临城县| 克拉玛依市| 青浦区| 周口市| 沙雅县| 临安市| 乌兰县| 泰州市| 武汉市| 甘孜县| 丰原市| 汤阴县| 安龙县| 昭觉县| 开鲁县| 松江区| 沅江市| 泾川县| 四子王旗| 五峰| 容城县|