一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - vue2和vue3的v-if與v-for優先級對比學習

vue2和vue3的v-if與v-for優先級對比學習

2021-10-21 14:48前端攻城師_老李 JavaScript

這篇文章主要介紹了vue2和vue3的v-if與v-for優先級對比學習,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Vue.js 中使用最多的兩個指令就是 v-ifv-for ,因此我們可能會想要同時使用它們。雖然官方不建議這樣做,但有時確實是必須的,我們來了解下他們的工作方式:

  • vue 2.x 中,在一個元素上同時使用 v-ifv-for 時, v-for 會優先作用。
  • 在 vue 3.x 中, v-if 總是優先于 v-for 生效。

對比學習

接下來我們通過一個簡單的示例來感知下,假設我們想要實現一個極簡的 todoList 效果:

vue2和vue3的v-if與v-for優先級對比學習

我們有一個 todoList:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const todoList = [
 {
 id: 0,
 task: '吃飯',
 done: true,
 },
 {
 id: 1,
 task: '睡覺',
 done: false,
 },
 {
 id: 2,
 task: '洗澡',
 done: true,
 },
 // ...,
];

在 vue2 中, v-for 優先級高于 v-if ,我們可以這樣實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
<ul>
 <!-- vue2中,v-for優先級高于v-if -->
 <li v-for="item in todoList" v-if="!item.done" :class="{todo: !item.done}" :key="item.id">
 <span>{{item.task}}</span>
 </li>
</ul>
 
<ul>
 <li v-for="item in todoList" v-if="item.done" :class="{finished: item.done}" :key="item.id">
 <span>{{item.task}}</span>
 </li>
</ul>

在 vue3 中,由于 v-if 優先級要高于 v-for ,所以不能像 vue2 那樣將 v-forv-if 放在同一個元素上,我們在 li 外面套一層用來執行 for 循環:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<ul>
 <template v-for="item in list" :key="item.id">
 <li v-if="!item.done" :class="{todo: !item.done}">
  <span>{{item.task}}</span>
 </li>
 </template>
</ul>
<ul>
 <template v-for="item in list" :key="item.id">
 <li v-if="item.done" :class="{finished: item.done}">
  <span>{{item.task}}</span>
 </li>
 </template>
</ul>

可以看出,如果在 vue2.x 中 v-ifv-for 在同一個元素上使用是無法直接在 vue3.x 中兼容的。

最佳實踐

針對 v-ifv-for 的使用,其實官方是建議我們使用計算屬性來處理的,這樣既提高了性能,又可以兼容到 vue3.x,接下來我們看看計算屬性實現方式:

模板部分:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div id="app">
 <!-- 最佳實踐 -->
 <ul class="todo-list">
 <li v-for="item in todos" class="todo" :key="item.id">
  <span>{{item.task}}</span>
 </li>
 </ul>
 
 <ul v-if="showFinished">
 <li v-for="item in finished" :key="item.id" class="finished">
  <span>{{item.task}}</span>
 </li>
 </ul>
 
 <p>
 show finished?
 <input type="checkbox" v-model="showFinished" />
 {{showFinished ? 'yes' : 'no'}}
 </p>
</div>

js 部分:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// vue3.x
Vue.createApp({
 data() {
 return {
  msg: 'Todo List',
  showFinished: true,
  list: todoList,
 };
 },
 computed: {
 finished() {
  return todoList.filter(t => t.done);
 },
 todos() {
  return todoList.filter(t => !t.done);
 },
 },
}).mount('#app');
 
// vue2.x
new Vue({
 el: '#app',
 data() {
 return {
  msg: 'Todo List',
  showFinished: true,
  list: todoList,
 };
 },
 computed: {
 finished() {
  return todoList.filter(t => t.done);
 },
 todos() {
  return todoList.filter(t => !t.done);
 },
 },
});

點擊查看: vue3示例 vue2示例

總結

  1. vue2.x 中 v-for 優先級高于 v-if ,vue3.x 相反;
  2. 盡量避免在同一個元素上面同時使用 v-ifv-for ,建議使用計算屬性替代。

到此這篇關于vue2和vue3的v-if與v-for優先級對比學習的文章就介紹到這了,更多相關v-if與v-for優先級內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.im/post/6881581395068747790

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲天堂2013 | 美女和男人免费网站视频 | 精品久久久久国产免费 | 91精品国产9l久久久久 | 91极品女神久色在线播放 | 丰满艳妇亲伦视频 | 欧美一区二区三区四区视频 | 久久爽狠狠添AV激情五月 | 日日干夜夜拍 | 国产精品反差婊在线观看 | www.大逼色 | 免费一级国产生活片 | 欧美一区二区三区久久久 | 99精品热线在线观看免费视频 | 欧美国产在线观看 | 亚洲伦理天堂 | 午夜特级毛片 | 色在线看 | 亚洲国产精品日韩高清秒播 | 91免费播放人人爽人人快乐 | 国产亚洲精品一区二区在线观看 | 国产nv精品你懂得 | 成人久久18免费网站 | 美国女孩毛片 | 亚洲国产综合自在线另类 | 精品欧美一区二区精品久久 | 青草视频网站 | 99久久无色码中文字幕 | 国产美女亚洲精品久久久综合91 | 国产精品视频免费视频 | 2020最新版的ab片 | 女主被男主为催奶药h | 俄罗斯女人与公拘i交酡 | 欧美日韩一区二区三在线 | 亚洲大片免费观看 | 欧美日韩国产超高清免费看片 | 午夜小视频免费 | 無码一区中文字幕少妇熟女网站 | 午夜亚洲视频 | 丝瓜茄子绿巨人秋葵榴莲污 | 99re思思 |