1. 程式人生 > 其它 >vue筆記-基礎篇-v-_指令的語法

vue筆記-基礎篇-v-_指令的語法

1.計算屬性

計算屬性是可以配置在options中的,因此先來看下官網對它的介紹

通過文件可知它的結構為computed: {},其中物件中可以是key:function或者是key:{get:function,set:function}
它的this執向的是vue例項而不是函式內部,因此在此函式中訪問vue中的屬性可以直接通過this.屬性的方式訪問
它的結果會被快取起來
總結一下,計算屬性的作用和普通屬性一樣,只不過比普通屬性多了一些功能,能使用普通屬性的地方就可以通過計算屬性替換
舉個例子,比如在插值時想對每個屬性的值後面新增finished字串,如果按照普通的寫法是這樣的

<div id="app">
  {{msg}} finished
</div>

 let app = new Vue({
    el: '#app',
    data: {
      msg: 'hello world!'
    }
  })

如果這個表示式計算簡單的話沒什麼影響,但是如果計算邏輯複雜,那麼很影響可讀性,使用計算屬性替換

<div id="app">
  {{msg}}
</div>

let app = new Vue({
  el: '#app',
  data: {

  },
  computed: {
    msg: function(){
      return 'hello world!' + ' finished'
    }
  }
})

效果是一樣的,但是它比普通的屬性擁有更好的可讀性和效率,它還可以使用get和set的方式,當對此屬性賦值時會執行set函式,使用此屬性時會呼叫get函式

2.v-bind繫結

此指令可以給html標籤動態的繫結屬性值、樣式值和類值,通過它可以實現響應式功能

屬性繫結

最基本的用法就是繫結標籤的屬性,比如繫結input標籤的value屬性,在程式中可以動態的切換輸入框的值

<div id="app">
  <input v-bind:value="value">
</div>

let app = new Vue({
  el: '#app',
  data: {
    value: 'aaa'
  },
})


使用程式修改value變數後,介面上的值也會實時變化

如果不使用v-bind修飾屬性,那麼它的值就是value,加了該指令後vue會將屬性的值當做變數解析,當變數的值改變後,標籤的值也會發生變化

類繫結

除了可以繫結屬性的值以外,v-bind指令還可以動態的繫結類,它有兩種繫結方式
第一種直接傳入一個物件,物件的key會被當做class名稱,物件的value會被當做變數進行解析,只有當變數為true時才會在指定標籤中新增此class

<div id="app">
  <input v-bind:value="value" v-bind:class="{active: isactive}">
</div>

let app = new Vue({
  el: '#app',
  data: {
    value: 'aaa',
    isactive: true
  },
})


通過控制檯動態的修改isactive變數的值後對應標籤上的class被移除了


第二種繫結class的方式為傳入一個數組,陣列中的值會被當做變數解析,最終class的值就是陣列中變數的值

<div id="app">
  <input v-bind:value="value" v-bind:class="[class1, class2]">
</div>

let app = new Vue({
  el: '#app',
  data: {
    value: 'aaa',
    isactive: true,
    class1: 'class1val',
    class2: 'class2val',
  },
})


這兩種方式也可以進行混用,直接在陣列中使用物件方式也可以生效

樣式繫結

v-bind指令繫結樣式的方式和繫結class相同,存在物件和陣列兩種方式
在物件中加了單引號以後就會被當做普通字串處理

<div id="app">
  <input v-bind:value="value" v-bind:style="{fontSize: fontSize + 'px'}">
</div>

let app = new Vue({
  el: '#app',
  data: {
    value: 'aaa',
    fontSize: 20
  },
})


陣列繫結和class繫結相同

縮寫形式

因為屬性繫結太過於常用,因此vue對其提供了縮寫形式,直接使用:代替v-bind:,比如像繫結value的值時不需要再寫成v-bind:value,而是直接寫成:value即可

3.v-on監聽事件

v-on指令可以監聽發生在標籤上的所有事件,只需要指定事件名稱即可監聽特定的事件並進行處理

<div id="app">
  <span v-on:click="handleClk">aaa</span>
</div>

let app = new Vue({
  el: '#app',
  methods: {
    handleClk(){
      console.log('clicked...')
    }
  }
})


預設當不傳引數的時候第一個引數即為事件物件

let app = new Vue({
  el: '#app',
  methods: {
    handleClk(event){
      console.log(event)
      console.log('clicked...')
    }
  }
})


如果想傳入多個物件,並且還想使用事件物件的話,監聽時第一個引數的寫法為$event

<div id="app">
  <span v-on:click="handleClk($event, 'p1')">aaa</span>
</div>

let app = new Vue({
  el: '#app',
  methods: {
    handleClk(event, p){
      console.log(event)
      console.log(p)
      console.log('clicked...')
    }
  }
  })


對於事件該指令還提供了事件修飾符,用於更精細的控制事件處理方式,用法為v-on:click.事件修飾符,目前支援的所有修飾符在api中可以查到

