如何理解vue中的key
作用
v-for遍历时, 用id作为key, 唯一标识节点加速虚拟DOM的渲染
1
2
3
4//有相同父元素的子元素必须有独特的key。重复的key会造成渲染错误。
<ul>
<li v-for="item in items" :key="item.id">...</li>
</ul>强制替换节点或者组件(component),而不重复使用它。
1
2
3
4<transition>
<span :key="abc">{{ abc }}</span>
</transition>
//abc发生变化时,<span>会被替换,而不会patched(修复),因此transition会被触发。
原理
加速虚拟DOM的渲染
- 如果不用key,Vue会用一种算法(就地更新策略):最小化element的移动,并且会尝试尽最大程度在同适当的地方对相同类型的element,做patch(修复)或者reuse(重用)。
- 如果使用了key,Vue会根据keys的顺序记录element,曾经拥有了key的element如果不再出现的话,会被直接remove或者destoryed。
- 如果使用key, 它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。
强制替换节点或者组件
- 如果使用了key,Vue会根据keys的顺序记录element,曾经拥有了key的element如果不再出现的话,会被直接remove或者destoryed。
- 完整地触发组件的生命周期钩子
- 触发过渡
vue中组件数据传递
父组件到子组件
props
1
2
3
4
5
6
7
8
9
10
11
12//父
<users :users="katty"></users>
//子
export default {
props:{
users:{ //这个就是父组件中子标签自定义名字
type:String,
required:true
}
}
}$parent / $children / ref
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29//父
<compent ref="compent1"></compent>
export default {
data: function(){
return {
}
},
methods: {
test: function(){
}
},
mounted(){
this.$refs.compent1.name //获取子组件compent的data
}
}
//子
export default {
data: function(){
return {
name: ''
}
}
created(){
this.$parent.test(); //获取父组件methods
}
}
子组件到父组件
- 通过事件形式$emit
1
2
3
4//父
//子