1. 程式人生 > >Vue 入門

Vue 入門

切換 箭頭函數 ont 索引 內容 inner 跟著 null show

Vue.js 是一構建用戶界面的MVVM框架 ,只關註視圖層

Vue將DOM和數據綁定起來,一旦創建了綁定,DOM將和數據保持同步,每當變更了數據,DOM也會相應地更新。這樣就減少了不必要的DOM操作提高渲染效率,讓前端程序員只需要關心業務邏輯不再關心DOM是如何渲染的

MVCMVVM的區別:MVC是後端分層開發概念,MVVM是前端視圖層的概念,主要關註於視圖層分離,也就是說MVVM把前端的視圖層分為了三部分ModelViewViewModel

技術分享圖片

相關介紹、教程和下載使用關註Vue官網

示例

<!DOCTYPE html>
<html lang="en">
<
head> <meta charset="UTF-8"> <title>Title</title> <script src="lib/vue.js"></script> </head> <body> <!--將來new的Vue實例會控制這個元素中的所有內容,這個區域就是MVVM中的View--> <div id="app">{{ msg }}</div> <script> //創建一個Vue實例,當我們導包後在瀏覽器內存中就多了一個Vue構造函數
//new出來的vm對象就是MVVM中的ViewModel var vm = new Vue({ el: #app, //表示new的這個實例,要控制頁面的哪個區域.el為element縮寫,填入的是選擇器 data: { //data屬性中存放的是el中要用到的數據,這個數據就是MVVM中的Model,專門用來保存每個頁面數據 msg: Hello Vue } //通過Vue提供的指令,很方便地就能把數據渲染到頁面上,Vue不推薦手動操作DOM }) </script>
</body> </html>


基本指令

v-bloak 這個指令保持在元素上直到關聯實例結束編譯,和CSS規則如 [v-cloak]{ display: none } 一起用時,這個指令可以隱藏未編譯的Mustache標簽

Vue實例編譯前,頁面會顯示{{ msg }},不想它顯示,可用v-bloak配合CSS來隱藏

<div id="app" v-bloak>{{ msg }}</div>

v-text 和 {{ }} 插值表達式一樣會把數據插入到元素裏,不同的是v-text會覆蓋整個元素的內容,而插值表達式只會替換自己位置的字符

<div id="app" v-text="msg"></div>

v-html 將數據插入到元素裏,並且會識別標簽,v-text和v-html的區別就像innerText和innerHTML

<div id="app" v-html="msg"></div>

v-bind 用於綁定屬性,如想插入數據到title屬性中,使用插值表達式是不行的,此時就要用v-bind來綁定屬性,此指令可簡寫為 :

  v-bind中可寫合法的js表達式,msg就相當於變量,所以可拼接字符串

<input type="button" v-bingd:title="msg" value="按鈕">
<input type="button" :title="msg" value="按鈕">
<input type="button" :title="msg+‘123‘" value="按鈕">

v-on 事件綁定機制,很像原生js在標簽中註冊事件 onclic=“show()” 的方式,只不過現在使用vue的方式來綁定事件。可簡寫為 @

事件老是無法觸發,檢查了多遍後才發現,input標簽要放在View中,也就是el指定的那個區域,否則v-on:指令無效

<div id="app">
    <input type="button" value="按鈕" v-on:click="show">
</div>
<script>
    var vm = new Vue({
        el: #app,
        data: {
            msg: 123
        },
        methods: { //這個methods屬性中定義了當前Vue實例所有可用的方法
            show: function () {
                alert(Hello)
            }
        }
    })
</script>

事件修飾符,綁定事件時可阻止事件冒泡、默認行為

.stop 阻止冒泡

.prevent 阻止默認行為

.capture 使用事件捕獲模式,也就是反向冒泡

.self 只有當事件在該元素本身時才觸發,隔絕其他元素對自身的冒泡,類似 jQuery中的mouseenter事件

.once 事件只觸發一次,底層可能是事件觸發後進行了事件解綁

<input type="text" value="按鈕" v-on:click.stop="show">

v-model 實現表單元素和Model中數據的雙向綁定,只能用於表單元素。v-bind只是單向綁定,如在文本框中,v-bind:value="msg" 後,msg的值會出現在文本框中,但這只是單向綁定,修改文本框中的值後msg值也跟著改變,這才是雙向綁定

