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 学习笔记 Black.Caffeine 09.11.28
Nov 30 Javascript
js jquery数组介绍
Jul 15 Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 Javascript
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
jQuery实现大图轮播
Feb 13 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
第一次记录Bootstrap table学习笔记(1)
May 18 Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 Javascript
ES6之Proxy的get方法详解
Oct 11 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 Vue.js
如何手写简易的 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
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
求得div 下 img的src地址的js代码
2007/02/28 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
vue配置请求本地json数据的方法
2018/04/11 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
Fabric 应用案例
2016/08/28 Python
Python 12306抢火车票脚本
2018/02/07 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
java字符串格式化输出实例讲解
2021/01/06 Python
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
社区科普工作方案
2014/06/03 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技