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

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

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

前言

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

解決 this 引起的問題

箭頭函數(shù)不會在函數(shù)體內重新定義 this 的值,這使得在回調中的行為更容易預測,并且避免了 this 在回調中潛存的 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ù)的調用方式有關

除非,你使用 箭頭函數(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 并不支持。但如果你已經意識到這一點,并且你還會代碼轉譯,這對你來說就不算什么問題

性能問題

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

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

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

當然,如果你不是想構建一個 性能超級無敵宇宙螺旋棒 的組件,渲染一個 非常長 的列表或 非常大 的表格,你也不會發(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ù),那么你在每次調用 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ù),當然,對于復雜些的組價來說,這會變的很笨拙

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

如下,你可以將 handleClick 重新定義為一個 arrow function method,來修復第一個 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" });
 };
}

總結

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

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

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

相關文章

  • React Native時間轉換格式工具類分享

    React Native時間轉換格式工具類分享

    這篇文章主要為大家分享了React Native時間轉換格式工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • nginx配置React靜態(tài)頁面的方法教程

    nginx配置React靜態(tài)頁面的方法教程

    作為一個前端開發(fā)時刻想著,怎么把自己寫的東西,丟到自己的服務器上面,然后展示給別人看。下面我就簡單直白的寫下,這篇文章主要給大家介紹了關于nginx配置React靜態(tài)頁面的方法教程,需要的朋友可以參考下。
    2017-11-11
  • React?如何向url中添加參數(shù)

    React?如何向url中添加參數(shù)

    這篇文章主要介紹了React?如何向url中添加參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 示例詳解react中useState的用法

    示例詳解react中useState的用法

    useState 通過在函數(shù)組件里調用它來給組件添加一些內部 state,React 會在重復渲染時保留這個 state,接下來通過一個示例來看看怎么使用 useState吧
    2021-06-06
  • React中使用async validator進行表單驗證的實例代碼

    React中使用async validator進行表單驗證的實例代碼

    react上進行表單驗證是很繁瑣的,在這里使用async-validator處理起來就變的很方便了,接下來通過本文給大家介紹React中使用async validator進行表單驗證的方法,需要的朋友可以參考下
    2018-08-08
  • React實現(xiàn)動效彈窗組件

    React實現(xiàn)動效彈窗組件

    最近在使用react開發(fā)項目,遇到這樣一個需求實現(xiàn)一個帶有動效的 React 彈窗組件,如果不考慮動效,很容易實現(xiàn),接下來小編通過本文給大家介紹React實現(xiàn)動效彈窗組件的實現(xiàn)代碼,一起看看吧
    2021-06-06
  • Ant Design中使用css切換的問題及解決

    Ant Design中使用css切換的問題及解決

    這篇文章主要介紹了Ant Design中使用css切換的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • webpack4+react多頁面架構的實現(xiàn)

    webpack4+react多頁面架構的實現(xiàn)

    webpack在單頁面打包上應用廣泛,以create-react-app為首的腳手架眾多。這篇文章主要介紹了webpack4+react多頁面架構的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 關于React中的聲明式渲染框架問題

    關于React中的聲明式渲染框架問題

    這篇文章主要介紹了React中的聲明式渲染框架,我們先討論了命令式和聲明式這兩種范式的差異,其中命令式更加關注過程,而聲明式更加關注結果,對React渲染框架知識感興趣的朋友跟隨小編一起看看吧
    2022-06-06
  • React Hooks之useRef獲取元素示例詳解

    React Hooks之useRef獲取元素示例詳解

    這篇文章主要介紹了React Hooks之useRef獲取元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論