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

React hooks的優(yōu)缺點詳解

 更新時間:2021年04月26日 08:26:27   作者:ranyonsue  
這篇文章主要介紹了React hooks的優(yōu)缺點詳解,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下

前言

Hook 是 React 16.8 的新增特性。它是完全可選的,并且100%向后兼容。它可以讓你使用函數(shù)組件的方式,運用類組件以及 react 其他的一些特性,比如管理狀態(tài)、生命周期鉤子等。從概念上講,React 組件一直更像是函數(shù)。而 Hook 則擁抱了函數(shù),同時也沒有犧牲 React 的精神原則。

優(yōu)點:

1、代碼可讀性更強,原本同一塊功能的代碼邏輯被拆分在了不同的生命周期函數(shù)中,容易使開發(fā)者不利于維護和迭代,通過 React Hooks 可以將功能代碼聚合,方便閱讀維護。例如,每個生命周期中常常會包含一些不相關(guān)的邏輯。一般我們都會在 componentDidMount 和 componentDidUpdate 中獲取數(shù)據(jù)。但是,同一個 componentDidMount 中可能也包含很多其它的邏輯,如設(shè)置事件監(jiān)聽,而之后需在 componentWillUnmount 中清除。相互關(guān)聯(lián)且需要對照修改的代碼被進行了拆分,而完全不相關(guān)的代碼卻在同一個方法中組合在一起。如此很容易產(chǎn)生 bug,并且導致邏輯不一致。
2、組件樹層級變淺。在原本的代碼中,我們經(jīng)常使用 HOC/render props 等方式來復(fù)用組件的狀態(tài),增強功能等,無疑增加了組件樹層數(shù)及渲染,在 React DevTools 中觀察過 React 應(yīng)用,你會發(fā)現(xiàn)由 providers,consumers,高階組件,render props 等其他抽象層組成的組件會形成“嵌套地獄”。而在 React Hooks 中,這些功能都可以通過強大的自定義的 Hooks 來實現(xiàn)。
3、不用再去考慮 this 的指向問題。在類組件中,你必須去理解 JavaScript 中 this 的工作方式。

缺點:

一、響應(yīng)式的useEffect

寫函數(shù)組件時,你不得不改變一些寫法習慣。你必須清楚代碼中useEffect和useCallback的“依賴項數(shù)組”的改變時機。有時候,你的useEffect依賴某個函數(shù)的不可變性,這個函數(shù)的不可變性又依賴于另一個函數(shù)的不可變性,這樣便形成了一條依賴鏈。一旦這條依賴鏈的某個節(jié)點意外地被改變了,你的useEffect就被意外地觸發(fā)了,如果你的useEffect是冪等的操作,可能帶來的是性能層次的問題,如果是非冪等,那就糟糕了。

所以,對比componentDidmount和componentDidUpdate,useEffect帶來的心智負擔更大。

二、狀態(tài)不同步

函數(shù)的運行是獨立的,每個函數(shù)都有一份獨立的作用域。函數(shù)的變量是保存在運行時的作用域里面,當我們有異步操作的時候,經(jīng)常會碰到異步回調(diào)的變量引用是之前的,也就是舊的(這里也可以理解成閉包)。比如下面的一個例子:

import React, { useState } from "react";
​
const Counter = () => {
  const [counter, setCounter] = useState(0);
​
  const onAlertButtonClick = () => {
    setTimeout(() => {
      alert("Value: " + counter);
    }, 3000);
  };
​
  return (
    <div>
      <p>You clicked {counter} times.</p>
      <button onClick={() => setCounter(counter + 1)}>Click me</button>
      <button onClick={onAlertButtonClick}>
        Show me the value in 3 seconds
      </button>
    </div>
  );
};
​
export default Counter;

當你點擊Show me the value in 3 seconds的后,緊接著點擊Click me使得counter的值從0變成1。三秒后,定時器觸發(fā),但alert出來的是0(舊值),但我們希望的結(jié)果是當前的狀態(tài)1。

