您好,登錄后才能下訂單哦!
這篇文章主要介紹了React新文檔濫用effect問題怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇React新文檔濫用effect問題怎么解決文章都會有所收獲,下面我們一起來看看吧。
你或你的同事在使用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,當前還處于草稿狀態。
但是其中提到的一些概念,所有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
的修改不會再有無意間觸發請求的顧慮。
關于“React新文檔濫用effect問題怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“React新文檔濫用effect問題怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。