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 相关文章推荐
jquery模拟按下回车实现代码
Sep 20 Javascript
基于jquery的鼠标拖动效果代码
May 30 Javascript
jquery选择器之基本过滤选择器详解
Jan 27 Javascript
jquery $.trim()方法使用介绍
May 21 Javascript
JQuery选择器绑定事件及修改内容的方法
Jan 23 Javascript
浅析Bootstrap缩略图组件与警示框组件
Apr 29 Javascript
AngularJS ng-template寄宿方式用法分析
Nov 07 Javascript
Vue响应式添加、修改数组和对象的值
Mar 20 Javascript
jQuery中的deferred对象和extend方法详解
May 08 jQuery
详解angular中的作用域及继承
May 31 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
Aug 07 Javascript
typescript配置alias的详细步骤
Aug 12 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
学习使用PHP数组
2006/10/09 PHP
如何在PHP中使用Oracle数据库(5)
2006/10/09 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
CentOS安装pillow报错的解决方法
2016/01/27 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
linux面试题参考答案(5)
2014/09/01 面试题
公路绿化方案
2014/05/12 职场文书
阅兵口号
2014/06/19 职场文书
会计人员演讲稿
2014/09/11 职场文书
三严三实心得体会范文
2014/10/13 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python