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

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

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

服務器之家 - 編程語言 - JavaScript - React - React useMemo和useCallback的使用場景

React useMemo和useCallback的使用場景

2022-02-25 16:27woking React

這篇文章主要介紹了React useMemo和useCallback的使用場景,幫助大家更好的理解和學習使用React框架,感興趣的朋友可以了解下

useMemo

我們知道當父組件發生重新渲染時,其所有(狀態、局部變量等)都是新的。一旦子組件依賴于父組件的某一個對象變量,那么無論對象是否發生變化,子組件拿到的都是新的對象,從而使子組件對應的 diff 失效,依舊會重新執行該部分邏輯。在下面的例子中,我們的副作用依賴項中包含了父組件傳入的對象參數,每次父組件發生更新時,都會觸發數據請求。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function Info({
  style,
}) {
  console.log('Info 發生渲染');
 
  useEffect(() => {
    console.log('重新加載數據'); // 每次發生重新渲染時,都會重新加載數據
  }, [style]);
 
  return (
    <p style={style}>
      這是 Info 里的文字
    </p>
  );
}
 
function Page() {
  console.log('Page 發生渲染');
 
  const [count, setCount] = useState(0);
  const style = { color: 'red' };
 
  // 計數器 +1 時,引發 Page 的重新渲染,進而引發 Info 的重新渲染
  return (
    <div>
      <h4>計數值為:{count}</h4>
      <button onClick={() => setCount(count + 1)}> +1 </button>
      <Info style={style} />
    </div>
  );
}

React Hooks 給我們提供了解決方案,useMemo 允許我們緩存傳入的對象,僅當依賴項發生變化時,才重新計算并更新相應的對象。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function Page() {
  console.log('Page 發生渲染');
 
  const [color] = useState('red');
  const [count, setCount] = useState(0);
  const style = useMemo(() => ({ color }), [color]); // 只有 color 發生實質性改變時,style 才會變化
 
  // 計數器 +1 時,引發 Page 的重新渲染,進而引發 Info 的重新渲染
  // 但是由于 style 緩存了,因此不會觸發 Info 內的數據重新加載
  return (
    <div>
      <h4>計數值為:{count}</h4>
      <button onClick={() => setCount(count + 1)}> +1 </button>
      <Info style={style} />
    </div>
  );
}

useCallback

React Hooks 在數據流上帶來的變化有兩點:一是支持更友好的使用 context 進行狀態管理,避免層級過多時向中間層承載無關參數;二是允許函數參與到數據流中,避免向下層組件傳入多余的參數。

useContext 作為 hooks 的核心模塊之一,可以獲取到傳入 context 的當前值,以此達到跨層通信的目的。React 官網有著詳細的介紹,需要關注的是一旦 context 值發生改變,所有使用了該 context 的組件都會重新渲染。為了避免無關的組件重繪,我們需要合理的構建 context ,比如從第一節提到的新思維模式出發,按狀態的相關度組織 context,將相關狀態存儲在同一個 context 中。

在過去,如果父子組件用到同一個數據請求方法 getData ,而該方法又依賴于上層傳入的 query 值時,通常需要將 query 和 getData 方法一起傳遞給子組件,子組件通過判斷 query 值來決定是否重新執行 getData。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Parent extends React.Component {
   state = {
    query: 'keyword',
  }
 
  getData() {
    const url = `https://mocks.alibaba-inc.com/mock/fO87jdfKqX/demo/queryData.json?query=${this.state.query}`;
    // 請求數據...
    console.log(`請求路徑為:${url}`);
  }
 
  render() {
    return (
      // 傳遞了一個子組件不渲染的 query 值
      <Child getData={this.getData} query={this.state.query} />
    );
  }
}
 
class Child extends React.Component {
  componentDidMount() {
    this.props.getData();
  }
 
  componentDidUpdate(prevProps) {
    // if (prevProps.getData !== this.props.getData) { // 該條件始終為 true
    //   this.props.getData();
    // }
    if (prevProps.query !== this.props.query) { // 只能借助 query 值來做判斷
      this.props.getData();
    }
  }
 
  render() {
    return (
      // ...
    );
  }
}

