vue與react對(duì)比

目錄

  • 相同點(diǎn)
  • 不同點(diǎn)
    • DOM編寫
    • 組件作用域內(nèi)的CSS
    • 狀態(tài)管理
    • 優(yōu)化
    • 代碼分離
    • 開發(fā)框架
  • npm下載量對(duì)比
  • 優(yōu)缺點(diǎn)對(duì)比
  • 大廠使用案例

vue及react都是用來構(gòu)建用戶界面的JS框架. 它們?cè)诤芏嘟鉀Q關(guān)鍵問題的點(diǎn)上都是相通的, 不同點(diǎn)只在于細(xì)節(jié)上的一些差別. 本文主要針對(duì)不同點(diǎn)來詳細(xì)作對(duì)比說明.

相同點(diǎn)

兩者大部分主要功能是相同的, 如下:

  • 虛擬DOM, 快速修改DOM
  • 組件化開發(fā)
  • 響應(yīng)式組件
  • 服務(wù)端渲染
  • 應(yīng)用開發(fā)全家桶: 路由 + 狀態(tài)管理 + 打包等

不同點(diǎn)

1. DOM編寫

vue采用模板語法,react采用JSX來編寫DOM, 模板語法是在HTML中加入一些賦值markup,而JSX語法是將JS代碼與DOM標(biāo)簽混合在一起使用. 對(duì)于沒有接觸過兩者的前端開發(fā)來說,模板語法更容易理解,上手快,且結(jié)構(gòu)簡單,編寫容易. 具體區(qū)別見下面的例子:

a) VUE模板語法

采用HTML + moustache(雙大括號(hào)賦值) + 指令的模板語法, 易學(xué),簡單,上手非趁岢簦快.(也支持JSX, 但推薦使用模板語法)

指令: 接收表達(dá)式,當(dāng)表達(dá)式變化時(shí),響應(yīng)式的作用在DOM上.

例子:

<div class="todo-list">
  <h3>待辦列表</h3>
  <ul class="todo-ul">
    <li v-for="(item, key, index) in todoList" :key="key" 
      :id="key" @click="clickTask(key)" :class="{success: item.status}">
      {{ index+1 }}. {{ item.content }} 
      <span v-if="item.status">(完成)</span>
      <span class="create-time">{{ item.createTime}}</span>
    </li>
  </ul>
</div>

上面例子中使用到的模板語法解釋:

  • v-for: 循環(huán)指令, 遍歷todoList對(duì)象
  • @click: v-on:click的縮寫,綁定點(diǎn)擊事件
  • :class: v-bind:class的縮寫,表示item.status為true時(shí),添加success到li的class
  • {{}}: 大括號(hào)賦值語句, 可以接收表達(dá)式
  • v-if: 條件判斷,當(dāng)值為true時(shí),該DOM才顯示

b) react JSX語法

例子:

<div className="todo-list">
  <h3>待辦列表</h3>
  <ul class="todo-ul">
    {Object.keys(todoList).forEach((k, i) => (
      <li key={i} id={k} onClick={() => {this.clickTask(k)}}
        className={todoList[k].status?'success':''}>
        {i}. {todoList[k].content}
        {todoList[k].status && <span>(完成)</span>}
        <span class="create-time">{{ todoList[k].createTime}}</span>
      </li>
    ))}
  </ul>
</div>

jsx語法將JS邏輯與DOM標(biāo)簽混在一起,學(xué)習(xí)成本會(huì)比較高,對(duì)比模板語法來說編寫也復(fù)雜一些.

2. 組件作用域內(nèi)的CSS

vue組件作用域的CSS, 還是寫在style標(biāo)簽中, 用正常的CSS語法即可. 而react是采用css in js的思想, 用JS的思想來寫CSS. 具體區(qū)別參考下面的例子:

a) vue的組件作用域內(nèi)的CSS

例子:

<style scoped>
    div {
        color: red;
    }
</style>
// 渲染出來后如下
div[data-v-20de4a82] {
    color: red
}

vue組件作用域的CSS, 只需要在組件內(nèi)部的style標(biāo)簽中添加scoped屬性即可, 渲染出來的css會(huì)在組件的對(duì)應(yīng)標(biāo)簽上添加一個(gè)"data-"開頭的唯一屬性, 并作為CSS的選擇定位符

b) react的組件作用域內(nèi)的CSS

例子:

// style對(duì)象
const styles = {color: red, fontSize: '14px'}
// JSX
<div style={styles}></div>

react組件作用域的CSS, 用JS來寫時(shí), 需要將css中以中橫線連接的屬性換成駝峰的形式, 還是比較麻煩的.

3. 狀態(tài)管理

