如何理解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
    //父


    //子

祖父组件到孙组件