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实现网页图片等比例缩放实现代码及调用方式
Feb 25 Javascript
js中Image对象以及对其预加载处理示例
Nov 20 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
Jun 16 Javascript
jquery实现对联广告的方法
Feb 05 Javascript
JS模拟超市简易收银台小程序代码解析
Aug 18 Javascript
vue中mint-ui的使用方法
Apr 04 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
Feb 11 Javascript
vue实现随机验证码功能的实例代码
Apr 30 Javascript
vue自定义树状结构图的实现方法
Oct 18 Javascript
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
关于Vue Router的10条高级技巧总结
May 06 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和ACCESS写聊天室(七)
2006/10/09 PHP
php中目录,文件操作详谈
2007/03/19 PHP
组合算法的PHP解答方法
2012/02/04 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
smarty中post用法实例
2014/11/28 PHP
php生成二维码
2015/08/10 PHP
php生出随机字符串
2017/07/06 PHP
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
Js面试算法详解
2018/04/08 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
Python中的localtime()方法使用详解
2015/05/22 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
python属于软件吗
2020/06/18 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
双语教学实施方案
2014/03/23 职场文书
高中生评语大全
2014/04/25 职场文书
创建文明城市倡议书
2015/04/28 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
php中pcntl_fork详解
2021/04/01 PHP