Vue基礎(chǔ)系列(一) Vue是個(gè)啥?

?? Vue構(gòu)建大型單頁面電商應(yīng)用 開源啦!點(diǎn)我看源碼????

閱讀時(shí)間預(yù)估:3分鐘

啥是Vue?

當(dāng)你看到這篇文章的時(shí)候,想必這位大俠難免多少略知Vue這個(gè)世界級別的框架的來頭,華裔程序貴族尤雨溪大佬的開源作品(膜拜大佬三分鐘...),從面世至今gitHub上的點(diǎn)贊數(shù)量已經(jīng)超過Angular,React等著名框架,??的發(fā)紫,著實(shí)有后來者居上的感覺,Vue借鑒了前兩者的優(yōu)秀設(shè)計(jì)模式和思想以一種漸進(jìn)式的模式呈現(xiàn)給我們,意圖也非常明顯,小白上手首選,學(xué)習(xí)成本低,開源社區(qū)活躍,廢話不多說,接下來跟(da)著(lao)我的腳步,帶你從小白進(jìn)階大佬(chui niu)..

Vue -漸進(jìn)式JavaScript框架

介紹

大佬叮囑: 萬層高樓平地起,作為vue小白vue官方中文網(wǎng)一定要努力的通讀幾遍,案例一定要多敲幾遍哦.

庫和框架有啥區(qū)別

我們所說的前端框架與庫的區(qū)別?

Library

庫,本質(zhì)上是一些函數(shù)的集合。每次調(diào)用函數(shù),實(shí)現(xiàn)一個(gè)特定的功能,接著把控制權(quán)交給使用者

  • 代表:jQuery
  • jQuery這個(gè)庫的核心:DOM操作,即:封裝DOM操作,簡化DOM操作
  • jQuery 源碼分析系列

Framework

框架,是一套完整的解決方案,使用框架的時(shí)候,需要把你的代碼放到框架合適的地方,框架會在合適的時(shí)機(jī)調(diào)用你的代碼

  • 框架規(guī)定了自己的編程方式,是一套完整的解決方案
  • 使用框架的時(shí)候,由框架控制一切,我們只需要按照規(guī)則寫代碼

主要區(qū)別

  • You call Library, Framework calls you

  • 核心點(diǎn):誰起到主導(dǎo)作用(控制反轉(zhuǎn))

    • 框架中控制整個(gè)流程的是框架
    • 使用庫,由開發(fā)人員決定如何調(diào)用庫中提供的方法(輔助)
  • 好萊塢原則:Don't call us, we'll call you.

  • 框架的侵入性很高(從頭到尾)

啥是MVVM?

MVC

  • M: Model 數(shù)據(jù)模型(專門用來操作數(shù)據(jù),數(shù)據(jù)的CRUD)
  • V:View 視圖(對于前端來說,就是頁面)
  • C:Controller 控制器(是視圖和數(shù)據(jù)模型溝通的橋梁,用于處理業(yè)務(wù)邏輯)

后端中常常采用MVC模式.

MVVM組成

  • MVVM ===> M / V / VM
  • M:model數(shù)據(jù)模型
  • V:view視圖
  • VM:ViewModel 視圖模型

優(yōu)勢對比

  • MVC模式,將應(yīng)用程序劃分為三大部分,實(shí)現(xiàn)了職責(zé)分離

  • 在前端中經(jīng)常要通過 JS代碼 來進(jìn)行一些邏輯操作,最終還要把這些邏輯操作的結(jié)果現(xiàn)在頁面中。也就是需要頻繁的操作DOM

  • MVVM通過數(shù)據(jù)雙向綁定讓數(shù)據(jù)自動地雙向同步

    • V(修改數(shù)據(jù)) -> M
    • M(修改數(shù)據(jù)) -> V
    • 數(shù)據(jù)是核心
  • Vue這種MVVM模式的框架,不推薦開發(fā)人員手動操作DOM

Vue中的MVVM

