useEffect理解React、Vue設(shè)計(jì)理念的不同
引言
我們知道,React
發(fā)布Hooks
后,帶來了業(yè)界一波Hooks
熱。很多框架(比如Vue Composition API
、Solid.js
)都借鑒了Hooks
的模式。
但是,即使這些框架都借鑒了Hooks
,但由于框架作者的理念不同,發(fā)展方向也逐漸不同。
比如,在Vue Composition API
中,對(duì)標(biāo)React useEffect API
的是watchEffect
,在Vue
文檔中,有一小段內(nèi)容介紹他的用法:
而在React beta
文檔中,介紹useEffect
的,則有整整6節(jié)內(nèi)容:
為什么會(huì)有這樣的區(qū)別?讓我們從useEffect
看看React
、Vue
設(shè)計(jì)理念的不同。
Vue與React的差異
當(dāng)Hooks
剛問世時(shí),他被看作是類組件的替代方案。文檔中介紹Hooks
時(shí)也是將他與類組件對(duì)比。
其中useEffect
的執(zhí)行時(shí)機(jī)囊括了如下3個(gè)生命周期函數(shù):
componentDidMount
componentDidUpdate
componentWillUnmount
反觀借鑒了Hooks
的Vue Composition API
,則同時(shí)提供了watchEffect API
與不同場(chǎng)景的生命周期函數(shù)。
這里已經(jīng)體現(xiàn)出兩者設(shè)計(jì)理念的不同了:
React
作為Facebook
為探索UI開發(fā)最佳實(shí)踐而生的框架,一貫的做法是 —— 保持API
穩(wěn)定(比如this.setState
從React
誕生伊始就一直存在)。
而Vue
則借鑒了各種框架中的最佳實(shí)踐(比如虛擬DOM、響應(yīng)式更新...)。
所以,從易用性上來說,Vue Composition API
是一定優(yōu)于React Hooks
的,比如:
Hooks
不能在條件語句中聲明
Hooks
必須顯式指明依賴
并且,這種易用性的差異會(huì)隨著框架迭代,愈發(fā)明顯。
useEffect會(huì)越來越復(fù)雜
本著保持API穩(wěn)定的原則,當(dāng)前useEffect
主要與上述三個(gè)生命周期函數(shù)相關(guān)。
但是,未來會(huì)有更多觸發(fā)時(shí)機(jī)與useEffect
掛鉤。
所以,React
團(tuán)隊(duì)在努力做一件事 —— 淡化useEffect
與生命周期的關(guān)系,甚至淡化useEffect
與組件的關(guān)系(因?yàn)楫?dāng)談到組件時(shí),很自然的會(huì)想到組件生命周期)。
怎么淡化呢?答案是 —— 在嚴(yán)格模式下,DEV
環(huán)境會(huì)觸發(fā)多次useEffect
回調(diào)。
如果你將useEffect
當(dāng)作componentDidMount/WillUnmount
來用,這個(gè)特性很可能讓你的代碼出bug
。
React
團(tuán)隊(duì)之所以這么做,就是想教育開發(fā)者 —— useEffect
和生命周期沒有關(guān)系。開發(fā)者應(yīng)該將useEffect
看作針對(duì)某個(gè)數(shù)據(jù)源的同步過程。
比如,下述聊天室組件,其中的useEffect
可以看作是針對(duì)聊天室連接的同步過程:
const serverUrl = 'https://localhost:1234'; function ChatRoom({ roomId }) { useEffect(() => { const connection = createConnection(serverUrl, roomId); connection.connect(); return () => { connection.disconnect(); }; }, [roomId]); // ... }
當(dāng)聊天室組件mount
、update
、unmount
時(shí),對(duì)應(yīng)的同步過程應(yīng)該進(jìn)行。
當(dāng)roomId
變化時(shí),對(duì)應(yīng)的同步過程應(yīng)該進(jìn)行。
同理,如果React
原生支持了Vue
中的KeepAlive
,那么當(dāng)聊天室組件從可見變?yōu)?strong>不可見,以及從不可見變?yōu)?strong>可見狀態(tài),同步過程都應(yīng)該進(jìn)行。
所以,當(dāng)我們從同步過程應(yīng)該何時(shí)進(jìn)行的角度看待useEffect
時(shí),上述useEffect
觸發(fā)時(shí)機(jī)都是合理的。
但是,如果從生命周期函數(shù)的角度看待useEffect
,等未來(可能是v18的某個(gè)版本),Offscreen Component
特性落地(對(duì)標(biāo)Vue
中的KeepAlive
),組件從可見變?yōu)?strong>不可見狀態(tài)時(shí),useEffect銷毀函數(shù)
與useEffect回調(diào)函數(shù)
會(huì)依次執(zhí)行,就會(huì)讓人很頭大。
這就是為什么,我上文說,React
團(tuán)隊(duì)一直在淡化useEffect
與生命周期的關(guān)系,甚至淡化useEffect
與組件的關(guān)系。
一切都是為了未來其他特性與useEffect的掛鉤打下理論基礎(chǔ)。而這些特性從組件或生命周期函數(shù)的角度講不通。
這也是為什么在新文檔里有6節(jié)內(nèi)容與useEffect
相關(guān)的原因。
作為對(duì)比,Vue
在遇到新的場(chǎng)景時(shí)會(huì)怎么做呢?顯然是設(shè)計(jì)新的API
。
總結(jié)
到底是提供一個(gè)API
,但是能覆蓋更多場(chǎng)景(文檔有6節(jié)來介紹他)好,還是每個(gè)場(chǎng)景都提供一個(gè)API
好?
不同開發(fā)者有自己的答案。
但有一點(diǎn)很明確,對(duì)于前端新手,React
的上手難度會(huì)越來越高,而Vue
的上手難度會(huì)盡可能保持平滑。
這里的前端新手,可能是想入行前端的新人,也可能是覺得前端我也能干的后端。
所以,對(duì)于當(dāng)前的從業(yè)者來說,這究竟是好事還是壞事呢?
以上就是useEffect理解React、Vue設(shè)計(jì)理念的不同的詳細(xì)內(nèi)容,更多關(guān)于useEffect React Vue設(shè)計(jì)理念的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
axios進(jìn)階實(shí)踐之利用最優(yōu)雅的方式寫ajax請(qǐng)求
之前給大家介紹了jQuery利用最優(yōu)雅的方式寫ajax請(qǐng)求的相關(guān)內(nèi)容,這篇文章主要給大家介紹了關(guān)于axios進(jìn)階實(shí)踐之利用最優(yōu)雅的方式寫ajax請(qǐng)求的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-12-12使用vue.js實(shí)現(xiàn)聯(lián)動(dòng)效果的示例代碼
本篇文章主要介紹了使用vue.js實(shí)現(xiàn)聯(lián)動(dòng)效果的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01vue實(shí)現(xiàn)將自己網(wǎng)站(h5鏈接)分享到微信中形成小卡片的超詳細(xì)教程
在微信小程序中,可以很簡(jiǎn)單的分享一個(gè)頁面,比微信H5簡(jiǎn)單多了,下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)將自己網(wǎng)站(h5鏈接)分享到微信中形成小卡片的超詳細(xì)教程,需要的朋友可以參考下2023-02-02