vue介紹以及相關概念理解大全


1.什么是vue

以官網的解釋來說,vue是漸進式javascript框架。Vue (讀音 /vjuː/,類似於 view) 是一套用於構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注視圖層,不僅易於上手,還便於與第三方庫或既有項目整合。另一方面,當與現代化的工具鏈以及各種支持類庫結合使用時,Vue 也完全能夠為復雜的單頁應用提供驅動。

2.特點

核心只關注視圖(view)

易學,輕量,靈活

適用於移動端項目

漸進式框架 

3.漸進式框架的理解       

在我看來,漸進式代表的含義是:主張最少。
每個框架都不可避免會有自己的一些特點,從而會對使用者有一定的要求,這些要求就是主張,主張有強有弱,它的強勢程度會影響在業務開發中的使用方式。
比如說,Angular,它兩個版本都是強主張的,如果你用它,必須接受以下東西:
- 必須使用它的模塊機制- 必須使用它的依賴注入- 必須使用它的特殊形式定義組件(這一點每個視圖框架都有,難以避免)

所以Angular是帶有比較強的排它性的,如果你的應用不是從頭開始,而是要不斷考慮是否跟其他東西集成,這些主張會帶來一些困擾。

比如React,它也有一定程度的主張,它的主張主要是函數式編程的理念,比如說,你需要知道什么是副作用,什么是純函數,如何隔離副作用。它的侵入性看似沒有Angular那么強,主要因為它是軟性侵入。

Vue可能有些方面是不如React,不如Angular,但它是漸進的,沒有強主張,你可以在原有大系統的上面,把一兩個組件改用它實現,當jQuery用;也可以整個用它全家桶開發,當Angular用;還可以用它的視圖,搭配你自己設計的整個下層用。你可以在底層數據邏輯的地方用OO和設計模式的那套理念,也可以函數式,都可以,它只是個輕量視圖而已,只做了自己該做的事,沒有做不該做的事,僅此而已。
漸進式的含義,我的理解是:沒有多做職責之外的事。

4.兩個核心點

1.響應的數據變化
        當數據發生變化----視圖自動更新
2.組合的視圖組件
        UI頁面映射為組件樹
        划分組件可維護、可復用、可測試

5.MVVM

MVVM分為三個部分:分別是M(Model,模型層 ),V(View,視圖層),VM(ViewModel,V與M連接的橋梁,也可以看作為控制器)
1、 M:模型層,主要負責業務數據相關;
2、 V:視圖層,顧名思義,負責視圖相關,細分下來就是html+css層;
3、 VM:V與M溝通的橋梁,負責監聽M或者V的修改,是實現MVVM雙向綁定的要點;

MVVM支持雙向綁定,意思就是當M層數據進行修改時,VM層會監測到變化,並且通知V層進行相應的修改,反之修改V層則會通知M層數據進行修改,以此也實現了視圖與模型層的相互解耦;

 6.數據的雙向綁定與單項綁定

雙向數據綁定和單向數據綁定解釋:

a. 單向數據綁定
  指的是我們先把模板寫好,然后把模板和數據(數據可能來自后台)整合到一起形成HTML代碼,然后把這段HTML代碼插入到文檔流里面。
單向數據綁定缺點:HTML代碼一旦生成完以后,就沒有辦法再變了,如果有新的數據來了,那就必須把之前的HTML代碼去掉,再重新把新的數據和模板一起整合后插入到文檔流中。 簡單的來說就是DOM操作直接改變

b. 數據數據雙向
  數據模型(Module)和視圖(View)之間的雙向綁定。
用戶在視圖上的修改會自動同步到數據模型中去,同樣的,如果數據模型中的值發生了變化,也會立刻同步到視圖中去。雙向數據綁定的優點是無需進行和單向數據綁定的那CRUD(Create,Retrieve,Update,Delete)操作雙向數據綁定最經常的應用場景就是表單了,這樣當用戶在前端頁面完成輸入后,不用任何操作,我們就已經拿到了用戶的數據存放到數據模型中了。

在react中是單向數據綁定,而在vue和augular中的特色是雙向數據綁定。為什么會選擇兩種不同的機制呢?我猜測是兩種不同的機制有不同的適應場景,查了一些資料后,總結一下。