註意v-model後沒有冒號也不跟屬性,直接寫等於

<input type="text" v-model="msg">

v-for 用來遍歷數組、對象甚至數字

<!--遍歷數組,list為data裏的名為list的數組-->
<p v-for="item in list">{{ item }}</p>
<!--可以加第二個參數,(元素,索引)-->
<p v-for="(item,i) in list">{{ item }}索引是{{ i }}</p>

<!--如果是遍歷對象的話,可以有三個參數,(值,鍵,索引)--> <p v-for="(val,key,i) in obj">值是{{ val }},鍵為{{ key }},屬性索引為{{ i }}</p>

<!--如果是遍歷數字,則從1開始而不是0--> <p v-for="n in 10">{{n}}</p>

有相同父元素的子元素必須有獨特的 key,重復的 key 會造成渲染錯誤

key屬性值只能是number或string,而且因為key是屬性所以也要用v-bind來綁定

<p v-for="item in list" :key="item.id">
      <input type="checkbox">{{item.name}}的id為{{item.id}}
</p>

v-if 根據表達式的真假來渲染元素

v-show 根據表達式的真假切換元素的display CSS屬性,都能實現元素的顯示隱藏,不同的是v-if是通過刪除添加DOM元素的方式,v-show是通過CSS的方式,v-if有較高的切換性能消耗,v-show有較高的初始渲染消耗

所以如果元素要頻繁地切換,最好用v-show,如果元素可能永遠都不會被顯示出來給用戶看,則推薦用v-if

<input type="button" @click="flag = !flag">
<h3 v-if="flag">v-if控制的h3</h3>
<h3 v-show="flag">v-show控制的h3</h3>

Vue操作樣式

Vue中使用class樣式,由於class也是標簽屬性,所以要用v-bind指令來綁定數據

<!--原生寫法-->
<h1 class="red thin"> </h1> 

<!--傳遞一個數組,裏面是類樣式名-->
<h1 :class="[‘thin‘, ‘italic‘]"> </h1>

<!--在數組中使用三元表達式,flag為data中定義的布爾類型屬性-->
<h1 :class="[‘thin‘, ‘italic‘, flag?‘active‘:‘‘]"> </h1> 

<!--在數組中使用對象來代替三元表達式,提高代碼的可讀性-->
<h1 :class="[‘thin‘, ‘italic‘, {‘active‘:flag} ]"> </h1> 

<!--直接使用對象,鍵為類樣式名,值為布爾,表示是否應用這個樣式-->
<h1 :class="{red:true,italic:true,thin:true,active:true}"> </h1>

Vue中使用內聯樣式,類似jq的css方法,裏面傳入對象

<h1 :style="{‘color‘:‘red‘,‘font-size‘:‘16px‘}"></h1>

也可將對象定義到data中,再在標簽裏寫對象的引用

文字跑馬燈小案例

<div id="app">
    <input type="button" value="浪起來" v-on:click="start">
    <input type="button" value="淡定" v-on:click="stop">
    <p>{{msg}}</p>
</div>
<script>
    //VM實例中獲取data的數據或者調用methods裏的方法,必須通過this來訪問
    var vm = new Vue({
        el: #app,
        data: {
            msg: 劃船不用槳全靠浪~~~,
            timeId:null //定時器id
        },
        methods: { //這個methods屬性中定義了當前Vue實例所有可用的方法
            start: function () {
                if(this.timeId != null) return   //使用節流閥防止定時器多次開啟
                 this.timeId = setInterval(() => {
                    var start = this.msg.substring(0, 1) //截取第一個字符
                    var end = this.msg.substring(1)      //截取剩下的字符
                    this.msg = end.concat(start)        
                }, 500)
            },
            stop: function () {
                clearInterval(this.timeId)
                this.timeId = null
            }
        }
    })
</script>

也可以使用啟動前先清除定時器的方式來防止定時器多次開啟,不過感覺這種方式相比下應該是比較耗性能的

定時器裏的this指向的是window,但用了ES6的箭頭函數,this指向仍是vm實例對象

實例化後window裏會有vm實例對象,底層會把data裏的屬性掛載到vm實例對象上作為vm的屬性,所以可以直接通this點來獲取

技術分享圖片

Vue 入門