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学习笔记8 用JSON做原型
Jan 11 Javascript
纯javascript实现简单下拉刷新功能
Mar 13 Javascript
纯javascript实现四方向文本无缝滚动效果
Jun 16 Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
Apr 13 Javascript
详谈innerHTML innerText的使用和区别
Aug 18 Javascript
element-ui循环显示radio控件信息的方法
Aug 24 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 Javascript
浅谈JS中this在各个场景下的指向
Aug 14 Javascript
JavaScript oncopy事件用法实例解析
May 13 Javascript
vue实现数字滚动效果
Jun 29 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 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
10个实用的PHP代码片段
2011/09/02 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
Python批量查询域名是否被注册过
2017/06/21 Python
python模块之paramiko实例代码
2018/01/31 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
法国珠宝店:CLEOR
2017/01/29 全球购物
葡萄牙语专业个人求职信
2013/12/10 职场文书
学生保证书范文
2014/04/28 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
黄山导游词
2015/01/31 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python