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

從UseEffect看React、Vue設計理念的不同

開發 前端
React作為Facebook為探索「UI開發」最佳實踐而生的框架,一貫的做法是 —— 保持API穩定(比如this.setState從React誕生伊始就一直存在)。

大家好,我卡頌。

我們知道,React發布Hooks后,帶來了業界一波Hooks熱。很多框架(比如Vue Composition API、Solid.js)都借鑒了Hooks的模式。

但是,即使這些框架都借鑒了Hooks,但由于框架作者的理念不同,發展方向也逐漸不同。

比如,在Vue Composition API中,對標React useEffect API的是watchEffect,在Vue文檔中,有一小段內容介紹他的用法:

圖片

而在React beta文檔中,介紹useEffect的,則有整整6節內容:

圖片

為什么會有這樣的區別?讓我們從useEffect看看React、Vue設計理念的不同。

Vue與React的差異

當Hooks剛問世時,他被看作是類組件的替代方案。文檔中介紹Hooks時也是將他與類組件對比。

其中useEffect的執行時機囊括了如下3個生命周期函數:

  • componentDidMount
  • componentDidUpdate
  • componentWillUnmount

圖片

反觀借鑒了Hooks的Vue Composition API,則同時提供了watchEffect API與不同場景的生命周期函數。

圖片

這里已經體現出兩者設計理念的不同了:

React?作為Facebook?為探索「UI開發」最佳實踐而生的框架,一貫的做法是 —— 保持API?穩定(比如this.setState?從React誕生伊始就一直存在)。

而Vue?則借鑒了各種框架中的最佳實踐(比如虛擬DOM?、響應式更新...)。

所以,從易用性上來說,Vue Composition API?是一定優于React Hooks的,比如:

  • Hooks不能在條件語句中聲明。
  • Hooks必須顯式指明依賴。

并且,這種易用性的差異會隨著框架迭代,愈發明顯。

useEffect會越來越復雜

本著「保持API穩定」的原則,當前useEffect主要與上述三個生命周期函數相關。

但是,未來會有更多觸發時機與useEffect掛鉤。

所以,React?團隊在努力做一件事 —— 淡化useEffect?與生命周期的關系,甚至淡化useEffect與組件的關系(因為當談到組件時,很自然的會想到組件生命周期)。

怎么淡化呢?答案是 —— 在嚴格模式下,DEV?環境會觸發多次useEffect回調。

如果你將useEffect?當作componentDidMount/WillUnmount?來用,這個特性很可能讓你的代碼出bug。

React?團隊之所以這么做,就是想教育開發者 —— useEffect?和生命周期沒有關系。開發者應該將useEffect看作「針對某個數據源的同步過程」。

比如,下述聊天室組件,其中的useEffect可以看作是「針對聊天室連接的同步過程」:

const serverUrl = 'https://localhost:1234';
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.connect();
return () => {
connection.disconnect();
};
}, [roomId]);
// ...
}

當聊天室組件mount、update、unmount時,對應的同步過程應該進行。

當roomId變化時,對應的同步過程應該進行。

同理,如果React?原生支持了Vue?中的KeepAlive,那么當聊天室組件從「可見」變為「不可見」,以及從「不可見」變為「可見」狀態,同步過程都應該進行。

所以,當我們從「同步過程應該何時進行」的角度看待useEffect?時,上述useEffect觸發時機都是合理的。

但是,如果從生命周期函數的角度看待useEffect?,等未來(可能是v18的某個版本),Offscreen Component?特性落地(對標Vue?中的KeepAlive?),組件從「可見」變為「不可見」狀態時,useEffect銷毀函數?與useEffect回調函數會依次執行,就會讓人很頭大。

這就是為什么,我上文說,React?團隊一直在淡化useEffect?與生命周期的關系,甚至淡化useEffect與組件的關系。

一切都是為了「未來其他特性與useEffect的掛鉤」打下理論基礎。而這些特性從「組件」或「生命周期函數」的角度講不通。

這也是為什么在新文檔里有6節內容與useEffect相關的原因。

作為對比,Vue?在遇到新的場景時會怎么做呢?顯然是設計新的API。

總結

到底是提供一個API?,但是能覆蓋更多場景(文檔有6節來介紹他)好,還是每個場景都提供一個API好?

不同開發者有自己的答案。

但有一點很明確,對于前端新手,React?的上手難度會越來越高,而Vue的上手難度會盡可能保持平滑。

這里的前端新手,可能是想入行前端的新人,也可能是覺得「前端我也能干」的后端。

所以,對于當前的從業者來說,這究竟是好事還是壞事呢?

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

2023-06-15 10:53:57

2019-02-18 14:42:18

React.jsUI前端

2022-09-23 10:25:00

VueReact

2022-08-21 09:41:42

ReactVue3前端

2019-04-28 16:10:50

設計Redux前端

2021-04-01 08:05:01

React無限循環useEffect()

2022-03-16 09:17:41

函數useStaterender

2011-09-05 10:18:21

Windows 8Mac OS

2023-11-26 18:02:00

ReactDOM

2023-12-25 15:40:55

React開發

2021-08-27 12:59:59

React前端命令

2013-06-07 11:31:36

面向對象設計模式

2024-01-23 09:51:11

編程工具

2021-03-10 08:20:54

設計模式OkHttp

2009-07-15 15:47:12

JDBC DAO

2014-04-24 11:49:42

DevOps自動化

2025-05-12 01:33:00

異步函數Promise

2021-10-12 08:34:23

React組件前端

2010-03-02 16:34:06

Android平臺

2018-06-26 10:59:31

虛擬化云計算核心技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品99久久久久 | 国产精品久久久久久久久久久久久久 | 日韩成人性视频 | 秋霞国产 | 性生生活大片免费看视频 | 国产一区二区三区视频免费观看 | av免费观看在线 | 极品在线| 亚洲视频在线免费观看 | 天天操夜夜操 | av在线播放一区二区 | 观看毛片 | 日日摸天天添天天添破 | 国产高清在线 | 欧美日韩国产一区二区三区 | 亚洲精品久久嫩草网站秘色 | 久久精品久久精品 | 午夜精品一区二区三区在线播放 | 91精品中文字幕一区二区三区 | 色999视频 | 特级丰满少妇一级aaaa爱毛片 | 欧美综合一区二区 | 伊伊综合网 | 成人在线观看免费爱爱 | 亚洲激情在线观看 | 爱操av| 成人免费av | 成人精品一区二区三区 | 亚洲免费视频网站 | 毛片a级毛片免费播放100 | 久久91精品国产一区二区三区 | 国产在视频一区二区三区吞精 | 久久精品欧美电影 | 97久久久| 亚洲二区在线 | 欧美一级片在线观看 | 久久久青草 | 欧美 日韩 国产 成人 | 国产农村妇女精品一二区 | 91精品在线看| 午夜视频精品 |