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 相关文章推荐
关于__defineGetter__ 和__defineSetter__的说明
May 12 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
Jun 04 Javascript
alert出数组中的随即值代码
Sep 25 Javascript
Highcharts学习之数据列
Aug 03 Javascript
zTree实现节点修改的实时刷新功能
Mar 20 Javascript
关于Node.js的events.EventEmitter用法介绍
Apr 01 Javascript
vue toggle做一个点击切换class(实例讲解)
Mar 13 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
Apr 17 Javascript
VSCode搭建Vue项目的方法
Apr 30 Javascript
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
k8s node节点重新加入master集群的实现
Feb 22 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
php基础知识:函数基础知识
2006/12/13 PHP
php 数组使用详解 推荐
2011/06/02 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
js比较日期大小的方法
2015/05/12 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
python操作ie登陆土豆网的方法
2015/05/09 Python
python语言中with as的用法使用详解
2018/02/23 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
Python如何实现转换URL详解
2019/07/02 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
女子职高个人自荐书
2014/02/01 职场文书
操行评语大全
2014/04/30 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
2014年优秀党员材料
2014/12/18 职场文书
三潭印月的导游词
2015/02/12 职场文书
写给老婆的保证书
2015/02/27 职场文书
oracle索引总结
2021/09/25 Oracle