摘要:而中實現原理是利用高階函數通過將多個函數組合成一個可執行執行函數關鍵步驟代碼如下所示。和都是基于更新差異元素。
引言
平時開發單頁項目應用基于vue,目前另外兩個比較熱的庫還有angular和react,angular 1系列用過,進入公司后由于基于vue技術棧就沒在關注了。
一直在關注react,目的不是學習用法,只是為了拓展自己的視野和思維,通過了解一些使用上的差異性,來進一步的思考其底層設計的思想。
在具體業務邏輯開發前,我們首先要做的是搭建項目骨架,vue的話可以使用vue-cli,通過腳手架產生的配置完全暴露出來,我們可以靈活的修改配置來定制化需求。
我常用幾個配置如下
build時assetsPublicPath會修改成相對引入,或者配置成公共前綴,方便測試 dev時proxyTable代理一些接口,聯調用,自己測試話就直接用mock數據服務 關閉devtool,去除contenthash,chunkhash,html的minify,添加externals,定制化一些eslint……等等 其它也有一些不通用改動,上面是每個項目都通用的配置
至于react可以使用create-react-app架手架,然后就直接可以使用create-react-app創建項目了,默認隱藏配置,定制化配置可以直接npm run eject。需要注意點就是使用?create-react-app創建比較慢,需要做如下設置
?npm config set registry https://registry.npm.taobao.org
其實自定義配置直接在配置依賴包里也可以改動,不過這樣不太好。其次腳手架創建項目最好不要在已有git目錄下載創建,不然使用npm run eject會報錯,此時用空目錄下創建即可。
無論是哪個腳手架常用的配置,都是基于webpack核心生態圈構建,所以核心重點就是webpack用的熟練的話,無論使用哪個自定義化配置都不成問題。
vue稍微復雜些單頁會基于vue+vuex+vue-router,react棧是react+redux+react-router。
不同點是vue組件是(html+css+js),對開發友好,上手容易。react一切都是js,特別的靈活,通過在render中利用純js邏輯控制渲染輸出模板。下面是基于react的一個示例。
render() { let name = this.state.flag ? "true":"false" return (
vue的語法糖可以讓我們在表單上輕松的實現雙向綁定,而react是純粹的基于UI=render(data)的理念。vue利用es5的set,get機制收集依賴,能詳細的定位修改元素,react每次setState對組件構造函數中私有屬性進行修改時,組件都會更新,除非你在shouldComponentUpdate加入一些邏輯處理。另外vue提供的api多,有很多好用又方便的指令,但是具有兩面性,而react核心概念少,js用的溜,上手挺容易的。
數據流無論是vue還是react都支持組件私有屬性;組件之間prop,組件之間簡單關數據系修改的話,可以使用事件的方式,vue此時又提供了個語法糖sync,吼吼,其它的話沒啥差異。
比較麻煩的一點就是復雜網狀組件之間數據流動時處理,此時就需要合理組織數據了,不然維護,調試就是一個大坑,事件方式就不適合了,此時就要說到vuex和redux了,vuex的getter獲取state中數據,映射到組件data屬性上,Mutation同步commit修改數據,Action中dispatch可同步or異步修改數據,核心是單一狀態樹,通過設計層層方法最后達到修改數據的目的就是為了更好的管理,檢測數據的流動。redux因為平時用的少,所以此刻我要描述的詳細些,以做備忘。
import {createStore, applyMiddleware, compose} from "redux" import thunk from "redux-thunk" import {Provider} from "react-redux" const store = createStore(counter, compose( applyMiddleware(thunk), window.devToolsExtension?window.devToolsExtension(): f => f )) ReactDOM.render(, document.getElementById("root") );
了解背后原理,可以讓我們更靈活的控制代碼,下面開始詳細的分析。
執行createStore,提供一個狀態樹的初始化環境,返回一個對象,其中包含一些閉包函數,引用createStore初始化環境中中的各種函數和變量,例如dispatch(派發action),getState(獲取只讀狀態樹上的值),subscribe(訂閱數據改變)等等,其中
dispatch({ type: ActionTypes.INIT })(源碼:248)
此代碼的目的是創建store的時候,給reduce一個默認值,初始化currentState值,方便初次getState調用。
applyMiddleware中間件機制,可以在處理store前后加一些通用處理,其它例如express,koa,springMVC這些框架中都有這種思想,實現方式不同,目的都一樣,解耦,可插拔效果,便于維護。
而rudux中applyMiddleware實現原理是利用高階函數compose,通過reduce將多個函數組合成一個可執行執行函數,關鍵步驟代碼如下所示。
//applyMiddleware.js chain = middlewares.map(middleware => middleware(middlewareAPI)) dispatch = compose(...chain)(store.dispatch)
//compose.js funcs.reduce((a, b) => (...args) => a(b(...args)))
thunk 至于這個就是用來方便做異步處理的,是一個高階函數中間件,如下所示,一般action返回的都是一個行為描述對象,但是這個在你對store進行處理前加了一層邏輯判斷,以便我們在組件上統一的方式寫dispatch相關的代碼。
if (typeof action === "function") { return action(dispatch, getState, extraArgument); }
devToolsExtension //開啟調試工具,沒有vue方便,不能自動檢測
Provider提供一個上下文環境,讓一個樹上的所有組件都能訪問同一個對象。必要前提條件是添加加childContextTypes和getChildContext。
優化為了更好的體驗,一般我們會采取一些措施,下面總結一下針對vue和react的優化措施。
重單頁應用,在路由中我們可以異步加載組件,雖然兩者都支持,原理類似,但是vue使用極其方便,如下所示
const My = () => import("../components/My.vue")
有一點需要注意的就是需要配置下assetsPublicPath,這樣打包后的url中是全路徑,否則按照相對路徑處理容易出問題;相對而言react還要用模板代碼包裝下組件,這一點不好,不過未來react未來會開啟異步渲染組件的支持,這一點很贊。
vue和react都是基于dom diff更新差異元素。vue中,我們操作的data數據是vue封裝處理過,修改數據時,vue會將數據初始化時收集的相關依賴元素進行更新,而react每次setState更新數據針對的是組件,為了優化,組件設計的時候盡量細粒度,尤其是react當中的展示類組件。
因為兩者使用的是針對web頁面情況優化過的dom diff算法,以使復雜度降低為O(n),所以有一些默認前提,理解并按照默認diff規則才能使代碼達到最優,比如說,保持根節點一致;一個dom父節點下有多個子節點并列時,給子節點添加key,防止對父節點使用insertBefore插入子節點這種情況等等。
總結陸陸續續的學習過程中,將自己的想法自己總結下來。
說明,文中的總結基于下面這些版本,
vue ^2.4.2
react 16.0.0-rc.2
redux 3.7.2
react-router 4.2
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90003.html
摘要:記使用方式和之前版本的差異的使用下載和安裝項目生成的目錄結構以上,目前版本的使用下載和安裝項目生成的目錄結構新的目錄結構,隱藏了配置文件,封裝了細節對比個區別區別下載包的包命變化。貌似是之前的版本有點問題 記vue-cli@3.0使用方式和之前版本的差異 @2.9.3的使用 1.下載vue-cli和安裝項目 cnpm i -g vue-cli#2.9.3 vue init webpa...
摘要:公司的招聘要求都提到了至少熟悉其中一種前端框架,有前端工程化與模塊化開發實踐經驗相關字眼。我們主要從端公眾號移動端小程序三大平臺進行前端的技術選型,并來說說選其技術的幾大優勢。技術的優勢互聯網前端大潮后,前端出現了大框架,分別是與。 1、技術選型的背景前端技術發展日新月異,互聯網上出現的新型框架也比較多,如何讓新招聘的人員...
摘要:它們是高度重視且廣泛使用的框架,用于界面設計。應用程序開發引起了全球開發人員的極大關注,以構建令人驚嘆的應用程序。但是,具有適應性強的體系結構,使其成為廣泛使用的框架之一,具有最新的庫和包。專業和出色的社區支持,以解決任何問題。 JavaScript是世界上最流行的語言之一,React和Vue是JS最流行的兩個框架。但哪一款最適合你? JavaScript越來越受歡迎,許多科技巨頭正在...
摘要:它們是高度重視且廣泛使用的框架,用于界面設計。應用程序開發引起了全球開發人員的極大關注,以構建令人驚嘆的應用程序。但是,具有適應性強的體系結構,使其成為廣泛使用的框架之一,具有最新的庫和包。專業和出色的社區支持,以解決任何問題。 JavaScript是世界上最流行的語言之一,React和Vue是JS最流行的兩個框架。但哪一款最適合你? JavaScript越來越受歡迎,許多科技巨頭正在...
閱讀 2536·2023-04-25 19:47
閱讀 3383·2019-08-29 17:18
閱讀 855·2019-08-29 15:26
閱讀 3359·2019-08-29 14:17
閱讀 1113·2019-08-26 13:49
閱讀 3338·2019-08-26 13:22
閱讀 3022·2019-08-26 10:44
閱讀 2692·2019-08-23 16:51