一、各自優勢

雙向數據綁定給人的最大的優越感就是方便。當數據data發生變化時,頁面自動發生更新。但是有一個缺點也是因為自動更新而導致的,因為這樣你就不知道data什么時候變了,也不知道是誰變了,變化后也不會通知你,當然你可以watch來監聽data的變化,但是這變復雜了,還不如單向數據綁定。

Vuex推薦單向綁定就是為了[控制欲]!,雖然單向綁定犧牲了一部分便捷性,換來的是更大的[控制力]

除此之外單向數據綁定對於復雜應用來說是實施統一的狀態管理,方便跟蹤。

二、單向數據與雙向數據關系

單向數據綁定的實現思路:

  1. 所有數據只有一份
  2. 一旦數據變化,就去更新頁面(data-頁面),但是沒有(頁面-data)
  3. 如果用戶在頁面上做了變動,那么就手動收集起來(雙向是自動),合並到原有的數據中。

其實單向綁定也有雙向綁定的意味,不過頁面變動后數據的變化不會自動更新。方神解析了這個魔法:雙向綁定 = 單向綁定 + UI事件監聽。請看下面的代碼示例

vue數據雙向綁定

復制代碼
<body>
  <div id="app">
    <input type="text" v-model="meg">
    <p>{{data}}</p>
  </div>
 
  <script>
    var app = new Vue({
      el:'#app',
      data :{
        meg:''
      }
     
    })
  </script>
</body>
復制代碼

當你在頁面的input框中輸入值時,下面一行同步顯示內容,如果我們不要v-model指令能實現這個效果嗎? 只需要改為:

 //首先設置value屬性為meg,然后監聽輸入事件
<input type="text" :value="meg" @input="meg=$event.target.value"> 

同樣也實現了雙向數據綁定,所以它並不是什么黑魔法!

7.VUE對比其他框架   

引用至vue官網  如果沒耐心看 請直接下拉到我的總結.

React 和 Vue 有許多相似之處,它們都有:

  • 使用 Virtual DOM
  • 提供了響應式 (Reactive) 和組件化 (Composable) 的視圖組件。
  • 將注意力集中保持在核心庫,而將其他功能如路由和全局狀態管理交給相關的庫。

由於有着眾多的相似處,我們會用更多的時間在這一塊進行比較。這里我們不只保證技術內容的准確性,同時也兼顧了平衡的考量。我們需要承認 React 比 Vue 更好的地方,比如更豐富的生態系統。

運行時性能

React 和 Vue 都是非常快的,所以速度並不是在它們之中做選擇的決定性因素。

優化

在 React 應用中,當某個組件的狀態發生變化時,它會以該組件為根,重新渲染整個組件子樹。

如要避免不必要的子組件的重渲染,你需要在所有可能的地方使用 PureComponent,或是手動實現 shouldComponentUpdate 方法。同時你可能會需要使用不可變的數據結構來使得你的組件更容易被優化。

然而,使用 PureComponent 和 shouldComponentUpdate 時,需要保證該組件的整個子樹的渲染輸出都是由該組件的 props 所決定的。如果不符合這個情況,那么此類優化就會導致難以察覺的渲染結果不一致。這使得 React 中的組件優化伴隨着相當的心智負擔。

在 Vue 應用中,組件的依賴是在渲染過程中自動追蹤的,所以系統能精確知曉哪個組件確實需要被重渲染。你可以理解為每一個組件都已經自動獲得了 shouldComponentUpdate,並且沒有上述的子樹問題限制。

Vue 的這個特點使得開發者不再需要考慮此類優化,從而能夠更好地專注於應用本身。

HTML & CSS

在 React 中,一切都是 JavaScript。不僅僅是 HTML 可以用 JSX 來表達,現在的潮流也越來越多地將 CSS 也納入到 JavaScript 中來處理。這類方案有其優點,但也存在一些不是每個開發者都能接受的取舍。

Vue 的整體思想是擁抱經典的 Web 技術,並在其上進行擴展。我們下面會詳細分析一下。

JSX vs Templates

在 React 中,所有的組件的渲染功能都依靠 JSX。JSX 是使用 XML 語法編寫 JavaScript 的一種語法糖。

