<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
你或你的同事在使用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])
隨著時間推移,你逐漸發現:
根本分不清到底什麼時候會傳送請求,真是頭大...
如果以上場景似曾相識,那麼React
新檔案裡已經明確提供瞭解決辦法。
新檔案中這一節名為Synchronizing with Effects,當前還處於草稿狀態。
但是其中提到的一些概念,所有React
開發者都應該清楚。
首先,effect
這一節隸屬於Escape Hatches(逃生艙)這一章。
從命名就能看出,開發者並不一定需要使用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
中。
假設之前的程式碼邏輯是:
狀態a
變化useEffect
執行,傳送請求應該修改為:
狀態a
的值經過這樣修改,狀態a變化與傳送請求之間不再有因果關係,後續對狀態a
的修改不會再有無意間觸發請求的顧慮。
當我們編寫元件時,應該儘量將元件編寫為純函數。
對於元件中的副作用,首先應該明確:
是使用者行為觸發的還是檢視渲染後主動觸發的?
對於前者,將邏輯放在Event handlers
中處理。
對於後者,使用useEffect
處理。
這也是為什麼useEffect
所在章節在新檔案中叫做Escape Hatches
—— 大部分情況下,你不會用到useEffect
,這只是其他情況都不適應時的逃生艙。
以上就是React新檔案切記不要濫用effect的詳細內容,更多關於React檔案effect的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45