在 React Hooks 中 useCallback 支持我們緩存某一函數,當且僅當依賴項發生變化時,才更新該函數。這使得我們可以在子組件中配合 useEffect ,實現按需加載。通過 hooks 的配合,使得函數不再僅僅是一個方法,而是可以作為一個值參與到應用的數據流中。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function Parent() {
  const [count, setCount] = useState(0);
  const [query, setQuery] = useState('keyword');
 
  const getData = useCallback(() => {
    const url = `https://mocks.alibaba-inc.com/mock/fO87jdfKqX/demo/queryData.json?query=${query}`;
    // 請求數據...
    console.log(`請求路徑為:${url}`);
  }, [query]);  // 當且僅當 query 改變時 getData 才更新
 
  // 計數值的變化并不會引起 Child 重新請求數據
  return (
    <>
      <h4>計數值為:{count}</h4>
      <button onClick={() => setCount(count + 1)}> +1 </button>
      <input onChange={(e) => {setQuery(e.target.value)}} />
      <Child getData={getData} />
    </>
  );
}
 
function Child({
  getData
}) {
  useEffect(() => {
    getData();
  }, [getData]); // 函數可以作為依賴項參與到數據流中
 
  return (
    // ...
  );
}

以上就是React useMemo和useCallback的使用場景的詳細內容,更多關于React useMemo和useCallback的使用的資料請關注服務器之家其它相關文章!

原文鏈接:https://juejin.cn/post/6948605515068866590

延伸 · 閱讀

精彩推薦
  • React懶惰開發者需要知道 React Hack

    懶惰開發者需要知道 React Hack

    本篇從八個方面來介紹關于React Hack的一些用法,懶惰開發者的福音,快在你的代碼中試試這些小hack吧!...

    JavaScript之禪6622021-12-24
  • ReactReact ref的使用示例

    React ref的使用示例

    這篇文章主要介紹了React ref的使用詳解,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下...

    陳小瓦8702022-02-25
  • ReactReactRouter的實現方法

    ReactRouter的實現方法

    這篇文章主要介紹了ReactRouter的實現,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    WindrunnerMax6172022-01-06
  • React一文幫你理解PReact10.5.13源碼

    一文幫你理解PReact10.5.13源碼

    這篇文章主要介紹了一文幫你理解PReact10.5.13源碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    我的小樹林5422022-02-22
  • ReactReact.cloneElement的使用詳解

    React.cloneElement的使用詳解

    因為要接手維護一些項目,團隊的技術棧最近從 vue 轉向 react ,作為一個 react 新手,加上一向喜歡通過源碼來學習新的東西,就選擇了通過閱讀 antd 這個大...

    fullstackbb11182022-02-23
  • React淺談react路由傳參的幾種方式

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

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

    glorydx4572022-02-20
  • React從框架作者角度聊:React調度算法的迭代過程

    從框架作者角度聊:React調度算法的迭代過程

    React內部最難理解的地方就是「調度算法」,不僅抽象、復雜,還重構了一次。可以說,只有React團隊自己才能完全理解這套算法。既然這樣,那本文嘗試從...

    魔術師卡頌8172022-01-10
  • React基于 Vite 的組件文檔編寫神器,又快又省心

    基于 Vite 的組件文檔編寫神器,又快又省心

    現在 Vite 的生態逐漸完善,今天給大家介紹一款 React 的組件/應用文檔編寫神器:vite-plugin-react-pages....

    前端星辰5052022-01-04
主站蜘蛛池模板: 欧美另类专区 | 亚洲成人免费观看 | 欧美日韩在线电影 | 视频一区二区国产 | 日韩高清在线一区 | 亚洲国产精品免费在线观看 | 久久久www成人免费无遮挡大片 | 伊人五月| 欧美视频精品 | 一级黄色毛片 | 亚洲高清视频在线 | 久久人人爽爽爽人久久久 | 日韩av免费在线观看 | 久久久在线 | 中文字幕三区 | 亚洲精品一区二区三区四区高清 | 激情免费视频 | 久久99精品久久久久久国产越南 | 亚洲国产精品一区二区三区 | 日韩免费在线视频 | 亚洲欧美日韩精品久久亚洲区 | 欧美在线观看视频一区二区 | 久久mm | 亚洲欧美在线观看视频 | 一区二区日韩精品 | 国产精品一二三 | 亚洲三级网站 | 一区二区中文字幕 | 精品一区欧美 | 日本中文字幕一区 | 国产伦精品一区二区三区四区视频_ | 视频一区二区三区在线观看 | 激情视频在线观看 | 日韩欧美国产一区二区三区 | www.久久久.com | 久久久午夜爽爽一区二区三区三州 | 精品免费视频 | 在线观看一区二区精品 | 亚洲精品无码专区在线播放 | 欧美午夜精品一区二区三区电影 | 亚洲免费中文 |