Vue.js實戰(zhàn)-學習總結(jié)

通過這段時間的學習,我對于vue.js有了一定的了解和泌。
下面是我的一些學習心得,主要分為三部分:

  • vue.js相關(guān)概念
  • 工具和插件使用
  • 學習感想

相關(guān)概念

什么是Vue.js

Vue.js是一個用于構(gòu)建用戶界面的漸進式框架。與其它大型框架不同的是岖常,Vue 被設(shè)計為可以自底向上逐層應用。Vue 的核心庫只關(guān)注視圖層萤皂,不僅易于上手撒穷,還便于與第三方庫或既有項目整合。
Vue.js采用MVVM的設(shè)計模式(M-Model裆熙,V-View端礼,VM-ViewModel)禽笑,將數(shù)據(jù)和視圖分離,用數(shù)據(jù)來驅(qū)動視圖蛤奥。vue專注于view(視圖層)佳镜,view層的變化由數(shù)據(jù)操控,即所有的一切通過操作數(shù)據(jù)來進行凡桥,盡量避免操作dom樹蟀伸。與此同時,View和ViewModel之間通過雙向綁定建立聯(lián)系缅刽,即View變化啊掏,ViewMode也會發(fā)生相應的變化,反之亦然衰猛。

vue生命周期

每個 vue 實例創(chuàng)建時迟蜜,都會經(jīng)歷一系列的初始化過程,這個過程就是生命周期啡省。在周期中會調(diào)用相應的生命周期鉤子娜睛。我們可以利用這些鉤子,在合適的時機執(zhí)行我們的業(yè)務邏輯卦睹。

生命周期圖
image

如圖所示畦戒,從實例開始創(chuàng)建到銷毀的過程中有八個生命周期鉤子,常用的有
  • created 實例創(chuàng)建完成后調(diào)用分预,此階段完成了數(shù)據(jù)的觀測等兢交,但尚未掛載, $el 還不可用笼痹。需要初始化處理一些數(shù)據(jù)時會比較有用
  • mounted el 掛載到實例上后調(diào)用配喳,一般我們的第一個業(yè)務邏輯會在這里開始
  • beforeDestroy 實例銷毀之前調(diào)用。主要解綁一些使用 addEventListener 監(jiān)聽的事件等凳干。
指令

指令是vue 模板中最常用的一項功能晴裹,它帶有前綴v-。指令的主要職責就是當其表達式的值改變時救赐,相應地將某些行為應用到 DOM 上涧团。常用的指令有

  • v-bind:動態(tài)更新html上的屬性
  • v-model:用在表單控件元素上創(chuàng)建雙向數(shù)據(jù)綁定的。根據(jù)控件類型v-model自動選取正確的方法更新元素经磅。
  • v-for:循環(huán)渲染
  • v-if:根據(jù)表達式的值在DOM中生成或移除一個元素泌绣。
  • v-show:根據(jù)表達式的值控制元素顯示隱藏,類似display:block/none
  • v-else:跟著v-if或者v-show使用
  • v-on:綁定事件監(jiān)聽器
    注:一般來說预厌,v-if有更高的切換消耗阿迈,而v-show有更高的初始渲染消耗。因此轧叽,如果需要頻繁的切換苗沧,則使用v-show較好刊棕;如果在運行時條件不大可能改變,則使用v-if較好待逞。
插值與表達式

雙大括號'{{}}'是最基本的文本插值方法甥角,會自動將雙向綁定的數(shù)據(jù)實時顯示出來
在'{{}}'中,除了簡單的綁定屬性值外识樱,還可 使用 JavaScript 表達式進行簡單的運算, 三元運算等嗤无。因為文本插值只支持單個表達式,如果表達式過長或者邏輯復雜時可以使用計算屬性

<div id=" app ">
    {{book}} //顯示《Vue.js實戰(zhàn)》
    {{price / 10}}//顯示3
    {{isOk?'yes':'no'}}//顯示no
</div> 
<script> 
var app =new Vue({ 
    el:'#app', 
    data:{ 
      book:'《Vue.js 實戰(zhàn)》'牺荠,
      price:'30',
      isOk:false
    }
}) 
</script>
計算屬性與方法

