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

React useMemo和useCallback的使用場景

 更新時間:2021年04月09日 08:57:57   作者:woking  
這篇文章主要介紹了React useMemo和useCallback的使用場景,幫助大家更好的理解和學(xué)習(xí)使用React框架,感興趣的朋友可以了解下

useMemo

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

function Info({
  style,
}) {
  console.log('Info 發(fā)生渲染');

  useEffect(() => {
    console.log('重新加載數(shù)據(jù)'); // 每次發(fā)生重新渲染時,都會重新加載數(shù)據(jù)
  }, [style]);

  return (
    <p style={style}>
      這是 Info 里的文字
    </p>
  );
}

function Page() {
  console.log('Page 發(fā)生渲染');

  const [count, setCount] = useState(0);
  const style = { color: 'red' };

  // 計(jì)數(shù)器 +1 時,引發(fā) Page 的重新渲染,進(jìn)而引發(fā) Info 的重新渲染
  return (
    <div>
      <h4>計(jì)數(shù)值為:{count}</h4>
      <button onClick={() => setCount(count + 1)}> +1 </button>
      <Info style={style} />
    </div>
  );
}

React Hooks 給我們提供了解決方案,useMemo 允許我們緩存?zhèn)魅氲膶ο螅瑑H當(dāng)依賴項(xiàng)發(fā)生變化時,才重新計(jì)算并更新相應(yīng)的對象。

function Page() {
  console.log('Page 發(fā)生渲染');

  const [color] = useState('red');
  const [count, setCount] = useState(0);
  const style = useMemo(() => ({ color }), [color]); // 只有 color 發(fā)生實(shí)質(zhì)性改變時,style 才會變化

  // 計(jì)數(shù)器 +1 時,引發(fā) Page 的重新渲染,進(jìn)而引發(fā) Info 的重新渲染
  // 但是由于 style 緩存了,因此不會觸發(fā) Info 內(nèi)的數(shù)據(jù)重新加載
  return (
    <div>
      <h4>計(jì)數(shù)值為:{count}</h4>
      <button onClick={() => setCount(count + 1)}> +1 </button>
      <Info style={style} />
    </div>
  );
}

useCallback

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

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

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

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}`;
    // 請求數(shù)據(jù)...
    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 支持我們緩存某一函數(shù),當(dāng)且僅當(dāng)依賴項(xiàng)發(fā)生變化時,才更新該函數(shù)。這使得我們可以在子組件中配合 useEffect ,實(shí)現(xiàn)按需加載。通過 hooks 的配合,使得函數(shù)不再僅僅是一個方法,而是可以作為一個值參與到應(yīng)用的數(shù)據(jù)流中。

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}`;
    // 請求數(shù)據(jù)...
    console.log(`請求路徑為:${url}`);
  }, [query]);  // 當(dāng)且僅當(dāng) query 改變時 getData 才更新

  // 計(jì)數(shù)值的變化并不會引起 Child 重新請求數(shù)據(jù)
  return (
    <>
      <h4>計(jì)數(shù)值為:{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]); // 函數(shù)可以作為依賴項(xiàng)參與到數(shù)據(jù)流中

  return (
    // ...
  );
}

以上就是React useMemo和useCallback的使用場景的詳細(xì)內(nèi)容,更多關(guān)于React useMemo和useCallback的使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何使用React構(gòu)建一個擲骰子的小游戲

    如何使用React構(gòu)建一個擲骰子的小游戲

    這篇文章主要介紹了如何使用React構(gòu)建一個擲骰子的小游戲,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • React?antd中setFieldsValu的簡便使用示例代碼

    React?antd中setFieldsValu的簡便使用示例代碼

    form.setFieldsValue是antd?Form組件中的一個方法,用于動態(tài)設(shè)置表單字段的值,它接受一個對象作為參數(shù),對象的鍵是表單字段的名稱,值是要設(shè)置的字段值,這篇文章主要介紹了React?antd中setFieldsValu的簡便使用,需要的朋友可以參考下
    2023-08-08
  • React Hook 'useEffect' is called in function報(bào)錯解決

    React Hook 'useEffect' is call

    這篇文章主要為大家介紹了React Hook 'useEffect' is called in function報(bào)錯解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React Native按鈕Touchable系列組件使用教程示例

    React Native按鈕Touchable系列組件使用教程示例

    這篇文章主要為大家介紹了React Native按鈕Touchable系列組件使用教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux

    詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux

    這篇文章主要介紹了詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • JavaScript中React 面向組件編程(下)

    JavaScript中React 面向組件編程(下)

    在React面向組件編程中,除了上一章節(jié)的組件實(shí)例的三大核心屬性以外,還有很多重要的內(nèi)容比如:React 的生命周期,受控組件與非受控組件,高階函數(shù)和函數(shù)柯里化的理解等,在本文中會給大家繼續(xù)講解React 面向組件編程中剩余的內(nèi)容
    2023-03-03
  • React?SSR?中的限流案例詳解

    React?SSR?中的限流案例詳解

    這篇文章主要介紹了React?SSR?之限流,React SSR 畢竟涉及到了服務(wù)端,有很多服務(wù)端特有的問題需要考慮,而限流就是其中之一,本文會通過一個簡單的案例來說明,為什么服務(wù)端需要進(jìn)行限流,需要的朋友可以參考下
    2022-07-07
  • react使用antd表單賦值,用于修改彈框的操作

    react使用antd表單賦值,用于修改彈框的操作

    這篇文章主要介紹了react使用antd表單賦值,用于修改彈框的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 解決React報(bào)錯`value` prop on `input` should not be null

    解決React報(bào)錯`value` prop on `input` should&

    這篇文章主要為大家介紹了React報(bào)錯`value` prop on `input` should not be null解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React中classnames庫使用示例

    React中classnames庫使用示例

    這篇文章主要為大家介紹了React中classnames庫使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評論

岑巩县| 安陆市| 句容市| 法库县| 鄂伦春自治旗| 济源市| 天柱县| 卓资县| 调兵山市| 黄平县| 吉首市| 仪陇县| 曲阳县| 兴宁市| 南宁市| 陆丰市| 龙南县| 云和县| 建瓯市| 嘉祥县| 丰宁| 海安县| 花莲市| 孝感市| 彝良县| 绥棱县| 攀枝花市| 天门市| 高雄市| 安远县| 饶平县| 南木林县| 张家港市| 西青区| 互助| 淄博市| 旬邑县| 茌平县| 金川县| 横山县| 响水县|