vue中的state, 對(duì)于非對(duì)象類型的數(shù)據(jù)修改可直接采用賦值的方式修改, 復(fù)雜的對(duì)象類型的屬性添加才需要用vue的set方法來操作. react的state必須使用state.set方法進(jìn)行操作, 具體區(qū)別參考下面的例子:

a) vue操作state

例子:

// state結(jié)構(gòu)如下
data: {
    flag: true,
    obj: {
        a: 1
    }
}
// 修改flag的值
this.flag = false
// 修改obj.a的值
this.obj.a = 2
// 向obj中添加一個(gè)新的屬性b
this.$set(this.obj, b, 'b1')

可以看出vue操作大部分的state都是非常簡單的

b) react操作state

例子:

// state結(jié)構(gòu)如下
state = {
    flag: true,
    obj: {
        a: 1
    }
}
// 修改flag
this.setState({flag: false})
// 修改obj.a的值
this.setState({obj: {a: 2}})
// 向obj中添加一個(gè)新的屬性b
let obj = this.state.obj;
obj.b = 'b1';
this.setState({obj})

react中操作state都需要使用setState方法

4. 優(yōu)化

react中, 只要state變化, 組件及子組件都會(huì)走render方法去看是否需要更新DOM, 當(dāng)你需要考慮怎么來優(yōu)化這個(gè)點(diǎn)時(shí), 而vue卻不存在這樣的問題

react的優(yōu)化方式是當(dāng)組件的state不常變化時(shí),可以考慮使用pureComponenet. 或者自己在shouldComponentUpdate生命周期的方法中判斷該組件的props有沒有變化, 當(dāng)shouldComponentUpdate方法返回false時(shí), 將直接返回跳過后續(xù)的生命周期方法. 使用這個(gè)方法的前提是, 子組件DOM的變化全部由props決定.

vue框架內(nèi)部已經(jīng)對(duì)此做了優(yōu)化, 開發(fā)者不需要考慮該類問題, 只需要關(guān)注自己的應(yīng)用本身就可以了.

5. 代碼分離

在單頁應(yīng)用中, 代碼分離是指除公共資源外, 頁面只加載當(dāng)前頁面自己的JS代碼, 也就是按需加載.

vue的代碼分離很簡單, 只需要在路由的component中改用函數(shù)返回import()方法導(dǎo)入的異步組件. 而react相對(duì)就比較繁瑣, 需要借助react-loadable. 具體差別見下面的例子:

a) vue的代碼分離

步驟:

1. 安裝babel插件: npm install @babel/plugin-syntax-dynamic-import --save-dev
2. 在.babelrc中添加該插件
3. vue-router路由中, component加載改用import()方法:
{ path: '/todo', component: () => import('./module/todo/Index.vue') }

b) react的代碼分離

步驟:

1. 安裝babel插件: npm install @babel/plugin-syntax-dynamic-import --save-dev
2. 在.babelrc中添加該插件
3. 組件加載需要借用react-loadable插件: npm install react-loadable --save-dev:
{
  path: '/todo',
  component: Loadable({
    loader: () => import('./module/todo/Index.vue'),
    loading: (props) => null
  })
}

6. 開發(fā)框架

vue官方提供的vue-cli非常強(qiáng)大, 使用vue-cli 能非常方便的創(chuàng)建一個(gè)vue的開發(fā)框架, 創(chuàng)建的框架內(nèi)部對(duì)webpack已經(jīng)做了優(yōu)化配制. 若你需要改變webpack的配制也非常方便, 只需要在vue.config.js中按要求添加你的配制就可以了. 這種方式非常適合初學(xué)者, 不需要去關(guān)注webpack繁瑣的配制項(xiàng).

react官方也有提供react-create-cli來創(chuàng)建一個(gè)開發(fā)框架, 但功能只限于此, 想要根據(jù)自己的項(xiàng)目需求來搭建框架你還是得去學(xué)習(xí)webpack的復(fù)雜配制.

npm下載量對(duì)比

以下是從npm官網(wǎng)弄下來的最近一年的周下載量, 每一個(gè)點(diǎn)是當(dāng)前日期往后一個(gè)星期的下載量. 可以看出兩個(gè)框架的使用量都在增加, vue現(xiàn)在每周的下載量是一年前的3倍左右, react是一年前的2倍左右. vue使用量增長還是比較快的.


npm下載量

優(yōu)缺點(diǎn)對(duì)比

綜合上面不同點(diǎn)的分析, 總結(jié)出優(yōu)缺點(diǎn)如下:

1. vue相比于react優(yōu)點(diǎn)如下:

