国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - React - React Hooks常用場景的使用(小結)

React Hooks常用場景的使用(小結)

2022-02-28 16:43我是你的超級英雄 React

這篇文章主要介紹了React Hooks常用場景的使用,根據使用場景分別進行舉例說明,幫助你認識理解并可以熟練運用 React Hooks 大部分特性,感興趣的可以了解一下

前言

React 在 v16.8 的版本中推出了 React Hooks 新特性。在我看來,使用 React Hooks 相比于從前的類組件有以下幾點好處:

  • 代碼可讀性更強,原本同一塊功能的代碼邏輯被拆分在了不同的生命周期函數中,容易使開發者不利于維護和迭代,通過 React Hooks 可以將功能代碼聚合,方便閱讀維護;
  • 組件樹層級變淺,在原本的代碼中,我們經常使用 HOC/render props 等方式來復用組件的狀態,增強功能等,無疑增加了組件樹層數及渲染,而在 React Hooks 中,這些功能都可以通過強大的自定義的 Hooks 來實現;

關于這方面的文章,我們根據使用場景分別進行舉例說明,幫助你認識理解并可以熟練運用 React Hooks 大部分特性。

博客 github地址為:https://github.com/fengshi123/blog

一、State Hook

1、基礎用法

?
1
2
3
4
5
6
7
8
9
10
11
function State(){
  const [count, setCount] = useState(0);
  return (
      <div>
          <p>You clicked {count} times</p>
          <button onClick={() => setCount(count + 1)}>
              Click me
          </button>
      </div>
  )
}

2、更新

更新分為以下兩種方式,即直接更新和函數式更新,其應用場景的區分點在于:

  • 直接更新不依賴于舊 state 的值;
  • 函數式更新依賴于舊 state 的值;
?
1
2
3
4
5
// 直接更新
setState(newCount);
 
// 函數式更新
setState(prevCount => prevCount - 1);

3、實現合并

與 class 組件中的 setState 方法不同,useState 不會自動合并更新對象,而是直接替換它。我們可以用函數式的 setState 結合展開運算符來達到合并更新對象的效果。

?
1
2
3
4
setState(prevState => {
  // 也可以使用 Object.assign
  return {...prevState, ...updatedValues};
});

4、惰性初始化 state

initialState 參數只會在組件的初始渲染中起作用,后續渲染時會被忽略。其應用場景在于:創建初始 state 很昂貴時,例如需要通過復雜計算獲得;那么則可以傳入一個函數,在函數中計算并返回初始的 state,此函數只在初始渲染時被調用:

?
1
2
3
4
const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props);
  return initialState;
});

5、一些重點

(1)不像 class 中的 this.setState ,Hook 更新 state 變量總是替換它而不是合并它;
(2)推薦使用多個 state 變量,而不是單個 state 變量,因為 state 的替換邏輯而不是合并邏輯,并且利于后續的相關 state 邏輯抽離;
(3)調用 State Hook 的更新函數并傳入當前的 state 時,React 將跳過子組件的渲染及 effect 的執行。(React 使用 Object.is 比較算法 來比較 state。)

二、Effect Hook

1、基礎用法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Effect(){
  const [count, setCount] = useState(0);
  useEffect(() => {
    console.log(`You clicked ${count} times`);
  });
 
  return (
      <div>
          <p>You clicked {count} times</p>
          <button onClick={() => setCount(count + 1)}>
              Click me
          </button>
      </div>
  )
}

2、清除操作

為防止內存泄漏,清除函數會在組件卸載前執行;如果組件多次渲染(通常如此),則在執行下一個 effect 之前,上一個 effect 就已被清除,即先執行上一個 effect 中 return 的函數,然后再執行本 effect 中非 return 的函數。

?
1
2
3
4
5
6
7
useEffect(() => {
  const subscription = props.source.subscribe();
  return () => {
    // 清除訂閱
    subscription.unsubscribe();
  };
});

3、執行時期

與 componentDidMount 或 componentDidUpdate 不同,使用 useEffect 調度的 effect 不會阻塞瀏覽器更新屏幕,這讓你的應用看起來響應更快;(componentDidMount 或 componentDidUpdate 會阻塞瀏覽器更新屏幕)

4、性能優化

默認情況下,React 會每次等待瀏覽器完成畫面渲染之后延遲調用 effect;但是如果某些特定值在兩次重渲染之間沒有發生變化,你可以通知 React 跳過對 effect 的調用,只要傳遞數組作為 useEffect 的第二個可選參數即可:如下所示,如果 count 值兩次渲染之間沒有發生變化,那么第二次渲染后就會跳過 effect 的調用;

