国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊 React 18 對 Hooks 的影響

開發 前端
在 ahooks 中的 useUnmountedRef、useSafeState等都是為了解決這個警告而生的。同時我們在 ahooks 中必要的地方,為了避免這個告警,也會在組件卸載后,忽略后續的 setState。

一、 譯者前言

最近 React 18 發布后,部分改動對我們使用 React Hooks 有一些影響。這篇文章對官方的文檔 Update to remove the "setState on unmounted component warning"[1] 做了翻譯,好讓大家清晰的認識到這個改動的背景和影響。這是 React 18 對 Hooks 的影響系列第一篇,后面我還會整理其它有影響的改動。

二、 翻譯

1、 背景

之前在已經卸載的組件中調用 setState時,會有一個警告,本次我們將這個警告移除了。警告內容如下:

Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function。

警告:不能在已經卸載的組件中更改 state。這是一個無用的操作,它表明你的項目中存在內存泄漏。要解決這個問題,請在 useEffect 清理函數中取消所有訂閱和異步任務。

不幸的是,這個警告經常被誤解,并且會誤導大家。

它原本是想保證如下示例能正常工作的:

useEffect(() => {
function handleChange() {
setState(store.getState())
}
store.subscribe(handleChange)
return () => store.unsubscribe(handleChange)
}, [])

在這個例子中,如果你忘記了在 effect 清理函數中調用 unsubscribe,那肯定是有內存泄漏的。

2、 為什么說這個警告會誤導大家呢?

事實上,上面的場景并不常見。反而如下場景是更常見的:

async function handleSubmit() {
setPending(true)
await post('/someapi') // component might unmount while we're waiting
setPending(false)
}

在上面的代碼中,如果發送請求時,組件卸載了,會拋出警告。但是,在這種場景下,警告誤導了大家。

這里其實沒有內存泄漏:

  • Promise 會很快完成執行,然后內存被垃圾回收機制回收。
  • 即使沒有很快完成執行,這個警告也是沒用的,因為垃圾回收也還是得等 Promise 執行完回收,你啥也不能做。

一般,我們會通過如下代碼來消除警告:

let isMountedRef = useRef(false)
useEffect(() => {
isMountedRef.current = true
return () => {
isMountedRef.current = false
}
}, [])
async function handleSubmit() {
setPending(true)
await post('/someapi')
if (!isMountedRef.current) {
setPending(false)
}
}

實際上,這種寫法是沒用的,并沒有解決所謂的“內存泄漏”,它僅僅只是抑制了警告。正如前面說的,這里其實是沒有內存泄漏的。內存會隨著 Promise 執行完而釋放,并沒有什么在無限執行。

3、 上述抑制警告方案比不處理更糟糕

上述抑制警告的解決方案,現在非常非常普遍。但它其實沒任何好處,反而比不處理更糟糕:

  • 未來,React 會提供一個新能力,在組件卸載不可見時,我們會保存組件現在的 state,但仍會卸載組件。下次加載組件的時候,我們會用之前保存的 state 來渲染組件,以便恢復之前的頁面。在組件卸載之后,setPending(false)不會被執行到,所以 pending會一直是 true,那下次恢復組件的時候,看起來是請求沒有執行完成,會變的更糟糕。(譯者注:關于這一塊詳細的行為和影響面,下一篇文章介紹)。
  • 假設用戶點擊一個按鈕,發起一個網絡請求,請求結束后更新 state。為了避免這個警告,有些人會將請求行為放到 useEffect 中,因為在 useEffect 中可以監聽到組件卸載,以忽略后續的 state 更新,消除警告。這樣代碼變的非常不清晰,非常糟糕!就是因為這個錯誤的警告,會讓大家寫出更爛的代碼。

4、 移除警告

最終,我們決定移除這個警告。這個警告想解決的訂閱問題,在日常代碼中并不常見。大部分情況下,它反而會誤導大家,為了避免告警寫出更爛的代碼。希望這個警告的移除,可以讓你移除代碼中的 isMounted。

三、 譯者總結

在 ahooks 中的 useUnmountedRef[2]、useSafeState[3] 等都是為了解決這個警告而生的。同時我們在 ahooks 中必要的地方,為了避免這個告警,也會在組件卸載后,忽略后續的 setState。

