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 相关文章推荐
一段效率很高的for循环语句使用方法
Aug 13 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
Oct 02 Javascript
Jquery 绑定时间实现代码
May 03 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
Dec 12 Javascript
浅谈javascript的调试
Jan 28 Javascript
javascript制作网页图片上实现下雨效果
Feb 26 Javascript
图解JavaScript中的this关键字
May 28 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
input 标签实现输入框带提示文字效果(两种方法)
Oct 09 Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
Jun 08 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字符串截取的简单方法
2013/07/04 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
Js apply方法详解
2017/02/16 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
python实现在目录中查找指定文件的方法
2014/11/11 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
Python函数式编程
2017/07/20 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
python之django母板页面的使用
2018/07/03 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
python实现的自动发送消息功能详解
2019/08/15 Python
python实现网站微信登录的示例代码
2019/09/18 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
建筑工程技术应届生求职信
2013/11/17 职场文书
行政前台岗位职责
2013/12/04 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
python创建字典及相关管理操作
2022/04/13 Python