所有的計算屬性都以函數(shù)的形式寫在 Vue 實例內(nèi)的 computed 選項內(nèi)翁巍,最終返回計算后的結(jié)果。每一個計算屬性都有一個getter方法和setter方法休雌,分別用來讀取和寫入灶壶,絕大多數(shù)情況下,我們只會用默認的 getter 方法來讀取計算屬性杈曲,所以聲明計算屬性時直接使用默認的寫法驰凛,不聲明getter和setter,但是在使用vuex結(jié)合表單時担扑,在計算屬性中就需要getter和setter方法恰响,否則修改表單會報錯。

<div id=" app ">
    {{text.split(',').reverse().join(',')}}
    {{reverseText}}
</div> 
<script> 
var app =new Vue({ 
    el:'#app', 
    data:{ 
      text:'123,456'
    },
    computed:{
      reverseText:function(){
         return this.text.split(',').reverse().join(',')
     }
    }
}) 
</script>

vue中方法都寫在實例的methods屬性中涌献。Vue.js將methods 里的方法也代理了胚宦,所以也可以像訪問 Vue 數(shù)據(jù)那樣來調(diào)用方法

<div id=" app ">
    {{reverseText}}
</div> 
<script> 
var app =new Vue({ 
    el:'#app', 
    data:{ 
      text:'123,456'
    },
    methods:{
      reverseText:function(){
         return this.text.split(',').reverse().join(',')
     }
    }
}) 
</script>

從上面兩段代碼可以發(fā)現(xiàn)使用methods的方法可以起到和計算屬性相同的屬性,但是計算屬性和方法還是有區(qū)別的燕垃。計算屬性是基于它的依賴緩存的枢劝。 個計算屬性所依賴的數(shù)據(jù)發(fā)生變化時,它才會重新取值卜壕,所以text 只要不改變您旁,計算屬性也就不更新,但methods不同轴捎,只要重新渲染就會被調(diào)用鹤盒,函數(shù)也會執(zhí)行。
使用計算屬性還是 methods 取決于你是否需要緩存侦副,當遍歷大數(shù)組和做大量計算時侦锯,應當使用計算屬性,除非你不希望得到緩存秦驯。

數(shù)據(jù)雙向綁定
<div id="app">
  <input type="text" v-model=" name" placeholder="你的名字"
  <hl>你好率触,{{ name }}</hl> 
