小編給大家分享一下reactjs和vuejs有哪些區(qū)別,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
為永春等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及永春網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站建設(shè)、永春網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
reactjs和vuejs的區(qū)別:1、vue是數(shù)據(jù)雙向綁定,react不是雙向綁定;2、非父子組件實(shí)現(xiàn)通信,react使共同父組件觸發(fā)事件函數(shù)傳形參的方式,vue使用訂閱/發(fā)布模式的方式;3、react用Redux進(jìn)行狀態(tài)管理,vue使用vuex。
本教程操作環(huán)境:windows7系統(tǒng)、vue2.9.6&&react16版,DELL G3電腦。
Vue.js與React.js從某些反面來說很相似,通過兩個(gè)框架的學(xué)習(xí),有時(shí)候?qū)σ恍┯梅〞?huì)有一點(diǎn)思考,為加深學(xué)習(xí)的思索,特翻閱了兩個(gè)文檔,從以下各方面進(jìn)行了對(duì)比,加深了對(duì)這兩個(gè)框架的認(rèn)知。
1.1 Vue中有關(guān)數(shù)據(jù)綁定的部分
vue是雙向綁定, Vue.js 最核心的功能有兩個(gè),一是響應(yīng)式的數(shù)據(jù)綁定系統(tǒng),二是組件系統(tǒng)。所謂雙向綁定,指的是vue實(shí)例中的data與其渲染的DOM元素的內(nèi)容保持一致,無論誰被改變,另一方會(huì)相應(yīng)的更新為相同的數(shù)據(jù)。這是通過設(shè)置屬性訪問器實(shí)現(xiàn)的。
在vue中,與數(shù)據(jù)綁定有關(guān)的有 插值表達(dá)式、指令系統(tǒng)、*Class和Style、事件處理器和表單空間、ajax請(qǐng)求和計(jì)算屬性
1.1.1插值表達(dá)式
插值和指令又稱為模板語法
- 數(shù)據(jù)綁定最常見的形式就是使用“Mustache”語法 (雙大括號(hào)) 的文本插值
- Mustache 語法不能作用在 HTML 特性上,遇到這種情況應(yīng)該使用 v-bind 指令
1.1.2 指令
vue中的指令很方便,指令 (Directives) 是帶有 v- 前綴的特殊屬性。指令屬性的值預(yù)期是單個(gè) JavaScript 表達(dá)式 (v-for 是例外情況,稍后我們?cè)儆懻?。指令的職責(zé)是,當(dāng)表達(dá)式的值改變時(shí),將其產(chǎn)生的連帶影響,響應(yīng)式地作用于 DOM。
vue中的12個(gè)指令: v-bind,v-once,v-model,v-text,v-html,v-on,v-if,v-else,v-show,v-for,v-pre,v-clock
1.1.3 class與style綁定
數(shù)據(jù)綁定的一個(gè)常見需求是操作元素的 class 列表和它的內(nèi)聯(lián)樣式。因?yàn)樗鼈兌际菍傩?,我們可以用v-bind 處理它們:只需要計(jì)算出表達(dá)式最終的字符串。不過,字符串拼接麻煩又易錯(cuò)。因此,在 v-bind 用于 class 和 style 時(shí),Vue.js 專門增強(qiáng)了它。表達(dá)式的結(jié)果類型除了字符串之外,還可以是對(duì)象或數(shù)組。
對(duì)象語法
我們可以傳給 v-bind:class 一個(gè)對(duì)象,以動(dòng)態(tài)地切換 class
數(shù)組語法
我們可以把一個(gè)數(shù)組傳給 v-bind:class,以應(yīng)用一個(gè) class 列表:
1.1.4 條件渲染和列表渲染
v-if條件渲染一組數(shù)
我們用 v-for 指令根據(jù)一組數(shù)組的選項(xiàng)列表進(jìn)行渲染。v-for 指令需要使用 item in items 形式的特殊語法,items 是源數(shù)據(jù)數(shù)組并且 item 是數(shù)組元素迭代的別名。
1.1.5 事件處理器
通過v-on給元素注冊(cè)事件
使用 v-on 有幾個(gè)好處:
掃一眼 HTML 模板便能輕松定位在 JavaScript 代碼里對(duì)應(yīng)的方法。
因?yàn)槟銦o須在 JavaScript 里手動(dòng)綁定事件,你的 ViewModel 代碼可以是非常純粹的邏輯,和 DOM 完全解耦,更易于測(cè)試。
當(dāng)一個(gè) ViewModel 被銷毀時(shí),所有的事件處理器都會(huì)自動(dòng)被刪除。你無須擔(dān)心如何自己清理它們。
1.1.6 表單控件
v-model在表單控件元素上創(chuàng)建雙向數(shù)據(jù)綁定
它會(huì)根據(jù)控件類型自動(dòng)選取正確的方法來更新元素。
1.1.7 計(jì)算屬性
在Vue中引入了計(jì)算屬性來處理模板中放入太多的邏輯會(huì)讓模板過重且難以維護(hù)的問題,這樣不但解決了上面的問題,而且也同時(shí)讓模板和業(yè)務(wù)邏輯更好的分離。
簡(jiǎn)單來說,假如data里面有屬性a=1,然后你需要一個(gè)變量跟著a變化,例如b=a+1,那么就需要用到計(jì)算屬性,Vue實(shí)例的computed屬性中,設(shè)置b為其屬性,其表現(xiàn)為一個(gè)函數(shù),返回值是b的值。
1.1.8 ajax數(shù)據(jù)請(qǐng)求
vue2.0中數(shù)據(jù)請(qǐng)求推薦使用axios
Vue 的依賴追蹤是【原理上不支持雙向綁定,v-model 只是通過監(jiān)聽 DOM 事件實(shí)現(xiàn)的語法糖】
vue的依賴追蹤是通過 Object.defineProperty 把data對(duì)象的屬性全部轉(zhuǎn)為 getter/setter來實(shí)現(xiàn)的;當(dāng)改變數(shù)據(jù)的某個(gè)屬性值時(shí),會(huì)觸發(fā)set函數(shù),獲取該屬性值的時(shí)候會(huì)觸發(fā)get函數(shù),通過這個(gè)特性來實(shí)現(xiàn)改變數(shù)據(jù)時(shí)改變視圖;也就是說只有當(dāng)數(shù)據(jù)改變時(shí)才會(huì)觸發(fā)視圖的改變,反過來在操作視圖時(shí),只能通過DOM事件來改變數(shù)據(jù),再由此來改變視圖,以此來實(shí)現(xiàn)雙向綁定
雙向綁定是在同一個(gè)組件內(nèi),將數(shù)據(jù)和視圖綁定起來,和父子組件之間的通信并無什么關(guān)聯(lián);
組件之間的通信采用單向數(shù)據(jù)流是為了組件間更好的解耦,在開發(fā)中可能有多個(gè)子組件依賴于父組件的某個(gè)數(shù)據(jù),假如子組件可以修改父組件數(shù)據(jù)的話,一個(gè)子組件變化會(huì)引發(fā)所有依賴這個(gè)數(shù)據(jù)的子組件發(fā)生變化,所以vue不推薦子組件修改父組件的數(shù)據(jù),直接修改props會(huì)拋出警告
1.2 react沒有數(shù)據(jù)雙向綁定
react是單向數(shù)據(jù)流
react中通過將state(Model層)與View層數(shù)據(jù)進(jìn)行雙向綁定達(dá)數(shù)據(jù)的實(shí)時(shí)更新變化,具體來說就是在View層直接寫JS代碼Model層中的數(shù)據(jù)拿過來渲染,一旦像表單操作、觸發(fā)事件、ajax請(qǐng)求等觸發(fā)數(shù)據(jù)變化,則進(jìn)行雙同步
1.2.1事件處理
React 元素的事件處理和 DOM元素的很相似。但是有一點(diǎn)語法上的不同:
React事件綁定屬性的命名采用駝峰式寫法,而不是小寫。
如果采用 JSX 的語法你需要傳入一個(gè)函數(shù)作為事件處理函數(shù),而不是一個(gè)字符串(DOM元素的寫法)
在 React 中另一個(gè)不同是你不能使用返回 false 的方式阻止默認(rèn)行為。你必須明確的使用 preventDefault。
當(dāng)你使用 ES6 class 語法來定義一個(gè)組件的時(shí)候,事件處理器會(huì)成為類的一個(gè)方法。一般需要顯式的綁定this,例如
this.handleClick = this.handleClick.bind(this);
你必須謹(jǐn)慎對(duì)待 JSX 回調(diào)函數(shù)中的 this,類的方法默認(rèn)是不會(huì)綁定 this 的。如果你忘記綁定 this.handleClick 并把它傳入 onClick, 當(dāng)你調(diào)用這個(gè)函數(shù)的時(shí)候 this 的值會(huì)是 undefined。
1.2.2 條件渲染
React 中的條件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或條件運(yùn)算符來創(chuàng)建表示當(dāng)前狀態(tài)的元素,然后讓 React 根據(jù)它們來更新 UI。
你可以通過用花括號(hào)包裹代碼在 JSX 中嵌入任何表達(dá)式 ,也包括 JavaScript 的邏輯與 &&,它可以方便地條件渲染一個(gè)元素。之所以能這樣做,是因?yàn)樵?JavaScript 中,true && expression 總是返回 expression,而 false && expression 總是返回 false。因此,如果條件是 true,&& 右側(cè)的元素就會(huì)被渲染,如果是 false,React 會(huì)忽略并跳過它。
條件渲染的另一種方法是使用 JavaScript 的條件運(yùn)算符 condition ? true : false。
1.2.3 列表渲染
你可以通過使用{}在JSX內(nèi)構(gòu)建一個(gè)元素集合,使用Javascript中的map()方法循遍歷數(shù)組
Keys可以在DOM中的某些元素被增加或刪除的時(shí)候幫助React識(shí)別哪些元素發(fā)生了變化。因此你應(yīng)當(dāng)給數(shù)組中的每一個(gè)元素賦予一個(gè)確定的標(biāo)識(shí)。一個(gè)元素的key最好是這個(gè)元素在列表中擁有的一個(gè)獨(dú)一無二的字符串。通常,我們使用來自數(shù)據(jù)的id作為元素的key。
1.2.4 表單操作
HTML表單元素與React中的其他DOM元素有所不同,因?yàn)楸韱卧厣鷣砭捅A粢恍﹥?nèi)部狀態(tài)。
當(dāng)用戶提交表單時(shí),HTML的默認(rèn)行為會(huì)使這個(gè)表單會(huì)跳轉(zhuǎn)到一個(gè)新頁(yè)面。在React中亦是如此。但大多數(shù)情況下,我們都會(huì)構(gòu)造一個(gè)處理提交表單并可訪問用戶輸入表單數(shù)據(jù)的函數(shù)。實(shí)現(xiàn)這一點(diǎn)的標(biāo)準(zhǔn)方法是使用一種稱為“受控組件”的技術(shù)。其值由React控制的輸入表單元素稱為“受控組件”。this.setState({value: event.target.value});
當(dāng)你有處理多個(gè)受控的input元素時(shí),你可以通過給每個(gè)元素添加一個(gè)name屬性,來讓處理函數(shù)根據(jù) event.target.name的值來選擇做什么。
1.2.5 狀態(tài)提升
在React中,狀態(tài)分享是通過將state數(shù)據(jù)提升至離需要這些數(shù)據(jù)的組件最近的父組件來完成的。這就是所謂的狀態(tài)提升。this.props.xxx
在React應(yīng)用中,對(duì)應(yīng)任何可變數(shù)據(jù)理應(yīng)只有一個(gè)單一“數(shù)據(jù)源”。通常,狀態(tài)都是首先添加在需要渲染數(shù)據(jù)的組件中。此時(shí),如果另一個(gè)組件也需要這些數(shù)據(jù),你可以將數(shù)據(jù)提升至離它們最近的父組件中。你應(yīng)該在應(yīng)用中保持 自上而下的數(shù)據(jù)流,而不是嘗試在不同組件中同步狀態(tài)。
2.1 react中的組件及數(shù)據(jù)流
React是單向數(shù)據(jù)流,數(shù)據(jù)主要從父節(jié)點(diǎn)傳遞到子節(jié)點(diǎn)(通過props)。如果頂層(父級(jí))的某個(gè)props改變了,React會(huì)重渲染所有的子節(jié)點(diǎn)。
react中實(shí)現(xiàn)組件有兩種實(shí)現(xiàn)方式,一種是createClass方法,另一種是通過ES2015的思想類繼承React.Component來實(shí)現(xiàn)
在React應(yīng)用中,按鈕、表單、對(duì)話框、整個(gè)屏幕的內(nèi)容等,這些通常都被表示為組件。
React推崇的是函數(shù)式編程和單向數(shù)據(jù)流:給定原始界面(或數(shù)據(jù)),施加一個(gè)變化,就能推導(dǎo)出另外一個(gè)狀態(tài)(界面或者數(shù)據(jù)的更新)
組件可以將UI切分成一些的獨(dú)立的、可復(fù)用的部件,這樣你就只需專注于構(gòu)建每一個(gè)單獨(dú)的部件。組件從概念上看就像是函數(shù),它可以接收任意的輸入值(稱之為“props”),并返回一個(gè)需要在頁(yè)面上展示的React元素。
1. Props的只讀性
無論是使用函數(shù)或是類來聲明一個(gè)組件,它決不能修改它自己的props。
所有的React組件必須像純函數(shù)那樣使用它們的props。
props與State的區(qū)別
- props是property的縮寫,可以理解為HTML標(biāo)簽的attribute。不可以使用this.props直接修改props,因?yàn)閜rops是只讀的,props是用于整個(gè)組件樹中傳遞數(shù)據(jù)和配置。在當(dāng)前組件訪問props,使用this.props。
- props是一個(gè)組件的設(shè)置參數(shù),可以在父控件中選擇性設(shè)置。父組件對(duì)子控件的props進(jìn)行賦值,并且props的值不可改變。一個(gè)子控件自身不能改變自己的 props。
- state:當(dāng)一個(gè)組件 mounts的時(shí)候,state如果設(shè)置有默認(rèn)值的會(huì)被使用,并且state可能時(shí)刻的被改變。一個(gè)子控件自身可以管理自己的state,但是需要注意的是,無法管理其子控件的state。所以可以認(rèn)為,state是子控件自身私有的。
- 每個(gè)組件都有屬于自己的state,state和props的區(qū)別在于前者(state)只存在于組件內(nèi)部,只能從當(dāng)前組件調(diào)用this.setState修改state值(不可以直接修改this.state?。?。
- props是一個(gè)父組件傳遞給子組件的數(shù)據(jù)流,可以一直的被傳遞到子孫組件中。然而 state代表的是子組件自身的內(nèi)部狀態(tài)。從語義上講,改變組件的狀態(tài),可能會(huì)導(dǎo)致dom結(jié)構(gòu)的改變或者重新渲染。而props是父組件傳遞的參數(shù),所以可以被用于初始化渲染和改變組件自身的狀態(tài),雖然大多數(shù)時(shí)候組件的狀態(tài)是又外部事件觸發(fā)改變的。我們需要知道的是,無論是state改變,還是父組件傳遞的 props改變,render方法都可能會(huì)被執(zhí)行。
- 一般我們更新子組件都是通過改變state值,更新新子組件的props值從而達(dá)到更新。
2.1.1 組件之間的通信
1、父子組件數(shù)通信
父與子之間通props屬性進(jìn)行傳遞
子與父之間,父組件定義事件,子組件觸發(fā)父組件中的事件時(shí),通過實(shí)參的形式來改變父組件中的數(shù)據(jù)來通信
即:
- * 父組件更新組件狀態(tài) —–props—–> 子組件更新
- * 子組件更新父組件狀態(tài) —–需要父組件傳遞回調(diào)函數(shù)—–> 子組件調(diào)用觸發(fā)
2、非父子組件之間的通信,嵌套不深的非父子組件可以使共同父組件,觸發(fā)事件函數(shù)傳形參的方式來實(shí)現(xiàn)
兄弟組件:
(1) 按照React單向數(shù)據(jù)流方式,我們需要借助父組件進(jìn)行傳遞,通過父組件回調(diào)函數(shù)改變兄弟組件的props。
- 其實(shí)這種實(shí)現(xiàn)方式與子組件更新父組件狀態(tài)的方式是大同小異的。
(2) 當(dāng)組件層次很深的時(shí)候,在這里,React官方給我們提供了一種上下文方式,可以讓子組件直接訪問祖先的數(shù)據(jù)或函數(shù),無需從祖先組件一層層地傳遞數(shù)據(jù)到子組件中。
2.1.2 組件的生命周期
construtor() //創(chuàng)建組件 componentWillMount() //組件掛載之前 componentDidMount() // 組件掛載之后 componentWillReceiveProps() // 父組件發(fā)生render的時(shí)候子組件調(diào)用該函數(shù) shouldComponentUpdate() // 組件掛載之后每次調(diào)用setState后都會(huì)調(diào)用該函數(shù)判斷是否需要重新渲染組件,默認(rèn)返回true componentDidUpdate() // 更新 render() //渲染,react中的核心函數(shù) componentWillUnmount() //組件被卸載的時(shí)候調(diào)用,一般在componentDidMount注冊(cè)的事件需要在這里刪除
2.2 vue中的組件和數(shù)據(jù)流
2.2.1 組件化應(yīng)用構(gòu)建
組件系統(tǒng)是 Vue 的另一個(gè)重要概念,因?yàn)樗且环N抽象,允許我們使用小型、獨(dú)立和通??蓮?fù)用的組件構(gòu)建大型應(yīng)用。
在 Vue 里,一個(gè)組件本質(zhì)上是一個(gè)擁有預(yù)定義選項(xiàng)的一個(gè) Vue 實(shí)例
在一個(gè)大型應(yīng)用中,有必要將整個(gè)應(yīng)用程序劃分為組件,以使開發(fā)可管理。
組件(component)是 Vue 最強(qiáng)大的功能之一。組件可以幫助你擴(kuò)展基本的 HTML 元素,以封裝可重用代碼。在較高層面上,組件是 Vue 編譯器附加行為后的自定義元素。在某些情況下,組件也可以是原生 HTML 元素的形式,以特定的 is 特性擴(kuò)展。
組件中,data必須是一個(gè)函數(shù)
組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以是原生 HTML 元素的形式,以 is 特性擴(kuò)展。
2.2.2 響應(yīng)式
當(dāng)一個(gè) Vue 實(shí)例被創(chuàng)建時(shí),它向 Vue 的響應(yīng)式系統(tǒng)中加入了其 data 對(duì)象中能找到的所有的屬性。當(dāng)這些屬性的值發(fā)生改變時(shí),視圖將會(huì)產(chǎn)生“響應(yīng)”,即匹配更新為新的值。
當(dāng)這些數(shù)據(jù)改變時(shí),視圖會(huì)進(jìn)行重渲染。值得注意的是只有當(dāng)實(shí)例被創(chuàng)建時(shí) data 中存在的屬性是響應(yīng)式的。
2.2.3 組件的生命周期
每個(gè) Vue 實(shí)例在被創(chuàng)建之前都要經(jīng)過一系列的初始化過程。例如需要設(shè)置數(shù)據(jù)監(jiān)聽、編譯模板、掛載實(shí)例到 DOM、在數(shù)據(jù)變化時(shí)更新 DOM 等。同時(shí)在這個(gè)過程中也會(huì)運(yùn)行一些叫做生命周期鉤子的函數(shù),給予用戶機(jī)會(huì)在一些特定的場(chǎng)景下添加他們自己的代碼。
比如 created 鉤子可以用來在一個(gè)實(shí)例被創(chuàng)建之后執(zhí)行代碼,也有一些其它的鉤子,在實(shí)例生命周期的不同場(chǎng)景下調(diào)用,如 mounted、updated、destroyed。鉤子的 this 指向調(diào)用它的 Vue 實(shí)例。
生命周期圖示:
2.2.3 組件之間的通信
Vue默認(rèn)的是單向數(shù)據(jù)流,這是Vue直接提出來說明的,父組件默認(rèn)可以向子組件傳遞數(shù)據(jù),但是子組件向父組件傳遞數(shù)據(jù)就需要額外設(shè)置了。
Vue 也支持雙向綁定,默認(rèn)為單向綁定,數(shù)據(jù)從父組件單向傳給子組件。在大型應(yīng)用中使用單向綁定讓數(shù)據(jù)流易于理解。
父子組件之間的數(shù)據(jù)通信是通過Prop和自定義事件實(shí)現(xiàn)的,而非父子組件可以使用訂閱/發(fā)布模式實(shí)現(xiàn)(類似于Angualr中的非父子指令之間的通信),再?gòu)?fù)雜一點(diǎn)也是建議使用狀態(tài)管理(vuex)。
在 Vue 中,父子組件之間的關(guān)系可以概述為:props 向下,events 向上。父組件通過 props 向下傳遞數(shù)據(jù)給子組件,子組件通過 events 發(fā)送消息給父組件。
1.父向子
- 每個(gè)組件實(shí)例都有自己的孤立隔離作用域。也就是說,不能(也不應(yīng)該)直接在子組件模板中引用父組件數(shù)據(jù)。要想在子組件模板中引用父組件數(shù)據(jù),可以使用 props 將數(shù)據(jù)向下傳遞到子組件。
- 每個(gè) prop 屬性,都可以控制是否從父組件的自定義屬性中接收數(shù)據(jù)。子組件需要使用 props 選項(xiàng)顯式聲明 props,以便它可以從父組件接收到期望的數(shù)據(jù)。
- 動(dòng)態(tài)Props,類似于將一個(gè)普通屬性綁定到一個(gè)表達(dá)式,我們還可以使用 v-bind 將 props 屬性動(dòng)態(tài)地綁定到父組件中的數(shù)據(jù)。無論父組件何時(shí)更新數(shù)據(jù),都可以將數(shù)據(jù)向下流入到子組件中
2.子向父
- 使用自定義事件
- 每個(gè) Vue 實(shí)例都接入了一個(gè)事件接口(events interface),也就是說,這些 Vue 實(shí)例可以做到:
- 使用 on(eventName)監(jiān)聽一個(gè)事件?使用emit(eventName) 觸發(fā)一個(gè)事件
3. 非父子組件通信
- 可以使用一個(gè)空的 Vue 實(shí)例作為一個(gè)事件總線中心(central event bus),用emit觸發(fā)事件,on監(jiān)聽事件
3.1 react中的狀態(tài)管理:Flux
Redux 是 React 生態(tài)環(huán)境中最流行的 Flux 實(shí)現(xiàn)。Redux 事實(shí)上無法感知視圖層,所以它能夠輕松的通過一些簡(jiǎn)單綁定和 Vue 一起使用。
創(chuàng)建actions
創(chuàng)建store
創(chuàng)建dispatcher
在view層調(diào)用action中的方法
就是各類component
在dispatcher中通過register來給每個(gè)action注對(duì)應(yīng)的的store中的方法
store中包含應(yīng)用的狀態(tài)和邏輯,用來管理應(yīng)用中不同的狀態(tài)和邏輯,相當(dāng)于Model層
定義動(dòng)作,事件觸發(fā)需要用dispatcher來調(diào)用
行為,如增加操作、刪除操作、更新操作,就是一堆函數(shù)。
3.2 vue中的狀態(tài)管理vuex
vuex借鑒了 Flux、Redux、和 The Elm Architecture。與其他模式不同的是,Vuex 是專門為 Vue.js 設(shè)計(jì)的狀態(tài)管理庫(kù),以利用 Vue.js 的細(xì)粒度數(shù)據(jù)響應(yīng)機(jī)制來進(jìn)行高效的狀態(tài)更新。這使得它能夠更好地和 Vue 進(jìn)行整合,同時(shí)提供簡(jiǎn)潔的 API 和改善過的開發(fā)體驗(yàn)。
組件不允許直接修改屬于 store 實(shí)例的 state,而應(yīng)執(zhí)行 action 來分發(fā) (dispatch) 事件通知 store 去改變,我們最終達(dá)成了 Flux 架構(gòu)。這樣約定的好處是,我們能夠記錄所有 store 中發(fā)生的 state 改變,同時(shí)實(shí)現(xiàn)能做到記錄變更 (mutation)、保存狀態(tài)快照、歷史回滾/時(shí)光旅行的先進(jìn)的調(diào)試工具。
每一個(gè) Vuex 應(yīng)用的核心就是 store(倉(cāng)庫(kù))?!皊tore”基本上就是一個(gè)容器,它包含著你的應(yīng)用中大部分的狀態(tài)
Vuex 和單純的全局對(duì)象有以下兩點(diǎn)不同:
1、Vuex 的狀態(tài)存儲(chǔ)是響應(yīng)式的。當(dāng) Vue 組件從 store 中讀取狀態(tài)的時(shí)候,若 store 中的狀態(tài)發(fā)生變化,那么相應(yīng)的組件也會(huì)相應(yīng)地得到高效更新。
2、你不能直接改變 store 中的狀態(tài)。改變 store 中的狀態(tài)的唯一途徑就是顯式地提交 (commit) mutation。這樣使得我們可以方便地跟蹤每一個(gè)狀態(tài)的變化,從而讓我們能夠?qū)崿F(xiàn)一些工具幫助我們更好地了解我們的應(yīng)用。
3、State
Vuex 使用單一狀態(tài)樹——是的,用一個(gè)對(duì)象就包含了全部的應(yīng)用層級(jí)狀態(tài)。至此它便作為一個(gè)“唯一數(shù)據(jù)源 (SSOT)”而存在。這也意味著,每個(gè)應(yīng)用將僅僅包含一個(gè) store 實(shí)例。單一狀態(tài)樹讓我們能夠直接地定位任一特定的狀態(tài)片段,在調(diào)試的過程中也能輕易地取得整個(gè)當(dāng)前應(yīng)用狀態(tài)的快照。這也意味著,每個(gè)應(yīng)用將僅僅包含一個(gè) store 實(shí)例。
從state中獲取狀態(tài)值,有時(shí)候我們需要從 store 中的 state 中派生出一些狀態(tài),例如對(duì)列表進(jìn)行過濾并計(jì)數(shù)。
1、Mutation
2、Action
3、Module
Action 類似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接變更狀態(tài)。
Action 可以包含任意異步操作。
dispatch分發(fā)action
更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。Vuex 中的 mutation 非常類似于事件:每個(gè) mutation 都有一個(gè)字符串的 事件類型 (type) 和 一個(gè) 回調(diào)函數(shù) (handler)。這個(gè)回調(diào)函數(shù)就是我們實(shí)際進(jìn)行狀態(tài)更改的地方,并且它會(huì)接受 state 作為第一個(gè)參數(shù)。
你不能直接調(diào)用一個(gè) mutation handler。這個(gè)選項(xiàng)更像是事件注冊(cè):“當(dāng)觸發(fā)一個(gè)類型為 increment 的 mutation 時(shí),調(diào)用此函數(shù)?!币獑拘岩粋€(gè) mutation handler,你需要以相應(yīng)的 type 調(diào)用 store.commit 方法
由于使用單一狀態(tài)樹,應(yīng)用的所有狀態(tài)會(huì)集中到一個(gè)比較大的對(duì)象。當(dāng)應(yīng)用變得非常復(fù)雜時(shí),store 對(duì)象就有可能變得相當(dāng)臃腫。
Vuex 允許我們將 store 分割成模塊(module)。每個(gè)模塊擁有自己的 state、mutation、action、getter、甚至是嵌套子模塊——從上至下進(jìn)行同樣方式的分割
兩者的路由很相似,都是利用了組件化思想
4.1 react中的路由
在路由庫(kù)的問題上,React 選擇把問題交給社區(qū)維護(hù),因此創(chuàng)建了一個(gè)更分散的生態(tài)系統(tǒng)。但相對(duì)的,React 的生態(tài)系統(tǒng)相比 Vue 更加繁榮。
react中,需要引入react-router庫(kù),
使用時(shí),路由器Router就是React的一個(gè)組件。
Router組件本身只是一個(gè)容器,真正的路由要通過Route組件定義。
Route組件定義了URL路徑與組件的對(duì)應(yīng)關(guān)系。你可以同時(shí)使用多個(gè)Route組件。
- Link組件用于取代元素,生成一個(gè)鏈接,允許用戶點(diǎn)擊后跳轉(zhuǎn)到另一個(gè)路由。它基本上就是元素的React 版本,可以接收Router的狀態(tài)。
4.2 vue中的路由
Vue 的路由庫(kù)和狀態(tài)管理庫(kù)都是由官方維護(hù)支持且與核心庫(kù)同步更新的。
使用 Vue.js ,我們已經(jīng)可以通過組合組件來組成應(yīng)用程序,當(dāng)你要把 vue-router 添加進(jìn)來,我們需要做的是,將組件(components)映射到路由(routes),然后告訴 vue-router 在哪里渲染它們。
HTML中:
Hello App!
Go to Foo Go to Bar
在操作界面時(shí),要盡量減少對(duì)DOM的操作,Vue 和 React 都使用虛擬DOM來實(shí)現(xiàn),并且兩者工作一樣好。
盡量減少除DOM操作以外的其他操作。(vue和react的不同)
5.1 react視圖渲染
React 的渲染建立在 Virtual DOM 上——一種在內(nèi)存中描述 DOM 樹狀態(tài)的數(shù)據(jù)結(jié)構(gòu)。當(dāng)狀態(tài)發(fā)生變化時(shí),React 重新渲染 Virtual DOM,比較計(jì)算之后給真實(shí) DOM 打補(bǔ)丁。
Virtual DOM 提供了函數(shù)式的方法描述視圖,它不使用數(shù)據(jù)觀察機(jī)制,每次更新都會(huì)重新渲染整個(gè)應(yīng)用,因此從定義上保證了視圖與數(shù)據(jù)的同步。它也開辟了 JavaScript 同構(gòu)應(yīng)用的可能性。
在超大量數(shù)據(jù)的首屏渲染速度上,React 有一定優(yōu)勢(shì),因?yàn)?Vue 的渲染機(jī)制啟動(dòng)時(shí)候要做的工作比較多,而且 React 支持服務(wù)端渲染。
元素是構(gòu)成 React 應(yīng)用的最小單位。元素用來描述你在屏幕上看到的內(nèi)容,與瀏覽器的 DOM 元素不同,React 當(dāng)中的元素事實(shí)上是普通的對(duì)象,React DOM 可以確保 瀏覽器 DOM 的數(shù)據(jù)內(nèi)容與 React 元素保持一致。
我們用React 開發(fā)應(yīng)用時(shí)一般只會(huì)定義一個(gè)根節(jié)點(diǎn)。但如果你是在一個(gè)已有的項(xiàng)目當(dāng)中引入 React 的話,你可能會(huì)需要在不同的部分單獨(dú)定義 React 根節(jié)點(diǎn)。我們將 元素傳入一個(gè)名為 ReactDOM.render() 的方法來將其渲染到頁(yè)面上,頁(yè)面上就會(huì)顯示該元素。
組件渲染
- 當(dāng)React遇到的元素是用戶自定義的組件,它會(huì)將JSX屬性作為單個(gè)對(duì)象傳遞給該組件,這個(gè)對(duì)象稱之為“props”。
5.2 vue視圖渲染
Vue 通過建立一個(gè)虛擬 DOM 對(duì)真實(shí) DOM 發(fā)生的變化保持追蹤。
vue渲染的過程如下:
new Vue,執(zhí)行初始化
掛載$mount方法,通過自定義Render方法、template、el等生成Render函數(shù)
通過Watcher監(jiān)聽數(shù)據(jù)的變化
當(dāng)數(shù)據(jù)發(fā)生變化時(shí),Render函數(shù)執(zhí)行生成VNode對(duì)象
通過patch方法,對(duì)比新舊VNode對(duì)象,通過DOM Diff算法,添加、修改、刪除真正的DOM元素
6.1 react數(shù)據(jù)更新
React 元素都是immutable 不可變的。當(dāng)元素被創(chuàng)建之后,你是無法改變其內(nèi)容或?qū)傩缘?。一個(gè)元素就好像是動(dòng)畫里的一幀,它代表應(yīng)用界面在某一時(shí)間點(diǎn)的樣子。
根據(jù)我們現(xiàn)階段了解的有關(guān) React 知識(shí),更新界面的唯一辦法是創(chuàng)建一個(gè)新的元素,然后將它傳入 ReactDOM.render() 方法
6.2 vue數(shù)據(jù)更新
7.1 react
7.1.1 開發(fā)模式
React本身,是嚴(yán)格的view層,MVC模式
7.1.2 規(guī)模
Vue 提供了Vue-cli 腳手架,能讓你非常容易地構(gòu)建項(xiàng)目,包含了 Webpack,Browserify,甚至 no build system。
7.2 vue
7.2.1 開發(fā)模式
Vue是MVVM模式的一種方式實(shí)現(xiàn)
雖然沒有完全遵循 MVVM 模型,Vue 的設(shè)計(jì)無疑受到了它的啟發(fā)。因此在文檔中經(jīng)常會(huì)使用 vm (ViewModel 的簡(jiǎn)稱) 這個(gè)變量名表示 Vue 實(shí)例。
7.2.2 腳手架
React 提供了create-react-app,但是現(xiàn)在還存在一些局限性:
它不允許在項(xiàng)目生成時(shí)進(jìn)行任何配置,而 Vue 支持 Yeoman-like 定制。
它只提供一個(gè)構(gòu)建單頁(yè)面應(yīng)用的單一模板,而 Vue 提供了各種用途的模板。
它不能用用戶自建的模板構(gòu)建項(xiàng)目,而自建模板對(duì)企業(yè)環(huán)境下預(yù)先建立協(xié)議是特別有用的。
在 React 中,一切都是 JavaScript。不僅僅是 HTML 可以用 JSX 來表達(dá),現(xiàn)在的潮流也越來越多地將 CSS 也納入到 JavaScript 中來處理。這類方案有其優(yōu)點(diǎn),但也存在一些不是每個(gè)開發(fā)者都能接受的取舍。
- Vue 的整體思想是擁抱經(jīng)典的 Web 技術(shù),并在其上進(jìn)行擴(kuò)展。
8.1 react
8.1.1 JSX
在 React 中,所有的組件的渲染功能都依靠 JSX。JSX 是使用 XML 語法編寫 JavaScript 的一種語法糖。
JSX, 一種 JavaScript 的語法擴(kuò)展。 我們推薦在 React 中使用 JSX 來描述用戶界面。JSX 乍看起來可能比較像是模版語言,但事實(shí)上它完全是在 JavaScript 內(nèi)部實(shí)現(xiàn)的。
JSX 用來聲明 React 當(dāng)中的元素。
JSX本身也是一種表達(dá)式,在編譯之后呢,JSX 其實(shí)會(huì)被轉(zhuǎn)化為普通的 JavaScript 對(duì)象。這也就意味著,你其實(shí)可以在 if 或者 for 語句里使用 JSX,將它賦值給變量,當(dāng)作參數(shù)傳入,作為返回值都可以
JSX 說是手寫的渲染函數(shù)有下面這些優(yōu)勢(shì):
你可以使用完整的編程語言 JavaScript 功能來構(gòu)建你的視圖頁(yè)面。比如你可以使用臨時(shí)變量、JS 自帶的流程控制、以及直接引用當(dāng)前 JS 作用域中的值等等。
開發(fā)工具對(duì) JSX 的支持相比于現(xiàn)有可用的其他 Vue 模板還是比較先進(jìn)的 (比如,linting、類型檢查、編輯器的自動(dòng)完成)。
8.1.2 組件作用域內(nèi)的CSS
除非你把組件分布在多個(gè)文件上 (例如 CSS Modules),CSS 作用域在 React 中是通過 CSS-in-JS 的方案實(shí)現(xiàn)的 (比如 styled-components、glamorous 和 emotion)。這引入了一個(gè)新的面向組件的樣式范例,它和普通的 CSS 撰寫過程是有區(qū)別的。另外,雖然在構(gòu)建時(shí)將 CSS 提取到一個(gè)單獨(dú)的樣式表是支持的,但 bundle 里通常還是需要一個(gè)運(yùn)行時(shí)程序來讓這些樣式生效。當(dāng)你能夠利用 JavaScript 靈活處理樣式的同時(shí),也需要權(quán)衡 bundle 的尺寸和運(yùn)行時(shí)的開銷。
8.2 vue
8.2.1 Templates模板語法
事實(shí)上 Vue 也提供了渲染函數(shù),甚至支持 JSX。然而,我們默認(rèn)推薦的還是模板。任何合乎規(guī)范的 HTML 都是合法的 Vue 模板,這也帶來了一些特有的優(yōu)勢(shì):
對(duì)于很多習(xí)慣了 HTML 的開發(fā)者來說,模板比起 JSX 讀寫起來更自然。這里當(dāng)然有主觀偏好的成分,但如果這種區(qū)別會(huì)導(dǎo)致開發(fā)效率的提升,那么它就有客觀的價(jià)值存在。
基于 HTML 的模板使得將已有的應(yīng)用逐步遷移到 Vue 更為容易。
這也使得設(shè)計(jì)師和新人開發(fā)者更容易理解和參與到項(xiàng)目中。
你甚至可以使用其他模板預(yù)處理器,比如 Pug 來書寫 Vue 的模板。
Vue.js 使用了基于 HTML 的模板語法,允許開發(fā)者聲明式地將 DOM 綁定至底層 Vue 實(shí)例的數(shù)據(jù)。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循規(guī)范的瀏覽器和 HTML 解析器解析。
在底層的實(shí)現(xiàn)上,Vue 將模板編譯成虛擬 DOM 渲染函數(shù)。結(jié)合響應(yīng)系統(tǒng),在應(yīng)用狀態(tài)改變時(shí),Vue 能夠智能地計(jì)算出重新渲染組件的最小代價(jià)并應(yīng)用到 DOM 操作上。
8.2.2 單文件組件CSS
Vue 設(shè)置樣式的默認(rèn)方法是單文件組件里類似 style 的標(biāo)簽。
單文件組件讓你可以在同一個(gè)文件里完全控制 CSS,將其作為組件代碼的一部分。
Vue 的單文件組件里的樣式設(shè)置是非常靈活的。通過 vue-loader,你可以使用任意預(yù)處理器、后處理器,甚至深度集成 CSS Modules——全部都在
8.3 小結(jié)
更抽象一點(diǎn)來看,我們可以把組件區(qū)分為兩類:一類是偏視圖表現(xiàn)的 (presentational),一類則是偏邏輯的 (logical)。我們推薦在前者中使用模板,在后者中使用 JSX 或渲染函數(shù)。這兩類組件的比例會(huì)根據(jù)應(yīng)用類型的不同有所變化,但整體來說我們發(fā)現(xiàn)表現(xiàn)類的組件遠(yuǎn)遠(yuǎn)多于邏輯類組件。
9.1 選擇react
9.1.1 期待構(gòu)建一個(gè)大型應(yīng)用程序——選擇React
同時(shí)用Vue和React實(shí)現(xiàn)的簡(jiǎn)單應(yīng)用程序,可能會(huì)讓一個(gè)開發(fā)者潛意識(shí)中更加傾向于Vue。這是因?yàn)榛谀0宓膽?yīng)用程序第一眼看上去更加好理解,而且能很快跑起來。但是這些好處引入的技術(shù)債會(huì)阻礙應(yīng)用擴(kuò)展到更大的規(guī)模。模板容易出現(xiàn)很難注意到的運(yùn)行時(shí)錯(cuò)誤,同時(shí)也很難去測(cè)試,重構(gòu)和分解。
相比之下,Javascript模板可以組織成具有很好的分解性和干(DRY)代碼的組件,干代碼的可重用性和可測(cè)試性更好。Vue也有組件系統(tǒng)和渲染函數(shù),但是React的渲染系統(tǒng)可配置性更強(qiáng),還有諸如淺(shallow)渲染的特性,和React的測(cè)試工具結(jié)合起來使用,使代碼的可測(cè)試性和可維護(hù)性更好。
與此同時(shí),React的immutable應(yīng)用狀態(tài)可能寫起來不夠簡(jiǎn)潔,但它在大型應(yīng)用中意義非凡,因?yàn)橥该鞫群涂蓽y(cè)試性在大型項(xiàng)目中變得至關(guān)重要。
9.1.2 期待同時(shí)適用于Web端和原生APP的框架——選擇React
React Native是一個(gè)使用Javascript構(gòu)建移動(dòng)端原生應(yīng)用程序(iOS,Android)的庫(kù)。 它與React.js相同,只是不使用Web組件,而是使用原生組件。 如果你學(xué)過React.js,很快就能上手React Native,反之亦然。
它的意義在于,開發(fā)者只需要一套知識(shí)和工具就能開發(fā)Web應(yīng)用和移動(dòng)端原生應(yīng)用。如果你想同時(shí)做Web端開發(fā)和移動(dòng)端開發(fā),React為你準(zhǔn)備了一份大禮。
阿里的Weex也是一個(gè)跨平臺(tái)UI項(xiàng)目,目前它以Vue為靈感,使用了許多相同的語法,同時(shí)計(jì)劃在未來完全集成Vue,然而集成的時(shí)間和細(xì)節(jié)還不清楚。因?yàn)閂ue將HTML模板作為它設(shè)計(jì)的核心部分,并且現(xiàn)有特性不支持自定義渲染,因此很難看出目前的Vue.js的跨平臺(tái)能力能像React和React Native一樣強(qiáng)大。
9.1.3 期待最大的生態(tài)系統(tǒng)——選擇React
毫無疑問,React是目前最受歡迎的前端框架。它在NPM上每個(gè)月的下載量超過了250萬次,相比之下,Vue是22.5萬次。人氣不僅僅是一個(gè)膚淺的數(shù)字,這意味著更多的文章,教程和更多Stack Overflow的解答,還意味有著更多的工具和插件可以在項(xiàng)目中使用,讓開發(fā)者不再孤立無援。
這兩個(gè)框架都是開源的,但是React誕生于Facebook,有Facebook背書,它的開發(fā)者和Facebook都承諾會(huì)持續(xù)維護(hù)React。相比之下,Vue是獨(dú)立開發(fā)者尤雨溪的作品。尤雨溪目前在全職維護(hù)Vue,也有一些公司資助Vue,但是規(guī)模和Facebook和Google沒得比。不過請(qǐng)對(duì)Vue的團(tuán)隊(duì)放心,它的小規(guī)模和獨(dú)立性并沒有成為劣勢(shì),Vue有著固定的發(fā)布周期,甚至更令人稱道的是,Github上Vue只有54個(gè)open issue,3456個(gè)closed issue,作為對(duì)比,React有多達(dá)530個(gè)open issue,3447個(gè)closed issue。
9.2 選擇vue
9.2.1 期待模板搭建應(yīng)用——選擇 Vue
Vue應(yīng)用的默認(rèn)選項(xiàng)是把markup放在HTML文件中。數(shù)據(jù)綁定表達(dá)式采用的是和Angular相似的mustache語法,而指令(特殊的HTML屬性)用來向模板添加功能。
相比之下,React應(yīng)用不使用模板,它要求開發(fā)者借助JSX在JavaScript中創(chuàng)建DOM。
對(duì)于來自標(biāo)準(zhǔn)Web開發(fā)方式的新開發(fā)者,模板更容易理解。但是一些資深開發(fā)者也喜歡模板,因?yàn)槟0蹇梢愿玫陌巡季趾凸δ芊指铋_來,還可以使用Pug之類的模板引擎。
但是使用模板的代價(jià)是不得不學(xué)習(xí)所有的HTML擴(kuò)展語法,而渲染函數(shù)只需要會(huì)標(biāo)準(zhǔn)的HTML和JavaScript。而且比起模板,渲染函數(shù)更加容易調(diào)試和測(cè)試。當(dāng)然你不應(yīng)該因?yàn)檫@方面的原因錯(cuò)過Vue,因?yàn)樵赩ue2.0中提供了使用模板或者渲染函數(shù)的選項(xiàng)。
9.2.2 期待簡(jiǎn)單和“能用就行”的東西——選擇 Vue
一個(gè)簡(jiǎn)單的Vue項(xiàng)目可以不需要轉(zhuǎn)譯直接運(yùn)行在瀏覽器中,所以使用Vue可以像使用jQuery一樣簡(jiǎn)單。當(dāng)然這對(duì)于React來說在技術(shù)上也是可行的,但是典型的React代碼是重度依賴于JSX和諸如class之類的ES6特性的。
Vue的簡(jiǎn)單在程序設(shè)計(jì)的時(shí)候體現(xiàn)更深,讓我們來比較一下兩個(gè)框架是怎樣處理應(yīng)用數(shù)據(jù)的(也就是state)。
React中是通過比較當(dāng)前state和前一個(gè)state來決定何時(shí)在DOM中進(jìn)行重渲染以及渲染的內(nèi)容,因此需要不可變(immutable)的state。
Vue中的數(shù)據(jù)是可變(mutated)的,所以同樣的操作看起來更加簡(jiǎn)潔。
讓我們來看看Vue中是如何進(jìn)行狀態(tài)管理的。當(dāng)向state添加一個(gè)新對(duì)象的時(shí)候,Vue將遍歷其中的所有屬性并且轉(zhuǎn)換為getter,setter方法,現(xiàn)在Vue的響應(yīng)系統(tǒng)開始保持對(duì)state的跟蹤了,當(dāng)state中的內(nèi)容發(fā)生變化的時(shí)候就會(huì)自動(dòng)重新渲染DOM。令人稱道的是,Vue中改變state的狀態(tài)的操作不僅更加簡(jiǎn)潔,而且它的重新渲染系統(tǒng)也比React 的更快更有效率。
Vue的響應(yīng)系統(tǒng)還有有些坑的,例如:它不能檢測(cè)屬性的添加和刪除和某些數(shù)組更改。這時(shí)候就要用到Vue API中的類似于React的set方法來解決。
9.2.3 期待應(yīng)用盡可能的小和快——選擇Vue
當(dāng)應(yīng)用程序的狀態(tài)改變時(shí),React和Vue都將構(gòu)建一個(gè)虛擬DOM并同步到真實(shí)DOM中。 兩者都有各自的方法優(yōu)化這個(gè)過程。
Vue核心開發(fā)者提供了一個(gè)benchmark測(cè)試,可以看出Vue的渲染系統(tǒng)比React的更快。測(cè)試方法是10000個(gè)項(xiàng)目的列表渲染100次,結(jié)果如下圖。從實(shí)用的觀點(diǎn)來看,這種benchmark只和邊緣情況有關(guān),大部分應(yīng)用程序中不會(huì)經(jīng)常進(jìn)行這種操作,所以這不應(yīng)該被視為一個(gè)重要的比較點(diǎn)。但是,頁(yè)面大小是與所有項(xiàng)目有關(guān)的,這方面Vue再次領(lǐng)先,它目前的版本壓縮后只有25.6KB。React要實(shí)現(xiàn)同樣的功能,你需要React DOM(37.4KB)和React with Addon庫(kù)(11.4KB),共計(jì)44.8KB,幾乎是Vue的兩倍大。雙倍的體積并不能帶來雙倍的功能。
客戶端渲染路線:1. 請(qǐng)求一個(gè)html -> 2. 服務(wù)端返回一個(gè)html -> 3. 瀏覽器下載html里面的js/css文件 -> 4. 等待js文件下載完成 -> 5. 等待js加載并初始化完成 -> 6. js代碼終于可以運(yùn)行,由js代碼向后端請(qǐng)求數(shù)據(jù)( ajax/fetch ) -> 7. 等待后端數(shù)據(jù)返回 -> 8. react-dom( 客戶端 )從無到完整地,把數(shù)據(jù)渲染為響應(yīng)頁(yè)面
服務(wù)端渲染路線:1. 請(qǐng)求一個(gè)html -> 2. 服務(wù)端請(qǐng)求數(shù)據(jù)( 內(nèi)網(wǎng)請(qǐng)求快 ) -> 3. 服務(wù)器初始渲染(服務(wù)端性能好,較快) -> 4. 服務(wù)端返回已經(jīng)有正確內(nèi)容的頁(yè)面 -> 5. 客戶端請(qǐng)求js/css文件 -> 6. 等待js文件下載完成 -> 7. 等待js加載并初始化完成 -> 8. react-dom( 客戶端 )把剩下一部分渲染完成( 內(nèi)容小,渲染快 )
10.1 react
React的虛擬DOM是其可被用于服務(wù)端渲染的關(guān)鍵。首先每個(gè)ReactComponent 在虛擬DOM中完成渲染,然后React通過虛擬DOM來更新瀏覽器DOM中產(chǎn)生變化的那一部分,虛擬DOM作為內(nèi)存中的DOM表現(xiàn),為React在Node.js這類非瀏覽器環(huán)境下的吮吸給你提供了可能,React可以從虛擬DoM中生成一個(gè)字符串。而不是跟新真正的DOM,這使得我們可以在客戶端和服務(wù)端使用同一個(gè)React Component。
React 提供了兩個(gè)可用于服務(wù)端渲染組件的函數(shù):React.renderToString 和React.render-ToStaticMarkup。 在設(shè)計(jì)用于服務(wù)端渲染的ReactComponent時(shí)需要有預(yù)見性,考慮以下方面。
選取最優(yōu)的渲染函數(shù)。
如何支持組件的異步狀態(tài)。
如何將應(yīng)用的初始化狀態(tài)傳遞到客戶端。
哪些生命周期函數(shù)可以用于服務(wù)端的渲染。
如何為應(yīng)用提供同構(gòu)路由支持。
單例、實(shí)例以及上下文的用法。
10.2 vue
1. 什么是服務(wù)器端渲染(SSR)?
Vue.js 是構(gòu)建客戶端應(yīng)用程序的框架。默認(rèn)情況下,可以在瀏覽器中輸出 Vue 組件,進(jìn)行生成 DOM 和操作 DOM。然而,也可以將同一個(gè)組件渲染為服務(wù)器端的 HTML 字符串,將它們直接發(fā)送到瀏覽器,最后將靜態(tài)標(biāo)記”混合”為客戶端上完全交互的應(yīng)用程序。
服務(wù)器渲染的 Vue.js 應(yīng)用程序也可以被認(rèn)為是”同構(gòu)”或”通用”,因?yàn)閼?yīng)用程序的大部分代碼都可以在服務(wù)器和客戶端上運(yùn)行。
2. 服務(wù)器端渲染優(yōu)勢(shì)
- 更好的 SEO,由于搜索引擎爬蟲抓取工具可以直接查看完全渲染的頁(yè)面。
- 更快的內(nèi)容到達(dá)時(shí)間(time-to-content),特別是對(duì)于緩慢的網(wǎng)絡(luò)情況或運(yùn)行緩慢的設(shè)備。無需等待所有的 JavaScript 都完成下載并執(zhí)行,才顯示服務(wù)器渲染的標(biāo)記,所以你的用戶將會(huì)更快速地看到完整渲染的頁(yè)面。通??梢援a(chǎn)生更好的用戶體驗(yàn),并且對(duì)于那些「內(nèi)容到達(dá)時(shí)間(time-to-content)與轉(zhuǎn)化率直接相關(guān)」的應(yīng)用程序而言,服務(wù)器端渲染(SSR)至關(guān)重要。
1. 把UI圖劃分出組件層級(jí)
2. 用React創(chuàng)建一個(gè)靜態(tài)版本
傳入數(shù)據(jù)模型,渲染 UI 但沒有任何交互。最好把這些過程解耦,因?yàn)閯?chuàng)建一個(gè)靜態(tài)版本更多需要的是碼代碼,不太需要邏輯思考,而添加交互則更多需要的是邏輯思考,不是碼代碼。
在創(chuàng)建靜態(tài)版本的時(shí)候不要使用 state。
你可以自頂向下或者自底向上構(gòu)建應(yīng)用。也就是,你可以從層級(jí)最高的組件開始構(gòu)建(即 FilterableProductTable開始)或?qū)蛹?jí)最低的組件開始構(gòu)建(ProductRow)。在較為簡(jiǎn)單的例子中,通常自頂向下更容易,而在較大的項(xiàng)目中,自底向上會(huì)更容易并且在你構(gòu)建的時(shí)候有利于編寫測(cè)試。
React 的單向數(shù)據(jù)流(也叫作單向綁定)保證了一切是模塊化并且是快速的。
3. 定義 UI 狀態(tài)的最小(但完整)表示
想想實(shí)例應(yīng)用中的數(shù)據(jù),讓我們來看看每一條,找出哪一個(gè)是 state。每個(gè)數(shù)據(jù)只要考慮三個(gè)問題:
它是通過 props 從父級(jí)傳來的嗎?如果是,他可能不是 state。
它隨著時(shí)間推移不變嗎?如果是,它可能不是 state。
你能夠根據(jù)組件中任何其他的 state 或 props 把它計(jì)算出來嗎?如果是,它不是 state。
4. 確定你的State應(yīng)該位于哪里
對(duì)你應(yīng)用的每一個(gè) state:
確定每一個(gè)需要這個(gè) state 來渲染的組件。
找到一個(gè)公共所有者組件(一個(gè)在層級(jí)上高于所有其他需要這個(gè) state 的組件的組件)
這個(gè)公共所有者組件或另一個(gè)層級(jí)更高的組件應(yīng)該擁有這個(gè) state。
如果你沒有找到可以擁有這個(gè) state 的組件,創(chuàng)建一個(gè)僅用來保存狀態(tài)的組件并把它加入比這個(gè)公共所有者組件層級(jí)更高的地方。
5. 添加反向數(shù)據(jù)流
小結(jié)
總結(jié)一下,我們發(fā)現(xiàn),
Vue的優(yōu)勢(shì)包括:
- 模板和渲染函數(shù)的彈性選擇
- 簡(jiǎn)單的語法及項(xiàng)目創(chuàng)建
- 更快的渲染速度和更小的體積
React的優(yōu)勢(shì)包括:
- 更適用于大型應(yīng)用和更好的可測(cè)試性
- 同時(shí)適用于Web端和原生App
- 更大的生態(tài)圈帶來的更多支持和工具
- 而實(shí)際上,React和Vue都是非常優(yōu)秀的框架,它們之間的相似之處多過不同之處,并且它們大部分最棒的功能是相通的:
- 利用虛擬DOM實(shí)現(xiàn)快速渲染
- 輕量級(jí)
- 響應(yīng)式和組件化
- 服務(wù)器端渲染
- 易于集成路由工具,打包工具以及狀態(tài)管理工具
- 優(yōu)秀的支持和社區(qū)
看完了這篇文章,相信你對(duì)“reactjs和vuejs有哪些區(qū)別”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!