今天写项目的时候遇到一个很奇怪的bug:每次表单输入一个字符失焦
错误示范:
<template v-for="(item,index) in form">
<tr :key="item.name">
<td style="width: 15%">姓名</td>
<td style="width: 20%" colspan="4">
<input v-model="item.name"/>
</td>
</tr>
<tr :key="item.age">
<td style="width: 15%">年龄</td>
<td style="width: 20%" colspan="4">
<input v-model="item.age"/>
</td>
</tr>
</template>
其中的form是一个包含了多个item的数组,由于考虑到for循环中的key要保证唯一所以我自以为的设置成了item.name,item.age,然后通过查阅各种回答发现input节点的key用input的value值绑定,这样input值改变节点类型就不同了,每次会删除之前的节点重新渲染,所以会失去焦点。
正确姿势:就是要保证key不是随着变的但也要保证唯一,处理方法很多我的方法就是自己定义一个字符串拼接索引
<template v-for="(item,index) in form">
<tr :key="'name-' + index">
<td style="width: 15%">姓名</td>
<td style="width: 20%" colspan="4">
<input v-model="item.name"/>
</td>
</tr>
<tr :key="'age-' + index">
<td style="width: 15%">年龄</td>
<td style="width: 20%" colspan="4">
<input v-model="item.age"/>
</td>
</tr>
</template>