雖然沒有完全遵循 MVVM 模型,Vue 的設(shè)計(jì)無疑受到了它的啟發(fā)。因此在文檔中經(jīng)常會使用 vm (ViewModel 的簡稱) 這個(gè)變量名表示 Vue 實(shí)例

學(xué)習(xí)Vue要轉(zhuǎn)化JS老觀念

  • 不要在想著怎么操作DOM,而是想著如何操作數(shù)據(jù)?。?!以數(shù)據(jù)來驅(qū)動開發(fā).

起步 - Hello Vue

  • 安裝:npm i -S vue
<!-- 指定vue管理內(nèi)容區(qū)域,需要通過vue展示的內(nèi)容都要放到找個(gè)元素中  通常我們也把它叫做邊界 數(shù)據(jù)只在邊界內(nèi)部解析-->
<div id="app">{{ msg }}</div>
 
<!-- 引入 vue.js -->
<script src="vue.js"></script>
 
<!-- 使用 vue -->
<script>
  var vm = new Vue({
    // el:提供一個(gè)在頁面上已存在的 DOM 元素作為 Vue 實(shí)例的掛載目標(biāo)
    el: '#app',
    // Vue 實(shí)例的數(shù)據(jù)對象,用于給 View 提供數(shù)據(jù)
    data: {
      msg: 'Hello Vue'
    }
  })
</script>

Vue實(shí)例

  • 注意 1:先在data中聲明數(shù)據(jù),再使用數(shù)據(jù)
  • 注意 2:可以通過 vm.$data 訪問到data中的所有屬性,或者 vm.msg
var vm = new Vue({
  data: {
    msg: '大家好,我是Geek-James'
  }
})
 
vm.$data.msg === vm.msg // true

數(shù)據(jù)綁定

  • 最常用的方式:Mustache(插值語法),也就是 {{}} 語法
  • 解釋:{{}}從數(shù)據(jù)對象data中獲取數(shù)據(jù)
  • 說明:數(shù)據(jù)對象的屬性值發(fā)生了改變,插值處的內(nèi)容都會更新
  • 說明:{{}}中只能出現(xiàn)JavaScript表達(dá)式 而不能解析js語句
  • 注意:Mustache 語法不能作用在 HTML 元素的屬性上
<h1>Hello, {{ msg }}.</h1>
<p>{{ 1 + 2 }}</p>
<p>{{ isOk ? 'yes': 'no' }}</p>
 
<!-- ?。?!錯(cuò)誤示范?。。?-->
<h1 title="{{ err }}"></h1>

雙向數(shù)據(jù)綁定 Vue two way data binding

  • 雙向數(shù)據(jù)綁定:將DOM與Vue實(shí)例的data數(shù)據(jù)綁定到一起,彼此之間相互影響

    • 數(shù)據(jù)的改變會引起DOM的改變
    • DOM的改變也會引起數(shù)據(jù)的變化
  • 原理:Object.defineProperty中的get和set方法

    • getter和setter:訪問器
    • 作用:指定讀取或設(shè)置對象屬性值的時(shí)候,執(zhí)行的操作
  • Vue - 深入響應(yīng)式原理

  • MDN - Object.defineProperty()

/*  defineProperty語法 介紹 */
var obj = {}
Object.defineProperty(obj, 'msg', {
  // 設(shè)置 obj.msg = "1" 時(shí)set方法會被系統(tǒng)調(diào)用 參數(shù)分別是設(shè)置后和設(shè)置前的值
  set: function (newVal, oldVal) {  },
  // 讀取 obj.msg 時(shí)get方法會被系統(tǒng)調(diào)用
  get: function ( newVal, oldVal ) {}
})

Vue雙向綁定的極簡實(shí)現(xiàn)

<!-- 示例 -->
<input type="text" id="txt" />
<span id="sp"></span>
 
<script>
var txt = document.getElementById('txt'),
    sp = document.getElementById('sp'),
    obj = {}
 
// 給對象obj添加msg屬性,并設(shè)置setter訪問器
Object.defineProperty(obj, 'msg', {
  // 設(shè)置 obj.msg  當(dāng)obj.msg反生改變時(shí)set方法將會被調(diào)用  
  set: function (newVal) {
    // 當(dāng)obj.msg被賦值時(shí) 同時(shí)設(shè)置給 input/span
    txt.value = newVal
    sp.innerText = newVal
  }
})
 
