大家好,我是宝哥
最近我做了一个统计爬虫,专门统计公众号上前端开发号主发表文章的数据,后面可能会多多分享一些热门文章给你们。喜欢的话记得关注我,有哪些喜欢的前端号主也可以推荐给我。
今天分享一个老八股文Vue面试题,作者讲的很清楚。喜欢本文记得文末点赞告诉我。
爬虫数据:阅读:4214 在看:7 点赞: 41 评论: 0 all:48
老八股文了?
当我们提到 Vue 的面试题时,不免总会提到一个问题:v-for 和 v-if 可以共存吗?
提到这个问题,很多人肯定会脱口而出:
Vue2 中 不可以
Vue3 中 可以
再往深问,可能少部分人会回答出:
Vue2 中 v-for 优先级比 v-if 高
Vue3 中 v-if 优先级比 v-for 高
但是其实很多人都是背的,具体为啥会这样,很多人都没搞清楚,稍微再往深一问,95%的人就回答不出来了~
重新认识两者优先级~
我带大家来重新认识这两者的优先级吧,我会分成 Vue2 和 Vue3 的版本来讲
Vue2
我就拿一个最简单的代码来说,我把 v-for 和 v-if 共存与一个标签上,Vue2 中肯定会警告我们,不建议这么做,但是为啥不建议,根本没几个人知道~
![ee6d325a736e4dc6baa9ed7a2c9a2be7.png](https://i-blog.csdnimg.cn/blog_migrate/9f5e466a08596a7a4116b94a62d03718.png)
想要获取答案,可以打开这个网站:https://v2.template-explorer.vuejs.org/
这是一个解析 Vue2 代码的网站,能把 Vue 代码解析成最终的产物代码
![56da759c8741e0ff88e2a98348ca43c4.png](https://i-blog.csdnimg.cn/blog_migrate/c263ad2d2d36ab24b59b9924a09d324d.png)
其实重要的部分在这里
![55ebc7385ebff24647b5837cd3e3e2a3.png](https://i-blog.csdnimg.cn/blog_migrate/1d59ac81f3ca3be967f8e7c6c499c9fd.png)
可以看到在 Vue2 中,会先循环,然后在循环中去判断,判断为真则正常渲染,判断为假则执行 _e
函数,_e
函数就是注释的意思,就是把判断为假的节点注释掉,也就是:
1、先走 v-for 循环 3 次
2、在循环体中走 v-if 判断
3、判断 item !== 2 则正常渲染,item === 2 则把这个节点注释掉
所以最终选出出来 1、3 两个节点
大家能理解为什么 Vue2 会警告你了吗?因为其实我们只需要渲染2个节点,但是最终还是循环了3次,造成了性能浪费,也就是 v-for 优先级高于 v-if,共存时会造成性能浪费
Vue3
但是在 Vue3 中,v-for 和 v-if 却是可以共存的,为什么呢?我们还是拿最简单的代码来分析
![d3197b4cbea4c4754f1808c5d8a8deae.png](https://i-blog.csdnimg.cn/blog_migrate/11998ef05e111091c59cd7060eac728d.png)
我们可以到这个网站:**https://play.vuejs.org/**,看到解析后的产物
![4fffd5e0917e3a8cb459d2e755487db1.png](https://i-blog.csdnimg.cn/blog_migrate/1337d345e6d9a3d598fb9f5ec1c91be1.png)
重要部分在这里
![68c0d9281b3f70c412134c271d0ab763.png](https://i-blog.csdnimg.cn/blog_migrate/ccff075f58d7558e98055c1f2e121c2d.png)
可以看到,跟 Vue2 不同的是,Vue3 中是先走判断,然后再走循环的,也就是:
1、先走 v-if 判断
2、如果 item !== 2,就去走循环也就是 v-for
3、如果 item == 2,就执行 createCommandVNode,创建一个注释节点
也就是在 Vue3 中,v-if 优先级是高于 v-for 的,真正循环的只有1、3这两个节点,这提高了性能
但是我们会看到,代码会报错:** item 找不到**?
![9989ee069a17e0aeeb68c0df11c7351a.png](https://i-blog.csdnimg.cn/blog_migrate/fd666e0cfca16b0109e749d509e81fa5.png)
这是因为在 v-for 和 v-if 共存的时候,Vue3 会在底层帮我们转换成
![737e081e059f3c3aa6c6e50ed9a64241.png](https://i-blog.csdnimg.cn/blog_migrate/fb93d8e06f91db0af4ee1bd325e72fb0.png)
不信我们可以看看转换后的产物,跟刚刚是一模一样的!!!
![fa793132706ce68244bf6e3910faf9b9.png](https://i-blog.csdnimg.cn/blog_migrate/226389b325e8d1e8c3b9f80be60f35dd.png)
item是在外层的,所以报错说item 找不到,大家都知道为啥了吧?在外层怎么能获取到 item 呢?
总结
总结就是不要让 v-if 和 v-for 共存在同一个标签中,遇到这种情况需要使用 computed 去计算,然后再去渲染
![54bd58c9b2529df672742a3bdc24bc60.png](https://i-blog.csdnimg.cn/blog_migrate/4770b39f755f11aa64c0fa43ad75999c.png)
关注宝哥
关注下方「前端开发博客」,回复 “加群”
加入我们一起学习,天天进步
回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF
回复「Vue脑图」获取 Vue 相关脑图
回复「思维图」获取 JavaScript 相关思维图
回复「简历」获取简历制作建议
回复「简历模板」获取精选的简历模板
回复「加群」进入500人前端精英群
回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。
回复「知识点」下载高清JavaScript知识点图谱
回复「读书」下载成长、创作相关电子书
如果觉得还不错,欢迎点赞、收藏、转发❤❤