?
1
2
3
useEffect(() => {
  document.title = `You clicked ${count} times`;
}, [count]); // 僅在 count 更改時更新

5、模擬 componentDidMount

如果想只運行一次的 effect(僅在組件掛載和卸載時執行),可以傳遞一個空數組([ ])作為第二個參數,如下所示,原理跟第 4 點性能優化講述的一樣;

?
1
2
3
useEffect(() => {
  .....
}, []);

6、最佳實踐

要記住 effect 外部的函數使用了哪些 props 和 state 很難,這也是為什么 通常你會想要在 effect 內部 去聲明它所需要的函數。

?
<fieldset id="waggi"></fieldset>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// bad,不推薦
function Example({ someProp }) {
  function doSomething() {
    console.log(someProp);
  }
 
  useEffect(() => {
    doSomething();
  }, []); //

延伸 · 閱讀

精彩推薦
  • ReactReact實現一個高度自適應的虛擬列表

    React實現一個高度自適應的虛擬列表

    這篇文章主要介紹了React如何實現一個高度自適應的虛擬列表,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下...

    抖音前端安全8922022-02-25
  • React詳解React中的不可變值

    詳解React中的不可變值

    這篇文章主要介紹了React中的不可變值的相關資料,幫助大家更好的理解和學習使用react.js,感興趣的朋友可以了解下...

    一個前端王10592022-02-27
  • React必須要會的50個React面試題

    必須要會的50個React面試題

    如果你是一位有抱負的前端程序員并準備面試,那么這篇文章很適合你。本文是你學習和面試 React 所需知識的完美指南。...

    瘋狂的技術宅9072022-02-23
  • React淺談react路由傳參的幾種方式

    淺談react路由傳參的幾種方式

    這篇文章主要介紹了淺談react路由傳參的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    glorydx4592022-02-20
  • React如何使用Redux Toolkit簡化Redux

    如何使用Redux Toolkit簡化Redux

    這篇文章主要介紹了如何使用Redux Toolkit簡化Redux,幫助大家更好的理解和學習使用React框架,感興趣的朋友可以了解下...

    杭州程序員張張8962022-02-24
  • Reactreact-native 實現購物車滑動刪除效果的示例代碼

    react-native 實現購物車滑動刪除效果的示例代碼

    這篇文章主要介紹了react-native 實現購物車滑動刪除效果的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    程序猿tx3892021-12-31
  • Reactreact獲取input輸入框的值的方法示例

    react獲取input輸入框的值的方法示例

    這篇文章主要介紹了react獲取input輸入框的值的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    Pinkh8102022-02-24
  • React詳解對于React結合Antd的Form組件實現登錄功能

    詳解對于React結合Antd的Form組件實現登錄功能

    這篇文章主要介紹了詳解對于React結合Antd的Form組件實現登錄功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    浮生離夢6582022-02-23
主站蜘蛛池模板: 99视频精品| 欧美大片免费高清观看 | 国产精品久久久久一区二区三区 | 久草视频网 | 久久久久久久久久久网站 | 成人免费视频网站在线观看 | 日韩免费在线观看视频 | 欧美亚洲综合久久 | 国产一区二区三区午夜 | 欧美黄色a视频 | 欧美激情视频一区二区三区 | 成人黄大片视频在线观看 | 日韩有码在线播放 | av电影在线播放 | 色天天综合网 | 一区二区三区亚洲 | 免费日本视频 | 午夜免费视频 | 在线播放国产一区二区三区 | 久久精品国产一区 | 午夜a级理论片915影院 | 一级欧美一级日韩 | 天天精品 | 激情网站免费观看 | 精品国产乱码久久久久久1区2区 | 久久99深爱久久99精品 | 亚洲精品免费视频 | 国产区在线 | 91精品久久久久久久久 | 精品国产一区二区三区小蝌蚪 | 欧洲成人在线 | 精品久久精品 | 日韩精品 | 秋霞av亚洲一区二区三 | 一区二区三区自拍 | 欧美专区在线观看 | 日韩在线小视频 | 久久精品中文字幕 | 97久久精品人人做人人爽50路 | 国产一区二区在线免费观看 | 免费在线观看毛片 |
<strike id="waggi"><menu id="waggi"></menu></strike><fieldset id="waggi"><menu id="waggi"></menu></fieldset>
<strike id="waggi"><menu id="waggi"></menu></strike><ul id="waggi"></ul>
    <cite id="waggi"><rt id="waggi"></rt></cite>
    • <strike id="waggi"><input id="waggi"></input></strike>