vue2和vue3的v-if与v-for优先级对比学习


Posted in Javascript onOctober 10, 2020

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:

const todoList = [
 {
 id: 0,
 task: '吃饭',
 done: true,
 },
 {
 id: 1,
 task: '睡觉',
 done: false,
 },
 {
 id: 2,
 task: '洗澡',
 done: true,
 },
 // ...,
];

在 vue2 中, v-for 优先级高于 v-if ,我们可以这样实现:

<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 循环:

<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,接下来我们看看计算属性实现方式:

模板部分:

<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 部分:

// 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优先级内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
根据地区不同显示时间的javascript代码
Aug 13 Javascript
javascript dom 操作详解 js加强
Jul 13 Javascript
javascript简单事件处理和with用法介绍
Sep 16 Javascript
JQuery实现动态表格点击按钮表格增加一行
Aug 24 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
jQuery+HTML5实现图片上传前预览效果
Aug 20 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
Sep 17 Javascript
vue router使用query和params传参的使用和区别
Nov 13 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 Javascript
webpack3升级到webpack4遇到问题总结
Sep 30 Javascript
JavaScript观察者模式原理与用法实例详解
Mar 10 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
Oct 29 Javascript
如何手写简易的 Vue Router
Oct 10 #Javascript
如何手写一个简易的 Vuex
Oct 10 #Javascript
echarts实现晶体球面投影的实例教程
Oct 10 #Javascript
详解Vue中Axios封装API接口的思路及方法
Oct 10 #Javascript
在Vue中使用Echarts实例图的方法实例
Oct 10 #Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
Oct 09 #Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
Oct 09 #jQuery
You might like
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
2017/11/06 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
python sort、sort_index方法代码实例
2019/03/28 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
生日宴会答谢词
2014/01/09 职场文书
学徒工职责
2014/03/06 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
党员转正党支部意见
2015/06/02 职场文书
周末问候语大全
2015/11/10 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python