2個(gè)奇怪的react寫法
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ā)
例子中的setDOM是useState的dispatch方法,也有兩種調(diào)用形式:
- 直接傳遞更新后的值,比如
setDOM(xxx) - 傳遞更新狀態(tài)的方法,比如
setDOM(oldDOM => return /* 一些處理邏輯 */)
在例子中,雖然反常,但ref的第二種形式和dispatch的第二種形式確實(shí)是契合的。
也就是說(shuō),在例子中傳遞給ref的setDOM方法,會(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)緩存變量props,useCallback用來(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)文章
react-native 配置@符號(hào)絕對(duì)路徑配置和絕對(duì)路徑?jīng)]有提示的問題
本文主要介紹了react-native 配置@符號(hào)絕對(duì)路徑配置和絕對(duì)路徑?jīng)]有提示的問題,文中通過(guò)圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
React報(bào)錯(cuò)信息之Expected?an?assignment?or?function?call?and?
這篇文章主要介紹了React報(bào)錯(cuò)之Expected?an?assignment?or?function?call?and?instead?saw?an?expression,下面有兩個(gè)示例來(lái)展示錯(cuò)誤是如何產(chǎn)生的,需要的朋友可以參考下2022-08-08
react版模擬亞馬遜人機(jī)交互菜單的實(shí)現(xiàn)
本文主要介紹了react版模擬亞馬遜人機(jī)交互菜單的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
詳解React中傳入組件的props改變時(shí)更新組件的幾種實(shí)現(xiàn)方法
這篇文章主要介紹了詳解React中傳入組件的props改變時(shí)更新組件的幾種實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
React利用路由實(shí)現(xiàn)登錄界面的跳轉(zhuǎn)
這篇文章主要介紹了React利用路由實(shí)現(xiàn)登錄界面的跳轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
React?state結(jié)構(gòu)設(shè)計(jì)原則示例詳解
這篇文章主要為大家介紹了React?state結(jié)構(gòu)設(shè)計(jì)原則示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
React 進(jìn)入頁(yè)面后自動(dòng) focus 到某個(gè)輸入框的解決方案
React.js 當(dāng)中提供了 ref 屬性來(lái)幫助我們獲取已經(jīng)掛載的元素的 DOM 節(jié)點(diǎn),你可以給某個(gè) JSX 元素加上 ref屬性,這篇文章主要介紹了React 進(jìn)入頁(yè)面以后自動(dòng) focus 到某個(gè)輸入框,需要的朋友可以參考下2024-02-02

