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 表单之间的数据传递代码
Dec 04 Javascript
jQuery-Tools-overlay 使用介绍
Jul 14 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
理解javascript中的MVC模式
Jan 28 Javascript
浅析Bootstrap组件之面板组件
May 04 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
原生JS下拉加载插件分享
Dec 26 Javascript
Vue制作Todo List网页
Apr 26 Javascript
Angular2使用Angular CLI快速搭建工程(一)
May 21 Javascript
微信公众号平台接口开发 菜单管理的实现
Aug 14 Javascript
JS pushlet XMLAdapter适配器用法案例解析
Oct 16 Javascript
vue 使用class创建和清除水印的示例代码
Dec 25 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
python 打印对象的所有属性值的方法
2016/09/11 Python
Python实现调度算法代码详解
2017/12/01 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
python实现猜拳游戏项目
2020/11/30 Python
什么是唯一索引
2015/07/05 面试题
介绍一下如何优化MySql
2016/12/20 面试题
一份创业计划书范文
2014/02/08 职场文书
科级干部考察材料
2014/02/15 职场文书
现场施工员岗位职责
2015/04/11 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
python用tkinter开发的扫雷游戏
2021/06/01 Python
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android