目前來看,這些代碼是多余的,后續 ahooks 會陸續優化相關場景,但不會太快。因為在 react 16、17 中這個告警仍然會有,會對新人造成不必要的困擾。我們會等 React 18 覆蓋面比較廣之后,再進行代碼優化。

以后在代碼中大家應該不需要再考慮這個告警了,不需要再使用 useUnmountedRef[4]、useSafeState[5] 等 Hooks 了。

參考資料

[1]Update to remove the setState on unmounted component warning: https://github.com/reactwg/react-18/discussions/82。

[2]useUnmountedRef: https://ahooks.js.org/hooks/use-unmounted-ref。

[3]useSafeState: https://ahooks.js.org/hooks/use-safe-state。

[4]useUnmountedRef: https://ahooks.js.org/hooks/use-unmounted-ref。

[5]useSafeState: https://ahooks.js.org/hooks/use-safe-state。

責任編輯:姜華 來源: 前端技術磚家
相關推薦

2021-05-11 08:48:23

React Hooks前端

2019-08-20 15:16:26

Reacthooks前端

2023-11-06 08:00:00

ReactJavaScript開發

2024-09-23 14:52:49

2020-10-28 09:12:48

React架構Hooks

2021-03-18 08:00:55

組件Hooks React

2020-09-19 17:46:20

React Hooks開發函數

2022-08-21 09:41:42

ReactVue3前端

2019-03-13 10:10:26

React組件前端

2022-04-16 20:10:00

React Hookfiber框架

2022-04-14 11:50:39

函數組件hook

2023-05-08 07:52:29

JSXReactHooks

2022-02-10 19:15:18

React監聽系統模式

2022-07-18 09:01:58

React函數組件Hooks

2022-03-16 22:24:50

ReactstateHooks

2020-08-10 06:31:01

React Hooks前端開發

2021-11-05 10:36:19

性能優化實踐

2023-04-26 07:46:22

React隱藏彩蛋

2022-07-29 15:10:24

開發React

2022-06-23 09:04:14

ReactHooks項目
點贊
收藏

51CTO技術棧公眾號

