成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

React新文檔:不要濫用Effect哦

開發 前端
新文檔中這一節名為Synchronizing with Effects[1],當前還處于草稿狀態。但是其中提到的一些概念,所有React開發者都應該清楚。

大家好,我卡頌。

你或你的同事在使用??useEffect??時有沒有發生過以下場景:

當你希望??狀態a???變化后「發起請求」,于是你使用了??useEffect??:

useEffect(() => {
fetch(xxx);
}, [a])

這段代碼運行符合預期,上線后也沒問題。

隨著需求不斷迭代,其他地方也會修改??狀態a???。但是在那個需求中,并不需要??狀態a??改變后發起請求。

你不想動之前的代碼,又得修復這個??bug??,于是你增加了判斷條件:

useEffect(() => {
if (xxxx) {
fetch(xxx);
}
}, [a])

某一天,需求又變化了!現在請求還需要??b??字段。

這很簡單,你順手就將??b???作為??useEffect??的依賴加了進去:

useEffect(() => {
if (xxxx) {
fetch(xxx);
}
}, [a, b])

隨著時間推移,你逐漸發現:

  • 「是否發送請求」與「if條件」相關。
  • 「是否發送請求」還與「a、b等依賴項」相關。
  • 「a、b等依賴項」又與「很多需求」相關。

根本分不清到底什么時候會發送請求,真是頭大...

如果以上場景似曾相識,那么??React??新文檔里已經明確提供了解決辦法。

一些理論知識

新文檔中這一節名為Synchronizing with Effects[1],當前還處于草稿狀態。

但是其中提到的一些概念,所有??React??開發者都應該清楚。

首先,??effect??這一節隸屬于Escape Hatches[2](逃生艙)這一章。

圖片

從命名就能看出,開發者并不一定需要使用??effect??,這僅僅是特殊情況下的逃生艙。

??React??中有兩個重要的概念:

  • ??Rendering code??(渲染代碼)。
  • ??Event handlers??(事件處理器)。

??Rendering code???指「開發者編寫的組件渲染邏輯」,最終會返回一段??JSX??。

比如,如下組件內部就是??Rendering code??:

function App() {
const [name, update] = useState('KaSong');
return <div>Hello {name}</div>;
}

??Rendering code??的特點是:他應該是「不帶副作用的純函數」。

如下??Rendering code???包含副作用(??count??變化),就是不推薦的寫法:

let count = 0;
function App() {
count++;
const [name, update] = useState('KaSong');
return <div>Hello {name}</div>;
}

處理副作用

??Event handlers???是「組件內部包含的函數」,用于執行用戶操作,可以包含??副作用??。

下面這些操作都屬于??Event handlers??:

  • 更新??input??輸入框。
  • 提交表單。
  • 導航到其他頁面。

如下例子中組件內部的??changeName???方法就屬于??Event handlers??:

function App() {
const [name, update] = useState('KaSong');
const changeName = () => {
update('KaKaSong');
}
return <div onClick={changeName}>Hello {name}</div>;
}

但是,并不是所有副作用都能在??Event handlers??中解決。

比如,在一個聊天室中,「發送消息」是用戶觸發的,應該交給??Event handlers??處理。

除此之外,聊天室需要隨時保持和服務端的長連接,「保持長連接」的行為屬于副作用,但并不是用戶行為觸發的。

對于這種:在視圖渲染后觸發的副作用,就屬于??effect???,應該交給??useEffect??處理。

回到開篇的例子:

當你希望??狀態a??變化后「發起請求」,首先應該明確,你的需求是:

「狀態a變化,接下來需要發起請求」還是「某個用戶行為需要發起請求,請求依賴狀態a作為參數」?

如果是后者,這是用戶行為觸發的副作用,那么相關邏輯應該放在??Event handlers??中。

假設之前的代碼邏輯是:

  1. 點擊按鈕,觸發??狀態a??變化。
  2. ??useEffect??執行,發送請求。

應該修改為:

  1. 點擊按鈕,在事件回調中獲取??狀態a??的值。
  2. 在事件回調中發送請求。

經過這樣修改,「狀態a變化」與「發送請求」之間不再有因果關系,后續對??狀態a??的修改不會再有「無意間觸發請求」的顧慮。

總結

當我們編寫組件時,應該盡量將組件編寫為純函數。

對于組件中的副作用,首先應該明確:

是「用戶行為觸發的」還是「視圖渲染后主動觸發的」?

對于前者,將邏輯放在??Event handlers??中處理。

對于后者,使用??useEffect??處理。

這也是為什么??useEffect???所在章節在新文檔中叫做??Escape Hatches??? —— 大部分情況下,你不會用到??useEffect??,這只是其他情況都不適應時的逃生艙。

參考資料

[1]Synchronizing with Effects:https://beta-reactjs-org-git-effects-fbopensource.vercel.app/learn/synchronizing-with-effects。

[2]Escape Hatches:https://beta-reactjs-org-git-effects-fbopensource.vercel.app/learn/escape-hatches?。

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2022-06-15 22:33:07

React逃生艙

2021-10-22 15:45:32

開發技能React

2022-05-27 16:03:37

ReactDanVue

2023-03-20 07:12:54

GPT學習React

2023-11-07 11:24:18

2023-07-14 07:23:21

ReactuseEffect

2012-02-20 09:56:55

ibmdw

2009-03-11 08:46:46

Chrome瀏覽器更新

2023-01-05 08:34:48

JDK工具

2020-10-19 10:25:57

ReactReact.js前端

2022-05-20 15:27:41

React工具Vue

2022-07-11 06:56:00

Reactreact-dom

2023-04-11 16:31:10

開發React 庫Web

2023-03-19 11:42:19

React新官方文檔

2021-02-08 18:25:52

微軟WindowsWindows 10

2012-02-16 13:36:39

JavaJavaFX

2023-05-19 10:04:18

Vue開發者代碼

2024-06-03 08:32:54

2021-07-26 10:36:04

華為云云辦公

2021-08-06 09:30:34

人工智能AI人臉識別
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 草久久免费视频 | 亚洲国产欧美在线 | 久久久久九九九女人毛片 | 日韩一区二区av | 91xxx在线观看 | 成人在线观看免费 | www.中文字幕.com | 久久国产精品久久久久久 | 国产在线观看不卡一区二区三区 | 免费观看a级毛片在线播放 黄网站免费入口 | 精品久久国产 | 亚洲成在线观看 | 亚州影院 | 国产成人高清在线观看 | 久久精品这里精品 | 人操人人 | 日韩精品在线网站 | 久热久热 | 九九色九九| 99久久婷婷国产综合精品电影 | 久在线 | 福利片在线 | 日日操av| 日韩视频国产 | 99视频在线播放 | 久久精品亚洲欧美日韩久久 | 欧美日韩精选 | 毛色毛片免费看 | 乱码av午夜噜噜噜噜动漫 | 亚洲精品乱码久久久久久按摩观 | 国产成人综合一区二区三区 | 欧美成人免费在线 | 成人欧美一区二区三区视频xxx | 国产亚洲精品久久午夜玫瑰园 | 日本精品视频在线 | 久久香焦| 日韩有码一区 | 欧美日韩高清一区二区三区 | 国产在线观看免费 | 妞干网av| 亚洲第一av |