啰啰嗦嗦聊聊v-for

236 阅读3分钟

所谓金三银四,最近招聘和换工作的小伙伴逐渐多了起来,自然也就有了各种面试题,把最近的这个面试题分享给大家,希望可以对大家有所帮助。

面试

A哥,两年前端,老东家的项目逐渐完成,年根儿地下提了涨薪,老板没有正面回应,年后回来应该是觉得A哥还有价值,主动涨了1k,但也招了新人,A哥成了项目的前端小组长,带这个新人,大家吃饭一聊,感觉老板有可能动了杀心,暂时稳住A哥,然后等新人成长,然后,嘿嘿嘿,大伙儿这么一说,A哥也就有点起疑,在公司也有点不自然了,于是果断的刷新简历,参加面试,不见得跳,但是也防止一个万一,结果刚刚刷新简历两天,就收到了一家公司的线上一面邀请,薪资还涨了3k,面试的大佬问了这样一个问题:

v-for 循环为什么一定要绑定key ?

这个问题A哥自然不虚:

v-for需要使用一个唯一的建来标识元素,也就是key,如果不表示,可能出现虚拟dom元素出现错误的问题。

这么答,面试官好像有点意犹未尽:

可以具体说说吗?

A哥有点尴尬:

额...........

然后,面试官又问:

diff算法了解吗?

A哥

额.......,不太清除

...........

后面又聊了一些,最后,面试官很客气的然他回去等消息,当天下午HR到是也通知他参加二面了,但是A哥一面确实被问得有点不爽利,所以大家聊了聊,查了查,做了如下总结

总结

首先,先明确vue采用的是虚拟dom技术,这个相比各位小伙伴是知道的,二diff算法就是一种虚拟dom比较的算法,vue恰恰采用了这种算法,所以,v-for渲染过程当中必须绑定key的问题,可以从diff算法说起。

diff 比较两个虚拟dom只会在同层级之间进行比较,不会跨层级进行比较,按照树形结构来说就是:

1、两个元素在同一层

2、两个元素的父元素是同一个

那么在这种情况下,假如对v-for指向的序列进行修改,比如添加(应该有小伙伴尝试过,不修改v-for的序列,不绑定id,不会出现错位),那么这个时候默认的指向就会被破坏,所以需要使用一个唯一的id来绑定元素,如图:

image.png

这种情况下,自然,会发生错误,需要使用唯一的id去指向元素,就可以防止这个问题,当然了这里强调不建议使用index作为key,因为index指向的是容器的位置,并不是位置上的元素。

当然上面聊了diff算法的一个特性,除此之外,diff算法比较元素是按照先序深度优先的顺序遍历元素的,也就是说:遍历一个节点,发现有子节点,先遍历他的子节点,然后遍历他的其他兄弟节点。这些我们之后再聊。