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

2個(gè)奇怪的react寫法

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

ref的奇怪用法

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

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

讓我們來(lái)分析下它的作用。

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

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

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

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

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

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

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

useMemo的奇怪用法

通常我們認(rèn)為useMemo用來(lái)緩存變量propsuseCallback用來(lái)緩存函數(shù)props

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

  • 所有傳給子組件的props的引用都不變(比如通過(guò)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)化的子組件不再需要手動(dòng)包裹React.memo,只有當(dāng)useMemo依賴變化后子組件才會(huì)重新render。

總結(jié)

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

相關(guān)文章

最新評(píng)論

华蓥市| 买车| 株洲县| 望江县| 寿光市| 禄劝| 鹤峰县| 光山县| 泰州市| 隆德县| 连云港市| 九江县| 常州市| 乌鲁木齐县| 凭祥市| 通城县| 恭城| 泗阳县| 谷城县| 谢通门县| 平武县| 松滋市| 吴忠市| 灌南县| 万宁市| 公安县| 博白县| 浏阳市| 三河市| 和政县| 汾西县| 贵港市| 溧水县| 三门县| 奇台县| 游戏| 方城县| 山丹县| 高陵县| 古浪县| 赤水市|