永远不要把 v-if 和 v-for 同时用在同一个元素上。

一般我们在两种常见的情况下会倾向于这样做:

  • 为了过滤一个列表中的项目 (比如 v-for="user in users" v-if="user.isActive")。在这种情形下,请将 users替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。

  • 为了避免渲染本应该被隐藏的列表 (比如 v-for="user in users" v-if="shouldShowUsers")。这种情形下,请将 v-if 移动至容器元素上 (比如 ulol)。

详解

当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,所以这个模板:

<ul><liv-for="user in users"v-if="user.isActive":key="user.id">{{ user.name }}</li>
</ul>

将会经过如下运算:

this.users.map(function (user) {if (user.isActive) {return user.name}
})

因此哪怕我们只渲染出一小部分用户的元素,也得在每次重渲染的时候遍历整个列表,不论活跃用户是否发生了变化。

通过将其更换为在如下的一个计算属性上遍历:

computed: {activeUsers: function () {return this.users.filter(function (user) {return user.isActive})}
}
<ul><liv-for="user in activeUsers":key="user.id">{{ user.name }}</li>
</ul>

我们将会获得如下好处:

  • 过滤后的列表会在 users 数组发生相关变化时才被重新运算,过滤更高效。
  • 使用 v-for="user in activeUsers" 之后,我们在渲染的时候遍历活跃用户,渲染更高效。
  • 解藕渲染层的逻辑,可维护性 (对逻辑的更改和扩展) 更强。

为了获得同样的好处,我们也可以把:

<ul><liv-for="user in users"v-if="shouldShowUsers":key="user.id">{{ user.name }}</li>
</ul>

更新为:

<ul v-if="shouldShowUsers"><liv-for="user in users":key="user.id">{{ user.name }}</li>
</ul>

通过将 v-if 移动到容器元素,我们不会再对列表中的每个用户检查 shouldShowUsers。取而代之的是,我们只检查它一次,且不会在 shouldShowUsers 为否的时候运算 v-for

本面试题为前端常考面试题,后续有机会继续完善。我是歌谣,一个沉迷于故事的讲述者。

欢迎一起私信交流。

“睡服“面试官系列之各系列目录汇总(建议学习收藏)

“约见”面试官系列之常见面试题之第七十四篇之v-if和v-for优先级(建议收藏)相关推荐

  1. “约见”面试官系列之常见面试题之第八十八篇之什么是vue生命周期(建议收藏)

    我们知道vue是一个构建数据驱动的 web 界面的渐进式框架,那么vue生命周期是什么呢?本篇文章就给大家来介绍一下vue生命周期的内容,希望可以帮助到有需要的朋友. vue生命周期是什么? Vue生 ...

  2. “约见”面试官系列之常见面试题之第六十二篇之IE和兼容下写法(建议收藏)

    1)获取事件对象:var ev = ev || window.event 2)获取页面的可视区的宽度:document.documentElement.clientWidth || document. ...

  3. “约见”面试官系列之常见面试题之第五十二篇之标准模式和怪异模式(建议收藏)

    在标准模式页面按照HTML,CSS的定义渲染,而在怪异模式就是浏览器为了兼容很早之前针对旧版本浏览器设计,并未严格遵循W3C标准而产生的一种页面渲染模式.浏览器基于页面中文件类型描述的存在以决定采用哪 ...

  4. “约见”面试官系列之常见面试题之第八十四篇之手写promise(建议收藏)

    class Promise{constructor(excutor){this.value = '';this.reason = '';this.status = 'padding'this.onFu ...

  5. “约见”面试官系列之常见面试题之第七十九篇之ES5和ES6(建议收藏)

    什么是JavaScript JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能.(好吧,概念什么最讨厌了) 动态: 在运行时确定数据类型.变量使用之前不 ...

  6. “约见”面试官系列之常见面试题之第七十八篇之fetch(建议收藏)

    etch是一种HTTP数据请求的方式,是XMLHttpRequest的一种替代方案.fetch不是ajax的进一步封装,而是原生js.Fetch函数就是原生js,没有使用XMLHttpRequest对 ...

  7. “约见”面试官系列之常见面试题之第七十六篇之vue-router中的路由钩子函数基本用法 (建议收藏)

    vue-router中的路由钩子函数基本用法 路由钩子函数分为三种类型如下: 第一种:全局钩子函数. router.beforeEach((to, from, next) => { consol ...

  8. “约见”面试官系列之常见面试题之第七十五篇之vue中如何使当前css起作用(建议收藏)

    方法很简单,在组件中的style前面加上scoped就可以了,示例: 本面试题为前端常考面试题,后续有机会继续完善.我是歌谣,一个沉迷于故事的讲述者. 欢迎一起私信交流. "睡服" ...

  9. “约见”面试官系列之常见面试题之第七十二篇之arrayList(建议收藏)

    简介 ArrayList 是 java 集合框架中比较常用的数据结构了.继承自 AbstractList,实现了 List 接口.底层基于数组实现容量大小动态变化.允许 null 的存在.同时还实现了 ...

最新文章

  1. grafana3.1.0安装配置
  2. TS2003基于触摸屏的应用
  3. Mac安装CentOS7
  4. c++代码表白_微信表情翻译成文字代码,微信表情翻译我喜欢你[多图]-软件资讯...
  5. 计算机虚拟仪器技术与测试技术相关的概念,虚拟测试技术概念辨析.pdf
  6. EMC标准与测试方法
  7. LP3667B反激式开关电源5W(5V1A)输出电路
  8. NSSM部署Net Core流程
  9. 部队室内靶场有哪些硬件设备和强制性存在的系统
  10. win10蓝屏无法进入系统_WIN10系统进“吃鸡”蓝屏
  11. NYOJ 137 取石子(三)(教主神题)
  12. Cadence修改打开默认版本
  13. VS2019 Community许可证过期
  14. 在vue项目中使用axios封装axios
  15. web服务器--基于同一IP的不同端口访问不同网站
  16. outlook邮箱邮件内容乱码_邮件里的内容全是乱码怎么办?
  17. 独家区块链商城CCMALL:从加入CCMALL那一刻起就知道我跟对了
  18. Vue之图片懒加载vue-lazyload
  19. Oculus Home登录卡在提示在浏览器中继续操作
  20. github上适合练习的vue、react项目

热门文章

  1. Python——三级菜单
  2. 十、input与跳转
  3. 垂直和水平居中方法小结
  4. Cronolog 分割 Tomcat8 Catalina.out日志 (转)
  5. Android Service 生命周期
  6. Unity3D For Android 开发教程【转http://game.ceeger.com/Unity/Doc/2011/Unity3D_For_Android.html】...
  7. winform中listView
  8. Flash 缓存问题的解决(转)
  9. 2个字段并在一次插入一个字段里面_elasticsearch外用与内观(二)-当插入文档时,elasticsearch都在做什么...
  10. ajaxfileupload 返回值_ajaxFileUpload上传文件返回json无法解析