Отображение списка
Отображение массива в элементы с помощью v-for
Директива v-for может использоваться для вывода списка элементов на основе массива. Синтаксис для директивы v-for включает элемент в элементах, где исходные данные обозначены элементами, а элемент является псевдонимом для элемента массива, который будет повторяться:
<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
var example1 = new Vue({
el: '#example-1',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
У нас есть полный доступ к родительским свойствам области внутри блоков v-for. Vue-for поддерживает второй аргумент, который используется в качестве индекса текущего элемента.
<ul id="example-2">
<li v-for="(item, index) in items">
{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>
</ul>
var example2 = new Vue({
el: '#example-2',
data: {
parentMessage: 'Parent',
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
можно использовать как разделитель вместо:
<div v-for="item of items"></div>
V-для с объектом
v-for может использоваться для перебора свойств объекта.
<ul id="v-for-object" class="demo">
<li v-for="value in object">
{{ value }}
</li>
</ul>
new Vue({
el: '#v-for-object',
data: {
object: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10'
}
}
})
При желании вы можете добавить второй аргумент для имени свойства (он же ключ)
<div v-for="(value, name) in object">
{{ name }}: {{ value }}
</div>
Еще один может быть добавлен для индекса:
<div v-for="(value, name, index) in object">
{{ index }}. {{ name }}: {{ value }}
</div>
Поддержание государства
Всякий раз, когда Vue обновляет список, отображаемый с помощью v-for, он по умолчанию использует стратегию «исправления на месте». Если порядок элементов данных изменяется, а не перемещает элементы DOM в соответствии с порядком элементов, Vue исправляет элемент на месте и следит за тем, чтобы он отражал то, что должно быть отображено по этому конкретному индексу.
Если вы хотите, чтобы Vue отслеживал каждый идентификатор узла и, следовательно, повторно использовал и переупорядочивал существующие элементы, вам нужно будет предоставить уникальный атрибут ключа для каждого элемента:
<div v-for="item in items" v-bind:key="item.id">
<!-- content -->
</div>
Обнаружение изменений массива
Методы мутации
Мутация наблюдаемого массива может быть обернута Vue, чтобы они всегда вызывали обновления представления, и они:
- От себя()
- поп ()
- сдвиг()
- unshift ()
- сращивать ()
- Сортировать()
- задний ход()
Замена массива
Vue также предоставляет не мутирующие методы, filter (), concat () и slice (), которые не изменяют исходный массив, но всегда возвращают новый массив:
example1.items = example1.items.filter(function (item) {
return item.message.match(/Foo/)
})
Предостережения
Vue не может обнаружить следующие изменения в массиве из-за ограничений в JavaScript:
- когда элемент напрямую устанавливается с помощью индекса, например, vm.items [indexOfItem] = newValue
- когда изменяется длина массива, например, vm.item.length = newLength
var vm = new Vue({
data: {
items: ['a', 'b', 'c']
}
})
vm.items[1] ='x' // is NOT reactive
vm.items.length = 2 // is NOT reactive
Чтобы преодолеть первое предупреждение, следующее даст тот же результат, что и vm.items [indexOfItem] = newValue, а также инициирует обновление состояния в системе реактивности:
// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
в качестве псевдонима для глобального Vue.set вы можете использовать vm. $ set.
Чтобы решить второе предостережение, используйте метод соединения
vm.items.splice(newLength)
Предупреждение об обнаружении изменения объекта
Vue также не может обнаружить добавление или удаление свойства:
var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` is now reactive
vm.b = 2
// `vm.b` is NOT reactive
Динамическое добавление новых реактивных свойств корневого уровня в созданный экземпляр недопустимо в vue, но мы можем добавить к вложенному объекту, используя метод Vue.set (object, propertyName, value):
var vm = new Vue({
data: {
userProfile: {
name: 'Anika'
}
}
})
Вы можете добавить новое гендерное свойство во вложенный userProfile, используя:
Vue.set(vm.userProfile, 'gender','male')
Отображение отфильтрованных / отсортированных результатов
Есть моменты, когда мы хотим отобразить отфильтрованную или отсортированную версию массива без изменения исходных данных:
<li v-for="n in evenNumbers">{{ n }}</li>
data: {
numbers: [ 1, 2, 3, 4, 5 ]
},
computed: {
evenNumbers: function () {
return this.numbers.filter(function (number) {
return number % 2 === 0
})
}
}
Для выполнения вложенных для tate, пожалуйста, используйте метод для обработки этого:
<li v-for="n in even(numbers)">{{ n }}</li>
data: {
numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
even: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0
})
}
}
V-для с диапазоном
V-for также может принимать целое число в качестве параметра цикла:
<div>
<span v-for="n in 10">{{ n }} </span>
</div>
v-for на <шаблон >>
мы можем визуализировать блок из нескольких элементов в v-for, используя <template>:
<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="divider" role="presentation"></li>
</template>
</ul>
V-для с V-если
всякий раз, когда v-for и v-if используются в одном и том же узле, v-for имеет более высокий приоритет, чем v-if.
V-для с компонентом
Как и любой обычный элемент, мы можем напрямую использовать v-for для пользовательского компонента:
<my-component v-for="item in items" :key="item.id"></my-component>
Однако вам нужно будет использовать опору для автоматической передачи любых данных:
<my-component
v-for="(item, index) in items"
v-bind:item="item"
v-bind:index="index"
v-bind:key="item.id"
></my-component>
Ниже приведен пример кода для простого приложения To-Do
<div id="todo-list-example">
<form v-on:submit.prevent="addNewTodo">
<label for="new-todo">Add a todo</label>
<input
v-model="newTodoText"
id="new-todo"
placeholder="E.g. Feed the cat"
>
<button>Add</button>
</form>
<ul>
<li
is="todo-item"
v-for="(todo, index) in todos"
v-bind:key="todo.id"
v-bind:title="todo.title"
v-on:remove="todos.splice(index, 1)"
></li>
</ul>
</div>
Vue.component('todo-item', {
template: '\
<li>\
{{ title }}\
<button v-on:click="$emit(\'remove\')">Remove</button>\
</li>\
',
props: ['title']
})
new Vue({
el: '#todo-list-example',
data: {
newTodoText: '',
todos: [
{
id: 1,
title: 'Do the dishes',
},
{
id: 2,
title: 'Take out the trash',
},
{
id: 3,
title: 'Mow the lawn'
}
],
nextTodoId: 4
},
methods: {
addNewTodo: function () {
this.todos.push({
id: this.nextTodoId++,
title: this.newTodoText
})
this.newTodoText = ''
}
}
})
Новый контент: Composer: менеджер зависимостей для PHP , R программирования