子组件传值父组件(作用域插槽)

  1. <template>
  2. <div>
  3. 我是作用域插槽的子组件
  4. // 子组件的slot标签上绑定需要的值
  5. <slot :data="user"></slot>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'slotthree',
  11. data () {
  12. return {
  13. user: [
  14. {name: 'Jack', sex: 'boy'},
  15. {name: 'Jone', sex: 'girl'},
  16. {name: 'Tom', sex: 'boy'}
  17. ]
  18. }
  19. }
  20. }
  21. </script>
  1. <template>
  2. <div>
  3. 我是作用域插槽
  4. <slot-three>
  5. <template slot-scope="user">
  6. <div v-for="(item, index) in user.data" :key="index">
  7. {{item}}
  8. </div>
  9. </template>
  10. </slot-three>
  11. </div>
  12. </template>

在父组件上使用slot-scope属性,user.data就是子组件传过来的值
image.png

slot (父组件 在子组件 处插入内容)

Vue 实现了一套内容分发的 API,将元素作为承载分发内容的出口,这是vue文档上的说明。具体来说,slot就是可以让你在组件内添加内容的‘空间’。

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. </div>
  6. </template>
  7. //父组件:(引用子组件 ebutton)
  8. <template>
  9. <div class= 'app'>
  10. <ebutton> </ebutton>
  11. </div>
  12. </template>

我们知道,如果直接想要在父组件中的 中添加内容,是不会在页面上渲染的。那么我们如何使添加的内容能够显示呢?在子组件内添加slot 即可

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button></button>
  5. <slot></slot> //slot 可以放在任意位置。(这个位置就是父组件添加内容的显示位置)
  6. </div>
  7. </template>

子组件可以在任意位置添加slot , 这个位置就是父组件添加内容的显示位置

编译作用域 (父组件 在子组件 处插入 data)

上面我们了解了,slot 其实就是能够让我们在父组件中添加内容到子组件的‘空间’。我们可以添加父组件内任意的data值,比如这样:

  1. //父组件:(引用子组件 ebutton)
  2. <template>
  3. <div class= 'app'>
  4. <ebutton> {{ parent }}</ebutton>
  5. </div>
  6. </template>
  7. new Vue({
  8. el:'.app',
  9. data:{
  10. parent:'父组件'
  11. }
  12. })

使用数据的语法完全没有变,但是,我们能否直接使用子组件内的数据呢?显然不行!

  1. // 子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot></slot>
  6. </div>
  7. </template>
  8. new Vue({
  9. el:'.button',
  10. data:{
  11. child:'子组件'
  12. }
  13. })
  14. // 父组件:(引用子组件 ebutton)
  15. <template>
  16. <div class= 'app'>
  17. <ebutton> {{ child }}</ebutton>
  18. </div>
  19. </template>

直接传入子组件内的数据是不可以的。因为:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

后备内容 (子组件 设置默认值)

所谓的后背内容,其实就是slot的默认值,有时我没有在父组件内添加内容,那么 slot就会显示默认值,如

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot> 这就是默认值 </slot>
  6. </div>
  7. </template>

具名插槽 (子组件 多个 对应插入内容)

有时候,也许子组件内的slot不止一个,那么我们如何在父组件中,精确的在想要的位置,插入对应的内容呢? 给插槽命一个名即可,即添加name属性。

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot name= 'one'> 这就是默认值1</slot>
  6. <slot name='two'> 这就是默认值2 </slot>
  7. <slot name='three'> 这就是默认值3 </slot>
  8. </div>
  9. </template>

父组件通过v-slot : name 的方式添加内容:

  1. //父组件:(引用子组件 ebutton)
  2. <template>
  3. <div class= 'app'>
  4. <ebutton>
  5. <template v-slot:one> 这是插入到one插槽的内容 </template>
  6. <template v-slot:two> 这是插入到two插槽的内容 </template>
  7. <template v-slot:three> 这是插入到three插槽的内容 </template>
  8. </ebutton>
  9. </div>
  10. </template>

当然 vue 为了方便,书写 v-slot:one 的形式时,可以简写为 #one

作用域插槽 ( 父组件 在子组件 处使用子组件 data)

通过slot 我们可以在父组件为子组件添加内容,通过给slot命名的方式,我们可以添加不止一个位置的内容。但是我们添加的数据都是父组件内的。上面我们说过不能直接使用子组件内的数据,但是我们是否有其他的方法,让我们能够使用子组件的数据呢? 其实我们也可以使用v-slot的方式:

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot name= 'one' :value1='child1'> 这就是默认值1</slot> //绑定child1的数据
  6. <slot :value2='child2'> 这就是默认值2 </slot> //绑定child2的数据,这里我没有命名slot
  7. </div>
  8. </template>
  9. new Vue({
  10. el:'.button',
  11. data:{
  12. child1:'数据1',
  13. child2:'数据2'
  14. }
  15. })
  16. //父组件:(引用子组件 ebutton)
  17. <template>
  18. <div class= 'app'>
  19. <ebutton>
  20. // 通过v-slot的语法 将插槽 one 的值赋值给slotonevalue
  21. <template v-slot:one = 'slotonevalue'>
  22. {{ slotonevalue.value1 }}
  23. </template>
  24. // 同上,由于子组件没有给slot命名,默认值就为default
  25. <template v-slot:default = 'slottwovalue'>
  26. {{ slottwovalue.value2 }}
  27. </template>
  28. </ebutton>
  29. </div>
  30. </template>

总结来说就是:

  • 首先在子组件的slot上动态绑定一个值( :key=’value’)
  • 然后在父组件通过v-slot : name = ‘values ’的方式将这个值赋值给 values
  • 最后通过{{ values.key }}的方式获取数据