ホームページ > ウェブフロントエンド > jsチュートリアル > vuejs でのリスト レンダリングの詳細な紹介

vuejs でのリスト レンダリングの詳細な紹介

不言
リリース: 2018-08-14 16:47:38
オリジナル
2826 人が閲覧しました

この記事では、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: &#39;#example-1&#39;,
data: {
items: [
{ message: &#39;Foo&#39; },
{ message: &#39;Bar&#39; }
]
}
})
ログイン後にコピー

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: &#39;#example-2&#39;,
data: {
parentMessage: &#39;Parent&#39;,
items: [
{ message: &#39;Foo&#39; },
{ message: &#39;Bar&#39; }
]
}
})
ログイン後にコピー

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: &#39;#v-for-object&#39;,
data: {
object: {
firstName: &#39;John&#39;,
lastName: &#39;Doe&#39;,
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 Array

Mutation メソッド。これらのメソッドによって呼び出される元の配列を変更します。対照的に、非突然変異的方法もあります。 例: 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: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
}
})
vm.items[1] = &#39;x&#39; // 不是响应性的
vm.items.length = 2 // 不是响应性的
ログイン後にコピー
) 最初のタイプの問題を解決するには、次の 2 つの方法で vm.items[indexOfItem] = と同じ効果を達成できます。 newValue と同時にステータスの更新もトリガーされます

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
ログイン後にコピー

你也可以使用vm.$set实例方法,该方法是全局方法vue.set的一个别名

vm.$set(vm.items, indexOfItem, newValue)
ログイン後にコピー

为了解决第二类问题,你可以使用splice

vm.items.splice(newLength)
ログイン後にコピー

splice()方法向/从数组添加/删除项目,然后返回被删除的项目

arrayObject.splice(index,howmany,item1,.....,itemX)
ログイン後にコピー

index

必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。

howmany

必需。要删除的项目数量。如果设置为 0,则不会删除项目。

item1, ..., itemX

可选。向数组添加的新项目。

对象更改检测注意事项

还是由于javascript的限制,vue不能检测对象属性的添加或删除

var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` 现在是响应式的
 
vm.b = 2
// `vm.b` 不是响应式
ログイン後にコピー

对于已经创建的实例,vue不能动态添加跟级别的响应式属性。但是,可以使用 Vue.set(object, key, value)方法向嵌套对象添加响应式属性。

var vm = new Vue({
data: {
userProfile: {
name: &#39;Anika&#39;
}
}
})
ログイン後にコピー

你可以添加一个age属性到嵌套的userProfile对象:

Vue.set(vm.userProfile, &#39;age&#39;, 27)
ログイン後にコピー

你还可以使用vm.$set实例方法,他只是全局vue.set的别名

vm.$set(vm.userProfile, &#39;age&#39;, 27)
ログイン後にコピー

有事你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

Object.assign(vm.userProfile, {
age: 27,
favoriteColor: &#39;Vue Green&#39;
})
你应该这样:
vm.userProfile = Object.assign({}, vm.userProfile, {
age: 27,
favoriteColor: &#39;Vue Green&#39;
})
ログイン後にコピー

显示过滤/排序结果

有事,我们想要显示一个数组的过滤或排序副本,而不实际改变 或重置原始数据。在这种情况下,可以创建返回过滤或排序 数组的计算属性。

<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
    })
  }
}
ログイン後にコピー

在计算属性不使用的情况下,(例如,在嵌套v-for循环中)你可以使用method方法。

data: {
numbers: [ 1, 2, 3, 4, 5 ]
},
methods: {
even: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0
})
}
}
ログイン後にコピー

一段取值范围的v-for

v-for也可以取整数。在这种情况下 ,它将重复多刺激模板。

<p>
<span v-for="n in 10">{{ n }} </span>
</p>
ログイン後にコピー

v-for on a