vue react
html 模板語法,上手快 JSX語法, 學(xué)習(xí)成本高
組件作用域內(nèi)的CSS 直接style標(biāo)簽添加scoped屬性, css還是原生的css語法 css in js, js思想來寫css, 有轉(zhuǎn)換成本
狀態(tài)管理 簡單屬性直接賦值操作 必須調(diào)用setState方法來操作state
渲染優(yōu)化 vue不需要考慮 采用pureComponent, 還有很多限制及坑
代碼分離 非常簡單, 只需要改用import()方法來加載組件 需要借用第三方插件,書寫也很繁瑣
開發(fā)框架 vue-cli非常方便的搭建可擴(kuò)展的開發(fā)框架 需要去熟悉webpack的各種配制
開發(fā)習(xí)慣 更接近原生的前端開發(fā)模式: HTML CSS JS 一切都是JS, 開發(fā)模塊的方式更接近后端語言
學(xué)習(xí)成本 上手快,更接近原生的前端語言 復(fù)雜度高, 上手慢, 學(xué)習(xí)成本高

2. vue相比于react缺點(diǎn)如下:

  • html模板語法不利于調(diào)式
  • 生態(tài)圈, 使用react的人相對(duì)較多, react的社區(qū)會(huì)更大 對(duì)應(yīng)的開源出來的react組件也會(huì)比較多
  • 原生APP的支持,react有比較成熟的react-native.雖然vue也有Weex, 但還不太完善.

大廠使用案例

使用vue的案例:

網(wǎng)站 地址
餓了么 https://h5.ele.me/
簡書 http://www.reibang.com/
手機(jī)搜狐網(wǎng) http://m.sohu.com/
bilibili直播 https://live.bilibili.com

使用react的網(wǎng)站:

網(wǎng)站 地址
facebook www.facebook.com
uber https://www.uber.com/hk/zh-hk/
antd https://ant.design/
知乎 https://www.zhihu.com/signup?next=%2F
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甫菠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忍啤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡狠轻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門彬犯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來向楼,“玉大人,你說我怎么就攤上這事谐区『桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵宋列,是天一觀的道長昭抒。 經(jīng)常有香客問我,道長虚茶,這世上最難降的妖魔是什么戈鲁? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮嘹叫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诈乒。我一直安慰自己罩扇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布怕磨。 她就那樣靜靜地躺著喂饥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肠鲫。 梳的紋絲不亂的頭發(fā)上员帮,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音导饲,去河邊找鬼捞高。 笑死氯材,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的硝岗。 我是一名探鬼主播氢哮,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼型檀!你這毒婦竟也來了冗尤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤胀溺,失蹤者是張志新(化名)和其女友劉穎裂七,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仓坞,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碍讯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扯躺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捉兴。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖录语,靈堂內(nèi)的尸體忽然破棺而出倍啥,到底是詐尸還是另有隱情,我是刑警寧澤澎埠,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布虽缕,位于F島的核電站,受9級(jí)特大地震影響蒲稳,放射性物質(zhì)發(fā)生泄漏氮趋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一江耀、第九天 我趴在偏房一處隱蔽的房頂上張望剩胁。 院中可真熱鬧,春花似錦祥国、人聲如沸昵观。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啊犬。三九已至,卻和暖如春壁查,著一層夾襖步出監(jiān)牢的瞬間觉至,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工睡腿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留语御,地道東北人峻贮。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像沃暗,于是被迫代替她去往敵國和親月洛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Vue也已經(jīng)升級(jí)到2.0版本了孽锥,到現(xiàn)在為止(2016/11/19)比較流行的MVVM框架有AngularJS(也有...
    彬_仔閱讀 27,222評(píng)論 12 114
  • React.js 小書學(xué)習(xí) 之 【使用 JSX 描述 UI 信息】 從 JSX 到頁面 過程圖解:JSX 到頁面過...
    zdlucky閱讀 1,279評(píng)論 0 20
  • 勇氣惜辑,優(yōu)雅說“不”的力量唬涧。 從現(xiàn)在回顧到自己能記事時(shí)開始,自我和外界對(duì)“我”的評(píng)價(jià)結(jié)合起來是“這個(gè)人很講感情盛撑,很重...
    Rogerchan2018閱讀 176評(píng)論 0 0
  • 都知道秋天是成魚養(yǎng)殖階段魚長膘育肥的最佳時(shí)候抵卫,但是今年受到連續(xù)臺(tái)風(fēng)的影響狮荔,入秋后雨水不斷(已經(jīng)持續(xù)一周多了,好像還...
    金山魚閱讀 283評(píng)論 0 0
  • 1、簡歷是什么鬼姻采? 寫簡歷是所有職場人無論新老都需要完成的一個(gè)步驟雅采,從大學(xué)畢業(yè)到社會(huì)尋找第一份工作要寫簡歷,從一家...
    思雨有約閱讀 246評(píng)論 0 0