使用 JSX 的渲染函數有下面這些優勢:

  • 你可以使用完整的編程語言 JavaScript 功能來構建你的視圖頁面。比如你可以使用臨時變量、JS 自帶的流程控制、以及直接引用當前 JS 作用域中的值等等。

  • 開發工具對 JSX 的支持相比於現有可用的其他 Vue 模板還是比較先進的 (比如,linting、類型檢查、編輯器的自動完成)。

事實上 Vue 也提供了渲染函數,甚至支持 JSX。然而,我們默認推薦的還是模板。任何合乎規范的 HTML 都是合法的 Vue 模板,這也帶來了一些特有的優勢:

  • 對於很多習慣了 HTML 的開發者來說,模板比起 JSX 讀寫起來更自然。這里當然有主觀偏好的成分,但如果這種區別會導致開發效率的提升,那么它就有客觀的價值存在。

  • 基於 HTML 的模板使得將已有的應用逐步遷移到 Vue 更為容易。

  • 這也使得設計師和新人開發者更容易理解和參與到項目中。

  • 你甚至可以使用其他模板預處理器,比如 Pug 來書寫 Vue 的模板。

有些開發者認為模板意味着需要學習額外的 DSL (Domain-Specific Language 領域特定語言) 才能進行開發——我們認為這種區別是比較膚淺的。首先,JSX 並不是沒有學習成本的——它是基於 JS 之上的一套額外語法。同時,正如同熟悉 JS 的人學習 JSX 會很容易一樣,熟悉 HTML 的人學習 Vue 的模板語法也是很容易的。最后,DSL 的存在使得我們可以讓開發者用更少的代碼做更多的事,比如 v-on 的各種修飾符,在 JSX 中實現對應的功能會需要多得多的代碼。

更抽象一點來看,我們可以把組件區分為兩類:一類是偏視圖表現的 (presentational),一類則是偏邏輯的 (logical)。我們推薦在前者中使用模板,在后者中使用 JSX 或渲染函數。這兩類組件的比例會根據應用類型的不同有所變化,但整體來說我們發現表現類的組件遠遠多於邏輯類組件。

組件作用域內的 CSS

除非你把組件分布在多個文件上 (例如 CSS Modules),CSS 作用域在 React 中是通過 CSS-in-JS 的方案實現的 (比如 styled-components、glamorous 和 emotion)。這引入了一個新的面向組件的樣式范例,它和普通的 CSS 撰寫過程是有區別的。另外,雖然在構建時將 CSS 提取到一個單獨的樣式表是支持的,但 bundle 里通常還是需要一個運行時程序來讓這些樣式生效。當你能夠利用 JavaScript 靈活處理樣式的同時,也需要權衡 bundle 的尺寸和運行時的開銷。

如果你是一個 CSS-in-JS 的愛好者,許多主流的 CSS-in-JS 庫也都支持 Vue (比如 styled-components-vue 和 vue-emotion)。這里 React 和 Vue 主要的區別是,Vue 設置樣式的默認方法是單文件組件里類似 style 的標簽。

單文件組件讓你可以在同一個文件里完全控制 CSS,將其作為組件代碼的一部分。

<style scoped> @media (min-width: 250px) { .list-container:hover { background: orange; } } </style>

這個可選 scoped 屬性會自動添加一個唯一的屬性 (比如 data-v-21e5b78) 為組件內 CSS 指定作用域,編譯的時候 .list-container:hover 會被編譯成類似 .list-container[data-v-21e5b78]:hover

最后,Vue 的單文件組件里的樣式設置是非常靈活的。通過 vue-loader,你可以使用任意預處理器、后處理器,甚至深度集成 CSS Modules——全部都在 <style> 標簽內。

規模

向上擴展

Vue 和 React 都提供了強大的路由來應對大型應用。React 社區在狀態管理方面非常有創新精神 (比如 Flux、Redux),而這些狀態管理模式甚至 Redux 本身也可以非常容易的集成在 Vue 應用中。實際上,Vue 更進一步地采用了這種模式 (Vuex),更加深入集成 Vue 的狀態管理解決方案 Vuex 相信能為你帶來更好的開發體驗。

