ホームページ > 記事 > ウェブフロントエンド > vuejs でのリスト レンダリングの詳細な紹介
この記事では、vuejs でのリスト レンダリングについて詳しく説明します。必要な方は参考にしていただければ幸いです。
配列を要素のセットに対応させるには v-for を使用します
v-for 命令を使用して、配列のセットのオプション リストに基づいてレンダリングします。 v-for ディレクティブには、items 内のフォーム item の特別な構文が必要です。ここで、items はソース データ配列であり、item は配列要素を反復処理するためのエイリアスです。
<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 では、親スコープのプロパティに完全にアクセスできます。 v-for は、現在の項目のインデックスであるオプションの 2 番目のパラメーターもサポートします。
<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' } ] } })
inの代わりにofを区切り文字として使用することもできます。これは、オブジェクトのjavascriptイテレータ
<p v-for="item of items"></p>
v-forに最も近い構文であるためです
また、v-forを使用して渡すこともできますan オブジェクトのプロパティを反復処理します。
<ul id="v-for-object" class="demo"> <li v-for="value in object"> {{ value }} </li> </ul> new Vue({ el: '#v-for-object', data: { object: { firstName: 'John', lastName: 'Doe', age: 30 } } })
2 番目のパラメータをキー名として指定することもできます
<p v-for="(value, key) in object"> {{ key }}: {{ value }} </p>
3 番目のパラメータはインデックスです:
<p v-for="(value, key, index) in object"> {{ index }}. {{ key }}: {{ value }} </p>
オブジェクトを横切るとき、 Object.key() の結果に従って走査されますが、その結果が異なる JavaScript エンジンの下で一貫しているという保証はありません
key
vue.js が v-for を使用してレンダリングされた要素リストを更新するとき、彼は次のように使用します。デフォルトでは「インプレース再利用」戦略。データ項目の順序が変更された場合。 Vue は、データ項目の順序に一致するように DOM 要素を移動しませんが、単にそこにある各要素を再利用し、特定のインデックスでレンダリングされた各要素が表示されるようにします。これは、vue1.x の track-by="$index" に似ています。
このデフォルト モードは効率的ですが、サブコンポーネントの状態や一時的な DOM 状態 (フォーム入力値など) に依存しないリスト レンダリング出力にのみ適しています。
各ノードの ID を追跡して既存の要素を再利用したり並べ替えたりできるように Vue にヒントを与えるには、各項目に一意のキー属性を提供する必要があります。理想的なキー値は各項目の一意の ID です。この特別な属性は vue1.x の track-by と同等ですが、属性のように機能するため、値を動的にバインドするには v-bind を使用する必要があります。
<p v-for="item in items" :key="item.id"> <!-- 内容 --> </p>
出力 DOM コンテンツの走査が非常に簡単でない場合、またはデフォルトの動作に依存してパフォーマンスの向上が得られる場合を除き、 v-for を使用するときは可能な限りキーを提供することをお勧めします。
ノードを識別するための vue の一般的なメカニズムであるため、key は v-for とは特に関係ありません。Key には他の用途もあります
コンパイルメソッドvue には常に監視するコンパイルが含まれます。配列メソッドなので、ビューの更新もトリガーされます。
* Push()————配列内へ
* Pop()————配列外へ
* SHIFT()————
* unshift()
* splice()————配列を分割
* sort()————配列を並べ替える
* reverse ()———— —Flip Array
Replace ArrayMutation メソッド。これらのメソッドによって呼び出される元の配列を変更します。対照的に、非突然変異的方法もあります。 例: filter()、concat()、slice()。
これらは元の配列を変更しませんが、常に新しい配列を返します。非突然変異メソッドを使用する場合、古い配列を新しい配列に置き換えることができます
example1.items = example1.items.filter(function (item) {
return item.message.match(/Foo/)
})
これにより、vue が既存の dom を破棄し、リスト全体を再レンダリングすることになると思うかもしれません。幸いなことに、これは当てはまりません。Vue は DOM 要素を最大限に再利用するために、いくつかのスマートでヒューリスティックなメソッドを実装しているため、元の配列を同じ要素を含む配列に置き換えることは非常に効率的な操作です。
注意事項
JavaScript の制限により、vue は次の変更された配列を検出できません
1。たとえば、インデックスを使用して項目を直接設定する場合: vm.items[indexOfItem] = newValue
2。配列の長さ (例: vm.items.length = newLength
var vm = new Vue({
data: {
items: ['a', 'b', 'c']
}
})
vm.items[1] = 'x' // 不是响应性的
vm.items.length = 2 // 不是响应性的
) 最初のタイプの問題を解決するには、次の 2 つの方法で vm.items[indexOfItem] = と同じ効果を達成できます。 newValue と同時にステータスの更新もトリガーされます
你也可以使用vm.$set实例方法,该方法是全局方法vue.set的一个别名 为了解决第二类问题,你可以使用splice splice()方法向/从数组添加/删除项目,然后返回被删除的项目 index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 item1, ..., itemX 可选。向数组添加的新项目。 对象更改检测注意事项 还是由于javascript的限制,vue不能检测对象属性的添加或删除 对于已经创建的实例,vue不能动态添加跟级别的响应式属性。但是,可以使用 Vue.set(object, key, value)方法向嵌套对象添加响应式属性。 你可以添加一个age属性到嵌套的userProfile对象: 你还可以使用vm.$set实例方法,他只是全局vue.set的别名 有事你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样: 显示过滤/排序结果 有事,我们想要显示一个数组的过滤或排序副本,而不实际改变 或重置原始数据。在这种情况下,可以创建返回过滤或排序 数组的计算属性。 在计算属性不使用的情况下,(例如,在嵌套v-for循环中)你可以使用method方法。 一段取值范围的v-for v-for也可以取整数。在这种情况下 ,它将重复多刺激模板。 v-for on a d477f9ce7bf77f53fbcf36bec1b69b7a 类似于v-if,你也可以利用带有v-for的d477f9ce7bf77f53fbcf36bec1b69b7a渲染多个元素。 v-for with v-if 当他们处于同一节点,v-for的优先级比v-if更高,这意味着v-if将分别重复运行与每个v-for循环中。当你想为仅有的一些项渲染节点时,这种优先级的机制会十分有用。 上面的代码只传递了未完成的 todos。 而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 d477f9ce7bf77f53fbcf36bec1b69b7a)上。如: 一个组件的v-for 了解组件相关知识,查看组件。完全可以先跳过他,以后再回来 查看。 在自定义组件里,你可以像任何普通元素一样用v-for. 当在组件中使用 v-for 时,key 现在是必须的。 然而,任何数据都不会被自动传递到组件里,因为组件有自己独立的作用域。为了把迭代数据传递到组件里。 我们要用props: 不自动将item注入到组件里的原因是,这会使得组件与v-for的运作紧密耦合。明确组件数据的来源能够使组件在其他场合重复使用。 注意这里的is="todo-item"属性。这种做法在使用dom模板时是十分必要的。因为在ff6d136ddc5fdfeffaf53ff6ee95f185元素内只有25edfb22a4f469ecb59f1190150159c6元素 会被看做有效内容。这样做实现的效果与c20b531f5b99ef8837ce29ced08ba7cd相同。但是可以避开一些潜在的浏览器解析错误。 注意这里的 is="todo-item" 属性。这种做法在使用 DOM 模板时是十分必要的,因为在 ff6d136ddc5fdfeffaf53ff6ee95f185 元素内只有 25edfb22a4f469ecb59f1190150159c6 元素会被看作有效内容。这样做实现的效果与 c20b531f5b99ef8837ce29ced08ba7cd 相同,但是可以避开一些潜在的浏览器解析错误。查看 DOM 模板解析说明 来了解更多信息。 相关推荐:// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
vm.$set(vm.items, indexOfItem, newValue)
vm.items.splice(newLength)
arrayObject.splice(index,howmany,item1,.....,itemX)
var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` 现在是响应式的
vm.b = 2
// `vm.b` 不是响应式
var vm = new Vue({
data: {
userProfile: {
name: 'Anika'
}
}
})
Vue.set(vm.userProfile, 'age', 27)
vm.$set(vm.userProfile, 'age', 27)
Object.assign(vm.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})
你应该这样:
vm.userProfile = Object.assign({}, vm.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})
<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
})
}
}
data: {
numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
even: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0
})
}
}
<p>
<span v-for="n in 10">{{ n }} </span>
</p>
<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="pider" role="presentation"></li>
</template>
</ul>
<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo }}
</li>
<ul v-if="todos.length">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
<p v-else>No todos left!</p>
<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>
<p 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>
</p>
<p 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>
</p>
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 = ''
}
}
})
以上がvuejs でのリスト レンダリングの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。