這個問題在class component不會出現(xiàn),因為class component的屬性和方法都存放在一個instance上,調(diào)用方式是:this.state.xxx和this.method()。因為每次都是從一個不變的instance上進行取值,所以不存在引用是舊的問題。

其實解決這個hooks的問題也可以參照類的instance。用useRef返回的immutable RefObject(current屬性是可變的)來保存state,然后取值方式從counter變成了: counterRef.current。如下:

import React, { useState, useRef, useEffect } from "react";
​
const Counter = () => {
  const [counter, setCounter] = useState(0);
  const counterRef = useRef(counter);
​
  const onAlertButtonClick = () => {
    setTimeout(() => {
      alert("Value: " + counterRef.current);
    }, 3000);
  };
​
  useEffect(() => {
    counterRef.current = counter;
  });
​
  return (
    <div>
      <p>You clicked {counter} times.</p>
      <button onClick={() => setCounter(counter + 1)}>Click me</button>
      <button onClick={onAlertButtonClick}>
        Show me the value in 3 seconds
      </button>
    </div>
  );
};
​
export default Counter;

結(jié)果我們所期待,alert的是當前的值1。

怎么避免react hooks的常見問題

  • 不要在useEffect里面寫太多的依賴項,劃分這些依賴項成多個單一功能的useEffect。其實這點是遵循了軟件設(shè)計的“單一職責模式”。
  • 如果你碰到狀態(tài)不同步的問題,可以考慮下手動傳遞參數(shù)到函數(shù)。如:
   // showCount的count來自父級作用域 
   const [count,setCount] = useState(xxx); 
   function showCount(){ console.log(count) } 

   // showCount的count來自參數(shù) 
   const [count,setCount] = useState(xxx); 
   function showCount(c){ console.log(c) }

但這個也只能解決一部分問題,很多時候你不得不使用上述的useRef方案。

3. 重視eslint-plugin-react-hooks插件的警告。

4. 復(fù)雜業(yè)務(wù)的時候,使用Component代替hooks。

以上就是React hooks的優(yōu)缺點詳解的詳細內(nèi)容,更多關(guān)于React hooks的優(yōu)缺點的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于React+Redux的SSR實現(xiàn)方法

    基于React+Redux的SSR實現(xiàn)方法

    這篇文章主要介紹了基于React+Redux的SSR實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 解決React報錯The?tag?is?unrecognized?in?this?browser

    解決React報錯The?tag?is?unrecognized?in?this?browser

    這篇文章主要為大家介紹了解決React報錯The?tag?is?unrecognized?in?this?browser示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • React重新渲染超詳細講解

    React重新渲染超詳細講解

    什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你對這些問題還不是很明白,那么可以在這篇文章中找到答案
    2022-11-11
  • 淺談對于react-thunk中間件的簡單理解

    淺談對于react-thunk中間件的簡單理解

    這篇文章主要介紹了淺談對于react-thunk中間件的簡單理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • React學習之事件綁定的幾種方法對比

    React學習之事件綁定的幾種方法對比

    這篇文章主要給大家介紹了關(guān)于React學習之事件綁定的幾種方法對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • 使用Jenkins部署React項目的方法步驟

    使用Jenkins部署React項目的方法步驟

    這篇文章主要介紹了使用Jenkins部署React項目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • react反向代理使用http-proxy-middleware問題

    react反向代理使用http-proxy-middleware問題

    這篇文章主要介紹了react反向代理使用http-proxy-middleware問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • React 遞歸手寫流程圖展示樹形數(shù)據(jù)的操作方法

    React 遞歸手寫流程圖展示樹形數(shù)據(jù)的操作方法

    這篇文章主要介紹了React 遞歸手寫流程圖展示樹形數(shù)據(jù)的操作方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • React 組件中的state和setState()你知道多少

    React 組件中的state和setState()你知道多少

    這篇文章主要為大家詳細介紹了React組件中的state和setState(),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • react PropTypes校驗傳遞的值操作示例

    react PropTypes校驗傳遞的值操作示例

    這篇文章主要介紹了react PropTypes校驗傳遞的值操作,結(jié)合實例形式分析了react PropTypes針對傳遞的值進行校驗操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2020-04-04

最新評論