1. 程式人生 > >VUE(v-for 陣列、物件更新檢測)

VUE(v-for 陣列、物件更新檢測)

v-for詳解:v-for支援一個第二引數作為當前項的索引
陣列中

<ul id="example-2">
  <li v-for="(item, index) in items">
    {{ index }} - {{ item.message }}
  </li>
</ul>
var example2 = new Vue({
  el: '#example-2',
  data: {
    items: [
      { message: 'Foo' },
      { message: 'Bar' }
    ]
  }
})

輸出的結果為 0-FOO 1-Bar

v-for遍歷物件:

<div v-for="(value, key, index) in object">
  {{ index }}. {{ key }}: {{ value }}
</div>
new Vue({
  el: '#v-for-object',
  data: {
    object: {
      firstName: 'John',
      lastName: 'Doe',
      age: 30
    }
  }
})

輸出的結果為
0.firstName:’John’
1.lastName:’Doe’
2.age:30
可以看出來 第一個引數為屬性值 第二個引數為屬性名 第三個引數為索引
VUE官方建議在使用v-for進行渲染時v-bind一個key值。對於key值在上一篇有過介紹。

一段範圍內的v-for:

  <span v-for="n in 10">{{ n }} </span>

輸出1、2、3、4、5、6、7、8、9、10

使用v-for渲染多個元素,可以與v-if一樣使用temptemplate標籤當成容器

<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider"></li>
  </template>
</ul>

在v-if與v-for同時使用時,v-for的優先順序更高,也就是說,當在一個標籤同時使用兩者時,v-if會成為v-for的一個條件判斷。

<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo }}
</li>

如果希望跳過迴圈執行,可以將v-if寫在父級元素上,先進性條件的判斷,在進行迴圈。

<ul v-if="todos.length">
  <li v-for="todo in todos">
    {{ todo }}
  </li>
</ul>

陣列的更新檢測
vue提供了觀察陣列的變異方法,當以下方法呼叫時,檢視會響應式更新

push()          pop()
shift()         unshift()
splice()        sort()
reverse()

陣列還有一些非變異的方法,當使用這些(如:filter(), concat() 和 slice())方法時,可以用返回的新陣列替換原有的舊陣列。

example1.items = example1.items.filter(function (item) {
  return item.message.match(/Foo/)
})

對於v-for在組建重的應用還需要理解。。後續會單獨更新
物件的更改檢測
在閱讀官方文件過程中,在這裡理解了一些時間
由於js的限制,vue中物件的一些改變方法不能被檢測到,從而導致不能響應到檢視層。

var vm = new Vue({
  data: {
    a: 1
  }
})

vm.b = 2

對於這種方式物件的改變 , 不能夠被vue檢測到 vm.b 是不能夠響應到檢視層,從而不能得到我們想要的結果,我們可以使用下面的方法代替:

var vm = new Vue({
  data: {
    A: {
      name: 'Anika'
    }
  }
})

使用Vue.set()

Vue.set(vm.A, 'age', 27)

vm.$set是Vue.set的別名

this.$set(A, 'age', 27)

我們想利用vue的Object.assign()或者 _.extend()方法新增多個物件的屬性,需要這樣寫

this.A = Object.assign({}, this.A, {
  age: 27,
  Color: 'Vue Green'
})

這樣既可以改變物件的屬性與屬性值,還可以觸發vue的檢測。