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

2個奇怪的react寫法

 更新時間:2023年03月15日 15:09:35   作者:卡頌  
大家好,我卡頌。雖然React官網(wǎng)用大量篇幅介紹最佳實踐,但因JSX語法的靈活性,所以總是會出現(xiàn)奇奇怪怪的React寫法。本文介紹2種奇怪(但在某些場景下有意義)的React寫法。也歡迎大家在評論區(qū)討論你遇到過的奇怪寫法

ref的奇怪用法

這是一段初看讓人很困惑的代碼:

function App() {
  const [dom, setDOM] = useState(null);
 
  return <div ref={setDOM}></div>;
}

讓我們來分析下它的作用。

首先,ref有兩種形式(曾經(jīng)有3種):

  • 形如{current: T}的數(shù)據(jù)結(jié)構(gòu)
  • 回調(diào)函數(shù)形式,會在ref更新、銷毀時觸發(fā)

例子中的setDOMuseStatedispatch方法,也有兩種調(diào)用形式:

  • 直接傳遞更新后的值,比如setDOM(xxx)
  • 傳遞更新狀態(tài)的方法,比如setDOM(oldDOM => return /* 一些處理邏輯 */)

在例子中,雖然反常,但ref的第二種形式和dispatch的第二種形式確實是契合的。

也就是說,在例子中傳遞給refsetDOM方法,會在div對應(yīng)DOM更新、銷毀時執(zhí)行,那么dom狀態(tài)中保存的就是div對應(yīng)DOM的最新值。

這么做一定程度上實現(xiàn)了感知DOM的實時變化,這是單純使用ref無法具有的能力。

useMemo的奇怪用法

通常我們認(rèn)為useMemo用來緩存變量props,useCallback用來緩存函數(shù)props。

但在實際項目中,如果想通過緩存props的方式達(dá)到子組件性能優(yōu)化的目的,需要同時保證:

  • 所有傳給子組件的props的引用都不變(比如通過useMemo
  • 子組件使用React.memo

類似這樣:

function App({todos, tab}) {
    const visibleTodos = useMemo(
      () => filterTodos(todos, tab),
    [todos, tab]);
    
    return <Todo data={visibleTodos}/>;
}

// 為了達(dá)到Todo性能優(yōu)化的目的
const Todo = React.memo(({data}) => {
  // ...省略邏輯
})

既然useMemo可以緩存變量,為什么不直接緩存組件的返回值呢?類似這樣:

function App({todos, tab}) {
  const visibleTodos = useMemo(
      () => filterTodos(todos, tab),
  [todos, tab]);
  
  return useMemo(() => <Todo data={visibleTodos}/>, [visibleTodos])
}

function Todo({data}) {
  return <p>{data}</p>;
}

如此,需要性能優(yōu)化的子組件不再需要手動包裹React.memo,只有當(dāng)useMemo依賴變化后子組件才會重新render

總結(jié)

除了這兩種奇怪的寫法外,你還遇到哪些奇怪的React寫法呢?

相關(guān)文章

最新評論

鄂州市| 云南省| 通许县| 宁城县| 体育| 平顺县| 池州市| 林周县| 平顺县| 敦化市| 夏邑县| 余庆县| 丹寨县| 双流县| 屏山县| 凤冈县| 天门市| 漯河市| 大石桥市| 平顶山市| 金堂县| 驻马店市| 莱阳市| 庄河市| 陇西县| 揭西县| 商城县| 阳城县| 名山县| 海门市| 长白| 铜梁县| 泰安市| 西和县| 莆田市| 木里| 顺昌县| 靖远县| 仪陇县| 彭水| 靖西县|