兩者另一個重要差異是,Vue 的路由庫和狀態管理庫都是由官方維護支持且與核心庫同步更新的。React 則是選擇把這些問題交給社區維護,因此創建了一個更分散的生態系統。但相對的,React 的生態系統相比 Vue 更加繁榮。

最后,Vue 提供了 CLI 腳手架,能讓你通過交互式的腳手架引導非常容易地構建項目。你甚至可以使用它快速開發組件的原型。React 在這方面也提供了 create-react-app,但是現在還存在一些局限性:

  • 它不允許在項目生成時進行任何配置,而 Vue CLI 運行於可升級的運行時依賴之上,該運行時可以通過插件進行擴展。
  • 它只提供一個構建單頁面應用的默認選項,而 Vue 提供了各種用途的模板。
  • 它不能用用戶自建的預設配置構建項目,這對企業環境下預先建立約定是特別有用的。

而要注意的是這些限制是故意設計的,這有它的優勢。例如,如果你的項目需求非常簡單,你就不需要自定義生成過程。你能把它作為一個依賴來更新。如果閱讀更多關於不同的設計理念

向下擴展

React 學習曲線陡峭,在你開始學 React 前,你需要知道 JSX 和 ES2015,因為許多示例用的是這些語法。你需要學習構建系統,雖然你在技術上可以用 Babel 來實時編譯代碼,但是這並不推薦用於生產環境。

就像 Vue 向上擴展好比 React 一樣,Vue 向下擴展后就類似於 jQuery。你只要把如下標簽放到頁面就可以運行:

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

然后你就可以編寫 Vue 代碼並應用到生產中,你只要用 min 版 Vue 文件替換掉就不用擔心其他的性能問題。

由於起步階段不需學 JSX,ES2015 以及構建系統,所以開發者只需不到一天的時間閱讀指南就可以建立簡單的應用程序。

原生渲染

React Native 能使你用相同的組件模型編寫有本地渲染能力的 APP (iOS 和 Android)。能同時跨多平台開發,對開發者是非常棒的。相應地,Vue 和 Weex 會進行官方合作,Weex 是阿里巴巴發起的跨平台用戶界面開發框架,同時也正在 Apache 基金會進行項目孵化,Weex 允許你使用 Vue 語法開發不僅僅可以運行在瀏覽器端,還能被用於開發 iOS 和 Android 上的原生應用的組件。

在現在,Weex 還在積極發展,成熟度也不能和 React Native 相抗衡。但是,Weex 的發展是由世界上最大的電子商務企業的需求在驅動,Vue 團隊也會和 Weex 團隊積極合作確保為開發者帶來良好的開發體驗。

另一個選擇是 NativeScript-Vue,一個用 Vue.js 構建完全原生應用的 NativeScript 插件。

MobX

Mobx 在 React 社區很流行,實際上在 Vue 也采用了幾乎相同的反應系統。在有限程度上,React + Mobx 也可以被認為是更繁瑣的 Vue,所以如果你習慣組合使用它們,那么選擇 Vue 會更合理。

Preact 和其它類 React 庫

類 React 的庫們往往盡可能地與 React 共享 API 和生態。因此上述比較對它們來說也同樣適用。它們和 React 的不同往往在於更小的生態。因為這些庫無法 100% 兼容 React 生態中的全部,部分工具和輔助庫也可能無法使用。或者即使看上去能工作,但也有可能隨時發生不兼容,除非你用的這個類 React 庫官方與 React 保持嚴格一致。

AngularJS (Angular 1)

Vue 的一些語法和 AngularJS 的很相似 (例如 v-if vs ng-if)。因為 AngularJS 是 Vue 早期開發的靈感來源。然而,AngularJS 中存在的許多問題,在 Vue 中已經得到解決。

復雜性

在 API 與設計兩方面上 Vue.js 都比 AngularJS 簡單得多,因此你可以快速地掌握它的全部特性並投入開發。

靈活性和模塊化

Vue.js 是一個更加靈活開放的解決方案。它允許你以希望的方式組織應用程序,而不是在任何時候都必須遵循 AngularJS 制定的規則,這讓 Vue 能適用於各種項目。我們知道把決定權交給你是非常必要的。