久久99青青| 在线免费观看黄色av| 日韩三级成人| 国产精品久久久久久久裸模| 日韩二区三区在线| 在线小视频网址| 国产精品久久久久一区二区三区| 国产精品久久久久久久乖乖| 日韩高清电影一区| 久久一区二区精品| 激情综合电影网| 91丝袜美腿美女视频网站| 久9久9色综合| 国产成人激情小视频| xxxx日韩| 国产suv精品一区二区三区88区| 国产精品一区二区女厕厕| 国产一区二区三区四区| 国产成人精品免高潮在线观看 | 欧美一级免费视频| 97久久亚洲| 欧美激情一二区| 欧美一级色片| 日产精品99久久久久久| 加勒比久久综合| 成人av色在线观看| 国产在线成人| 日韩av影视| 国产激情一区二区三区桃花岛亚洲| 无码日本精品xxxxxxxxx| 91亚洲国产成人精品一区二三| 国产成人亚洲精品无码h在线| 国产精品灌醉下药二区| 伊人色综合网| 欧美日韩一区二区精品| 在线免费观看黄色av| 日韩av在线看| 91久久偷偷做嫩草影院电| 欧美在线免费观看| 欧美人成在线| 国产又粗又硬又长| 国产午夜一区二区三区| 色资源网在线观看| 91麻豆精品国产91久久久久| 欧美日韩激情电影| 久久免费福利视频| 欧美激情 亚洲a∨综合| 亚洲蜜桃av| 国产精品第五页| 欧美日韩视频在线播放| 日韩色av导航| 欧美日韩福利| 91午夜在线观看| 亚洲午夜在线视频| caoporn视频在线| 17婷婷久久www| 亚洲另类黄色| 日韩av三级在线| 亚洲成在线观看| 欧美xx视频| 91视频免费在线| jlzzjlzz亚洲日本少妇| 在线观看免费毛片| 尤物九九久久国产精品的分类| 日韩欧美不卡| 日本a视频在线观看| 在线观看一区日韩| 色综合视频一区二区三区44| 99中文字幕| 国产欧美一区二区三区沐欲| 草莓福利社区在线| 日本欧美精品在线| 国模一区二区三区白浆| 欧美知名女优| 久久激情视频免费观看| 中国精品18videos性欧美| 欧美国产亚洲一区| 7777精品伊人久久久大香线蕉的 | 美女一级全黄| 亚洲第一页在线| 精品大片一区二区| 91制片厂免费观看| 狠狠躁夜夜躁人人爽超碰91| 国产91亚洲精品久久久| 国产精品入口免费| **欧美大码日韩| 欧美xx视频| 国产伦精品一区二区| 国产区在线观看成人精品| 手机在线免费看av| 国产精品人成电影| 欧美激情综合五月色丁香小说| www.综合| 久久久久久久久久码影片| 亚洲综合久久av| 日本一区二区三区电影免费观看| 亚洲二区自拍| 欧美日韩成人在线一区| 国产欧美日韩免费观看| 可以在线看的黄色网址| 亚洲欧美日韩视频一区| 久久亚洲电影| 最近高清中文在线字幕在线观看| 26uuu日韩精品一区二区| 高清国产午夜精品久久久久久| av网站大全在线| 久久久国产精品不卡| 国产一级片在线| 国产精品人成电影| 国产欧美一区二区三区在线看蜜臀| 在线观看网站免费入口在线观看国内| 国新精品乱码一区二区三区18| 亚洲一区在线观看网站| 伦理一区二区| 亚洲第一狼人区| 欧美猛男性生活免费| 99久久99久久精品免费观看| 色噜噜狠狠狠综合欧洲色8| 国产欧美精品一区二区三区| 色综合天天性综合| 91精品观看| 国产在线免费观看| 操一操视频一区| 欧美亚洲国产一区二区三区| 午夜日韩av| 在线播放麻豆| 久久久久久一区| 欧美大胆一级视频| 日本vs亚洲vs韩国一区三区二区| 宅男在线观看免费高清网站| 视频一区视频二区视频三区高 | 在线色视频网| 国产精品亚洲美女av网站| 亚洲免费在线看| 成人3d动漫在线观看| 男女激情网站| 成人免费xxxxx在线观看| 亚洲国产综合视频在线观看| 久久久久久美女精品 | 日本婷婷久久久久久久久一区二区 | 成人黄色在线播放| 欧美日韩免费在线观看| 91tv官网精品成人亚洲| 国产在线视频网址| 日本一区二区在线| 亚洲香蕉成人av网站在线观看 | 霍思燕三级露全乳照| 一区二区日韩精品| av在线免费不卡| 露出调教综合另类| 亚洲精华国产精华| 国产欧美欧洲| 亚洲精品wwwww| 播五月开心婷婷综合| 一级毛片精品毛片| 日本1区2区| 庆余年2免费日韩剧观看大牛| 中文字幕一区在线观看视频| 成人免费在线观看av| 男人插曲女人视频免费| 91亚洲永久免费精品| 欧美亚一区二区| 男人天堂欧美日韩| 日日夜夜天天综合| 91免费日韩| 久久久久久久久久久久久久久久av | 欧美一区91| 超碰97国产精品人人cao| 男人的天堂狠狠干| 国产成人午夜视频网址| 日韩欧美一区二区在线视频| gogogo免费视频观看亚洲一| 欧美色婷婷久久99精品红桃| 137大胆人体在线观看| 亚洲熟妇国产熟妇肥婆| 成人av番号网| 中文字幕日韩av综合精品| 亚洲r级在线视频| 国产精品一级片| 欧美艳星介绍134位艳星| 日韩123区| www.99色.com| 日韩精品极品视频在线观看免费| 欧美极品少妇xxxxⅹ免费视频| 欧美色欧美亚洲另类二区| 成人国产一区二区三区精品| 婷婷亚洲五月色综合| 日本一区二区电影| 国产黄在线看| 手机在线看福利| 亚洲精品视频一区二区三区| 日本一区二区在线播放| 亚洲欧洲视频在线| 在线视频欧美区| 中文字幕国产一区二区| 久久久久久久欧美精品| 欧美日韩一二三四| 99久久这里有精品| 丁香花视频在线观看| 亚洲欧洲闷骚av少妇影院|