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 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
Jquery 获取checkbox的checked问题
Nov 16 Javascript
javascript 构造函数强制调用经验总结
Dec 02 Javascript
jquery js 获取时间差、时间格式具体代码
Jun 05 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
Jun 21 Javascript
jQuery实现的放大镜效果示例
Sep 13 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
Jan 17 Javascript
详解vue mixins和extends的巧妙用法
Dec 20 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
Jan 10 Javascript
jQuery实现参数自定义的文字跑马灯效果
Aug 15 jQuery
vue组件间通信六种方式(总结篇)
May 15 Javascript
如何在JavaScript中等分数组的实现
Dec 13 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操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
jquery $.ajax入门应用二
2008/11/19 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
js实现随机点名小功能
2017/08/17 Javascript
windows下更新npm和node的方法
2017/11/30 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
详解Webpack4多页应用打包方案
2020/07/16 Javascript
js实现电灯开关效果
2021/01/19 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
从零学Python之入门(五)缩进和选择
2014/05/27 Python
Python中非常实用的一些功能和函数分享
2015/02/14 Python
python发送邮件功能实现代码
2016/07/15 Python
Python将string转换到float的实例方法
2019/07/29 Python
python实现的生成word文档功能示例
2019/08/23 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
德国网上药房:Apotal
2017/04/04 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
《问银河》教学反思
2014/02/19 职场文书
领导干部失职检讨书
2015/05/05 职场文书
军事理论课感想
2015/08/11 职场文书