</div> 
<script>
var app = new Vue({ 
  el: '#app', 
  data:{ 
    name:''
  }) 
</script>

上面代碼體現(xiàn)了vue的數(shù)據(jù)雙向綁定功能,input標簽使用v-model指令綁定了數(shù)據(jù)name,v-model是一個雙向綁定指令葱蝗,所以用戶在輸入框中輸入時,會更新數(shù)據(jù)name的值细燎,當使用app.name = 'XXX'更新數(shù)據(jù)時輸入框中內(nèi)容也會發(fā)生改變两曼。

組件

任何一個頁面都可以劃分成很多功能獨立的組件,然后像搭積木一樣搭建頁面玻驻。
組件是可復用的vue實例悼凑,和new Vue 接收相同的選項,例如 data璧瞬、computed户辫、watch、methods 以及生命周期鉤子等嗤锉。僅有的例外是像 el 這樣根實例特有的選項渔欢。
需要注意的一點是:組件中的data必須是一個函數(shù),這樣組件復用時每個組件才能維護自己獨立的數(shù)據(jù)瘟忱,否則復用的組件共用一份數(shù)據(jù)奥额。

注冊

組件必須先注冊才能使用,注冊有兩種方式:全局注冊和局部注冊访诱。全局注冊后任何vue實例都可以調(diào)用垫挨。
組件都只是通過 Vue.component 全局注冊的

<div id="app">
<my-component></my-component> 
</div> 
<script>
Vue.component('my-component', {
  // ... options ...
})
var app =new Vue({ 
  el :'#app'
}) 
</script>

在vue實例中,可以使用components選項局部注冊組件触菜,注冊的組件只在該實例作用域下有效九榔。

<div id="app ">
<my-component></my-component> 
</div> 
<script>
var Child = { 
  template:'<div>局部注冊組件的內(nèi)容</div>'
}
var app =new Vue(( 
  el:'app',
  components:{
    'my-component':Child
  }
}) 
</script>
通信
  • 父->子
    父組件通過props向子組件傳遞數(shù)據(jù)
<div id="app">
<my-component :message="parentMessage"></my-component> 
</div> 
<script>
Vue.component('my-component', {
  props:['message'],
  template:'<div>{{message}}</div>'
})
var app =new Vue({ 
  el :'#app',
  data(){
  parentMessage:'哈哈哈',
}
}) 
</script>
  • 子->父
    子組件通過$emit觸發(fā)事件,父組件通過v-on來監(jiān)聽子組件的事件
<div id="app">
<p>總數(shù):{{total}}</p>
<my-component @increase="handleTotal"></my-component>
</div> 
<script>
Vue.component('my-component', {
  data(){
  count:0
 },
  template:'<div><button @click="handler">+</button></div>',
  methods:{
    handler:function(){
       this.count++;
       this.$emit('increase',this.count);
   }
}
})
var app =new Vue({ 
  el :'#app',
  data(){
    total:0
  },
  methods:{
    handleTotal:function(val){
    this.total = total;
    }
  }
}) 
</script>
  • 兄弟組件
    將數(shù)據(jù)上傳至共同父組件中涡相,再由父組件傳遞給子組件
    為了便于開發(fā)哲泊,Vue 推出了一個狀態(tài)管理工具 Vuex,可以很方便實現(xiàn)組件之間的參數(shù)傳遞
虛擬dom

之前有簡單了解react前端框架漾峡,react使用了虛擬DOM來提高性能攻旦,合并Dom操作,加快頁面的刷新速度生逸。vue2.0加入了虛擬dom的概念牢屋,虛擬dom操作相對快速。通過對虛擬DOM進行diff槽袄,逐步找到更新前后虛擬dom的差異烙无,然后更新變化的部分,減少了因為頁面重排dom樹結(jié)構(gòu)變化產(chǎn)生的性能耗費遍尺。

工具和插件的使用

在使用vue寫項目時截酷,通常會結(jié)合webpack打包工具,vuex狀態(tài)管理工具以及vue-router前端路由管理等工具乾戏。

webpack

在使用webpack時迂苛,首先要配置webpack.config.js文件三热,配置入口文件,出口文件三幻,loaders和plugins就漾,配置完成后,啟動項目webpack會自動分析模塊間引用關(guān)系念搬,將用到的模塊進行打包抑堡。而且webpack有豐富的插件可以使用。

vuex

Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式朗徊。它采用集中式存儲管理應用的所有組件的狀態(tài)首妖,并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。使用時需要在main.js中引入爷恳,同時使用vue.use(vuex)有缆,然后創(chuàng)建store,傳入根組件舌仍,這樣每個子組件都能獲取store中的state妒貌,state不能直接改變,只能通過顯式的提交mutations铸豁。vuex還提供了getters灌曙,actions和modules等選項。getters可以將計算屬性中處理從store獲得數(shù)據(jù)的過程提取出來實現(xiàn)復用节芥,mutation 里不應該異步操作數(shù)據(jù)在刺,所以有了 actions選項 ,action和mutation很像头镊,但是action里面提交的是mutation蚣驼,并且可以異步操作業(yè)務邏輯。最后一個選項是 modules 相艇,它用來將 store 分割到不同模塊颖杏。當你的項目足夠大時, store 里的state坛芽, getters留储, mutations, actions 會非常多咙轩,都放在 rnain.js 里顯得不是很友好获讳,使用 modules 可以把它們寫到不同的文件中。每個 module 擁有自己的 state getters活喊, mutations丐膝, actions ,而且可以多層嵌套。

const moduleA = { 
  state: { . . . } , 
  mutations: { . . . } , 
  actions: { . . . ) , 
  getters: { . . . )
}
const moduleB = { 
  state: { . . . } , 
  mutations: { . . . } , 
  actions: { . . . ) , 
  getters: { . . . )
}
const store= new Vuex . Store ( { 
  modules : { 
    a: moduleA, 
    b: moduleB
  }
})
vue-router

使用vue和vue-router構(gòu)建單頁應用會非常簡單帅矗,添加vue-router和添加vuex的過程相似偎肃,都是在main.js中引入,在使用vue.use(vue-router)损晤,創(chuàng)建routes并掛載到根組件软棺。vue-router每個路由映射一個組件,當路由匹配時加載相應的組件尤勋。目前自己用到的就是普通路由以及動態(tài)路由,嵌套路由只是了解但是沒有使用

vue-source/axios

vue-resource是一個通過XMLHttpRequest或者JSONP技術(shù)實現(xiàn)異步加載服務端數(shù)據(jù)的插件,vue2.0以后茵宪,vue就不再對vue-resource進行更新最冰,而是推薦axios

學習感想

學習vue之后,最大的感受就是幾乎不需要手動去操作DOM元素了稀火,只需要把元素和數(shù)據(jù)綁定起來暖哨,更新了數(shù)據(jù)后,vue就會自動更新DOM元素凰狞,比起在js中獲取元素設(shè)置相關(guān)屬性篇裁,方便了很多。而且vue的事件綁定都是在HTML中綁定赡若,跟在JS中獲取元素然后添加事件相比达布,代碼的可讀性提高很多,也有利于前端代碼的封裝逾冬。在使用vue寫項目時黍聂,首先是搭建環(huán)境,這里可以使用vue-cli腳手架搭建項目身腻,vue-cli提供了豐富的選項产还,可以幫我們搭建好項目框架,然后自己再引入需要的插件嘀趟、配置工具脐区,常常需要的就是vuex,vue-router以及axios和webpack她按,這些與vue結(jié)合使得構(gòu)建vue項目更加容易牛隅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尤溜,隨后出現(xiàn)的幾起案子倔叼,更是在濱河造成了極大的恐慌,老刑警劉巖宫莱,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丈攒,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機巡验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門际插,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人显设,你說我怎么就攤上這事框弛。” “怎么了捕捂?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵瑟枫,是天一觀的道長。 經(jīng)常有香客問我指攒,道長慷妙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任允悦,我火速辦了婚禮膝擂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隙弛。我一直安慰自己架馋,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布全闷。 她就那樣靜靜地躺著叉寂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪室埋。 梳的紋絲不亂的頭發(fā)上办绝,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音姚淆,去河邊找鬼孕蝉。 笑死,一個胖子當著我的面吹牛腌逢,可吹牛的內(nèi)容都是我干的降淮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼搏讶,長吁一口氣:“原來是場噩夢啊……” “哼佳鳖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媒惕,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤系吩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妒蔚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穿挨,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡月弛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了科盛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帽衙。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贞绵,靈堂內(nèi)的尸體忽然破棺而出厉萝,到底是詐尸還是另有隱情,我是刑警寧澤榨崩,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布谴垫,位于F島的核電站,受9級特大地震影響母蛛,放射性物質(zhì)發(fā)生泄漏弹渔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一溯祸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舞肆,春花似錦焦辅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哩盲,卻和暖如春前方,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廉油。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工惠险, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抒线。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓班巩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘶炭。 傳聞我的和親對象是個殘疾皇子抱慌,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 一、了解Vue.js 1.1.1 Vue.js是什么眨猎? 簡單小巧抑进、漸進式、功能強大的技術(shù)棧 1.1.2 為什么學習...
    蔡華鵬閱讀 3,313評論 0 3
  • Vue不支持IE8以及以下版本睡陪。 想要使用Vue的話可以通過直接下載vue.js寺渗,放置到項目中寫好路徑就可以匿情,或者...
    酥楓閱讀 621評論 0 0
  • vue概述 在官方文檔中,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,187評論 0 25
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容户秤,還有我對于 Vue 1.0 印象不深的內(nèi)容码秉。關(guān)于...
    云之外閱讀 5,045評論 0 29
  • Vue 實例 屬性和方法 每個 Vue 實例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,202評論 0 6