// 監(jiān)聽文本框的改變 當(dāng)文本框輸入內(nèi)容時(shí) 改變obj.msg
txt.addEventListener('keyup', function (event) {
  obj.msg = event.target.value
})
</script>

動態(tài)添加數(shù)據(jù)的注意點(diǎn)

  • 注意:只有data中的數(shù)據(jù)才是響應(yīng)式的,動態(tài)添加進(jìn)來的數(shù)據(jù)默認(rèn)為非響應(yīng)式
  • 可以通過以下方式實(shí)現(xiàn)動態(tài)添加數(shù)據(jù)的響應(yīng)式
    • 1 Vue.set(object, key, value) - 適用于添加單個(gè)屬性
    • 2 Object.assign() - 適用于添加多個(gè)屬性
var vm = new Vue({
  data: {
    stu: {
      name: 'jack',
      age: 19
    }
  }
})
 
/* Vue.set */
Vue.set(vm.stu, 'gender', 'male')
 
/* Object.assign 將參數(shù)中的所有對象屬性和值 合并到第一個(gè)參數(shù) 并返回合并后的對象*/
vm.stu = Object.assign({}, vm.stu, { gender: 'female', height: 180 })

異步DOM更新

  • 說明:Vue 異步執(zhí)行 DOM 更新,監(jiān)視所有數(shù)據(jù)改變,一次性更新DOM

  • 優(yōu)勢:可以去除重復(fù)數(shù)據(jù),對于避免不必要的計(jì)算和 避免重復(fù) DOM 操作上,非常重要

  • 如果需要那到更新后dom中的數(shù)據(jù) 則需要通過 Vue.nextTick(callback):在DOM更新后,執(zhí)行某個(gè)操作(屬于DOM操作)

    • 實(shí)例調(diào)用vm.$nextTick(function () {})
methods: {
  fn() {
    this.msg = 'change'
    this.$nextTick(function () {
      console.log('$nextTick中打?。?, this.$el.children[0].innerText);
    })
    console.log('直接打?。?, this.$el.children[0].innerText);
  }
}

Vue是個(gè)啥? 看完這篇不知道面前的這位大俠是否真正的領(lǐng)略到,歡迎留言點(diǎn)贊加評論,文章有不對的地方懇請各位大佬提出.

如果我的分享對面前的這位大俠有所啟發(fā),懇請以程序員最高禮遇點(diǎn)? 星加分享的方式鼓勵(lì)我.

關(guān)注公眾號回復(fù):學(xué)習(xí) 領(lǐng)取前端最新最全學(xué)習(xí)資料,也可以進(jìn)群和大佬一起學(xué)習(xí)交流

image

猛戳我點(diǎn)星星

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ## 框架和庫的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計(jì)架構(gòu)和**解決方案**。> > 庫(lib...
    Rui_bdad閱讀 3,150評論 1 4
  • 33、JS中的本地存儲 把一些信息存儲在當(dāng)前瀏覽器指定域下的某一個(gè)地方(存儲到物理硬盤中)1、不能跨瀏覽器傳輸:在...
    萌妹撒閱讀 2,240評論 0 2
  • VUE介紹 Vue的特點(diǎn)構(gòu)建用戶界面,只關(guān)注View層簡單易學(xué),簡潔、輕量、快速漸進(jìn)式框架 框架VS庫庫,是一封裝...
    多多醬_DuoDuo_閱讀 2,853評論 1 17
  • 主要還是自己看的,所有內(nèi)容來自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類似于 vie...
    Leonzai閱讀 3,536評論 0 25
  • 什么叫庫? 代表是jQuery ? 庫本質(zhì)是就是一些函數(shù)的集合,就是將一些函數(shù)放到一個(gè)獨(dú)立的js文件中 ? ...
    cj_jax閱讀 898評論 0 1

友情鏈接更多精彩內(nèi)容