一段列表渲染demo引发对关于vue和react的diff中key使用的思考

166 阅读1分钟

vue和react的diff中key的作用都差不多,主要是作为diff的识别标识。

<input v-if />
<input v-else />

上面这个例子,在vue里面,没有使用key,那么vue认为他们不是相同节点,切换input,都会重新卸载,新增一个新的input,但是设置key并将key设置为一样,vue就会复用该节点,并保存状态

{
    show ? <input /> : <input />
}

在react没有指定key,标签相同那么react会识别他们的节点相同,相同则保存状态。 使用如果要切换tab时,不设置唯一的key,可能会导致保存状态带来的不想要的后果

在列表里 不管是vue还是react 给元素设置唯一key,增加,移动,修改节点时,会识别key,在新旧dom比较,

  • 移动就复用节点移动
  • 修改节点,也会复用节点然后修改节点属性
  • 插入节点,识别key,然后仅仅在存在的节点的里面插入节点 会最大程度的复用节点,而不是大量的删除,重写新增节点。

如果不使用Key,那么将有大量的删除,新增节点操作.
vue和react识别相同节点细节不一样,对照上面两个例子来看。