縮寫形式

和v-bind類似,對於事件監聽也是非常頻繁的操作,因此vue提供了縮寫形式,v-on:click縮寫形式為@click

4.v-if、v-else、v-else-if判斷

為了讓頁面上的元素根據條件動態的顯示或隱藏,vue提供了v-if指令,它的作用和普通的控制語句塊一樣,當條件滿足時渲染指定標籤

<div id="app">
  <span v-if="name == 'zhangsan'">zhangsan</span>
  <span v-else-if="name == 'lisi'">lisi</span>
  <span v-else="">wangwu</span>
</div>

let app = new Vue({
  el: '#app',
  data:{
    name: 'zhangsan'
  }
})


將name值改變後

只有當指令的表示式為真時,指令所在的標籤或被指令包含的所有標籤才會顯示

v-show和v-if的區別

v-show指令和v-if指令的作用相同,都是通過表示式來判斷是否顯示指定標籤,唯一的區別在於,v-show指令的隱藏是基於樣式的方式,元素並不會消失,而v-if的隱藏會將元素刪除

<div id="app">
  <span v-if="show">zhangsan</span>
  <span v-show="show">lisi</span>
</div>

let app = new Vue({
  el: '#app',
  data:{
    show: false
  }
})

5.v-for遍歷

語言的三個基本結構,順序、選擇、迴圈,v-if實現了選擇,v-for實現了迴圈,使用v-for可以遍歷陣列或者物件,被v-for指令包圍的所有標籤都會被迴圈生成

遍歷陣列

v-for指令可以依次遍歷陣列中的每個元素,它支援單個引數或兩個引數,第一個表示陣列中當前正在遍歷的元素,另一個表示當前的索引值

  let app = new Vue({
    el: '#app',
    data:{
      items: ['aaa', 'bbb', 'ccc', 'ddd']
    }
  })
  
 <div id="app">
  <ul>
    <li v-for="(item, index) in items">{{index}} - {{item}}</li>
  </ul>
</div>


當使用陣列中的部分方法對陣列進行增刪改時,頁面上的資料也會實時變化,具體的方法有以下幾種

遍歷物件

遍歷物件的方式和陣列基本類似,它支援三個引數,第一個為value值,第二個為key值,第三個為索引值

  let app = new Vue({
    el: '#app',
    data:{
      items: ['aaa', 'bbb', 'ccc', 'ddd'],
      obj: {
        name: 'zhangsan',
        age: 18,
        addr: 'china'
      }
    }
  })
  
  <div id="app">
  <ul>
    <li v-for="(item, index) in items">{{index}} - {{item}}</li>
  </ul>
  <ul>
    <li v-for="(value, key, index) in obj">{{index}} - {{key}} - {{value}}</li>
  </ul>
</div>


給物件動態的增加屬性並不會引起頁面的實時更新,但是修改已有屬性的值則會引起頁面實時更新

指定key

當在元件中使用v-for指令時,必須給每個元件指定key值,此key值必須是唯一的

6.過濾器

過濾器的作用就是通過管道對vue變數的值進一步處理,寫在app例項的options中的稱為區域性過濾器,使用Vue直接註冊的稱為全域性過濾器,優先使用區域性的

<div id="app">
  <h3>{{val | lower}}</h3>
</div>

let app = new Vue({
  el: '#app',
  data:{
    val: 'TEST'
  },
  filters:{
    lower(data){
      return data.toLowerCase()
    }
  }
})


程式碼的含義是當輸出val變數的值時先呼叫lower函式,進過處理後輸出lower函式的返回值
過濾器還可以多個同時使用,只需要使用|連線即可,返回的結果為最後一個過濾器返回的值

7.v-model

v-model指令可以實現表單的雙向繫結功能
在沒有v-model時可以使用v-bind繫結值

<div id="app">
  <input :value="val">
  <h3>val is: {{val}}</h3>
</div>

let app = new Vue({
  el: '#app',
  data:{
    val: 'aaa'
  }
})


直接通過控制檯修改值,頁面可以實時的更新

但是當在頁面上修改時,例項中的變數值並沒有變化

v-model指令可以實現雙向的改變,首先使用v-model替換v-bind

<div id="app">
  <input v-model="val">
  <h3>val is: {{val}}</h3>
</div>


此時通過輸入框就可以改變例項中變數的值了

雙向繫結原理

v-bind提供了例項物件到頁面的繫結,v-on可以監聽輸入框的輸入事件,並在例項中處理,因此將v-bind和v-on結合後就可以實現雙向綁定了

<div id="app">
  <input :value="val" @input="clk">
  <h3>val is: {{val}}</h3>
</div>

let app = new Vue({
  el: '#app',
  data:{
    val: 'aaa'
  },
  methods:{
    clk(event){
      this.val = event.target.value
    }
  }
})

修飾符

同事件指令一樣,v-model指令也提供了一些修飾符,用法同v-on指令