這也是為什么我們提供了一個基於 Vue.js 進行快速開發的完整系統。Vue CLI 旨在成為 Vue 生態系統中標准的基礎工具。它使得多樣化的構建工具通過妥善的默認配置無縫協作在一起。這樣你就可以專注在應用本身,而不會在配置上花費太多時間。同時,它也提供了根據實際需求調整每個工具配置的靈活性。

數據綁定

AngularJS 使用雙向綁定,Vue 在不同組件間強制使用單向數據流。這使應用中的數據流更加清晰易懂。

指令與組件

在 Vue 中指令和組件分得更清晰。指令只封裝 DOM 操作,而組件代表一個自給自足的獨立單元——有自己的視圖和數據邏輯。在 AngularJS 中,每件事都由指令來做,而組件只是一種特殊的指令。

運行時性能

Vue 有更好的性能,並且非常非常容易優化,因為它不使用臟檢查。

在 AngularJS 中,當 watcher 越來越多時會變得越來越慢,因為作用域內的每一次變化,所有 watcher 都要重新計算。並且,如果一些 watcher 觸發另一個更新,臟檢查循環 (digest cycle) 可能要運行多次。AngularJS 用戶常常要使用深奧的技術,以解決臟檢查循環的問題。有時沒有簡單的辦法來優化有大量 watcher 的作用域。

Vue 則根本沒有這個問題,因為它使用基於依賴追蹤的觀察系統並且異步隊列更新,所有的數據變化都是獨立觸發,除非它們之間有明確的依賴關系。

有意思的是,Angular 和 Vue 用相似的設計解決了一些 AngularJS 中存在的問題。

Angular (原本的 Angular 2)

我們將新的 Angular 獨立開來討論,因為它是一個和 AngularJS 完全不同的框架。例如:它具有優秀的組件系統,並且許多實現已經完全重寫,API 也完全改變了。

TypeScript

Angular 事實上必須用 TypeScript 來開發,因為它的文檔和學習資源幾乎全部是面向 TS 的。TS 有很多好處——靜態類型檢查在大規模的應用中非常有用,同時對於 Java 和 C# 背景的開發者也是非常提升開發效率的。

然而,並不是所有人都想用 TS——在中小型規模的項目中,引入 TS 可能並不會帶來太多明顯的優勢。在這些情況下,用 Vue 會是更好的選擇,因為在不用 TS 的情況下使用 Angular 會很有挑戰性。

最后,雖然 Vue 和 TS 的整合可能不如 Angular 那么深入,我們也提供了官方的 類型聲明 和 組件裝飾器,並且知道有大量用戶在生產環境中使用 Vue + TS 的組合。我們也和微軟的 TS / VSCode 團隊進行着積極的合作,目標是為 Vue + TS 用戶提供更好的類型檢查和 IDE 開發體驗。

運行時性能

這兩個框架都很快,有非常類似的 benchmark 數據。你可以瀏覽具體的數據做更細粒度的對比,不過速度應該不是決定性的因素。

體積

在體積方面,最近的 Angular 版本中在使用了 AOT 和 tree-shaking 技術后使得最終的代碼體積減小了許多。但即使如此,一個包含了 Vuex + Vue Router 的 Vue 項目 (gzip 之后 30kB) 相比使用了這些優化的 angular-cli 生成的默認項目尺寸 (~65KB) 還是要小得多。

靈活性

Vue 相比於 Angular 更加靈活,Vue 官方提供了構建工具來協助你構建項目,但它並不限制你去如何組織你的應用代碼。有人可能喜歡有嚴格的代碼組織規范,但也有開發者喜歡更靈活自由的方式。

學習曲線

要學習 Vue,你只需要有良好的 HTML 和 JavaScript 基礎。有了這些基本的技能,你就可以非常快速地通過閱讀 指南 投入開發。

Angular 的學習曲線是非常陡峭的——作為一個框架,它的 API 面積比起 Vue 要大得多,你也因此需要理解更多的概念才能開始有效率地工作。當然,Angular 本身的復雜度是因為它的設計目標就是只針對大型的復雜應用;但不可否認的是,這也使得它對於經驗不甚豐富的開發者相當的不友好。

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM