🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
总是用 `key` 配合 `v-for`。 ~~~ // 好例子 <ul> <li v-for="todo in todos" :key="todo.id" > {{ todo.text }} </li> </ul> ~~~ 在组件上*总是*必须用 `key` 配合 `v-for`,以便维护内部组件及其子树的状态。甚至在元素上维护可预测的行为,比如动画中的[对象固化 (object constancy)](https://bost.ocks.org/mike/constancy/),也是一种好的做法。 #### 详解 假设你有一个待办事项列表: ~~~ data: function () { return { todos: [ { id: 1, text: '学习使用 v-for' }, { id: 2, text: '学习使用 key' } ] } } ~~~ 然后你把它们按照字母顺序排序。在更新 DOM 的时候,Vue 将会优化渲染把可能的 DOM 变动降到最低。即可能删掉第一个待办事项元素,然后把它重新加回到列表的最末尾。 这里的问题在于,不要删除仍然会留在 DOM 中的元素。比如你想使用 `<transition-group>` 给列表加过渡动画,或想在被渲染元素是 `<input>` 时保持聚焦。在这些情况下,为每一个项目添加一个唯一的键值 (比如 `:key="todo.id"`) 将会让 Vue 知道如何使行为更容易预测。 根据我们的经验,最好*始终*添加一个唯一的键值,以便你和你的团队永远不必担心这些极端情况。也在少数对性能有严格要求的情况下,为了避免对象固化,你可以刻意做一些非常规的处理。 ~~~ // 反例 <ul> <li v-for="todo in todos"> {{ todo.text }} </li> </ul> ~~~