一、插槽是什么?

Vue中的插槽是 一个非常好用的东西,slot,说白了就是一个占位的

使用插槽的时候可以用 1.v-slot:插槽的名字 || 2.slot=’插槽的名字’

二、插槽的方式

  • 默认插槽 (匿名插槽):把父组件的内容分发到子组件的指定位置
  • 具名插槽 :给子组件的插槽起一个名字,父组件根据插槽的名字对号入座
  • 作用域插槽 :子组件的数据反馈到父组件,父组件根据子组件传递的数据进行展示,在子组件指定的位置显示

    三、插槽的使用

  • 匿名(没有名字的插槽)

    1. //父组件
    2. <template>
    3. <div class="home">
    4. <Child>
    5. <div>{{ msg }}</div>
    6. </Child>
    7. </div>
    8. </template>
    9. import Child from "@/components/child";//在父组件引入子组件
    10. //子组件
    11. <template>
    12. <div class="child">
    13. 我是作用域插槽的子组件的内容
    14. <slot></slot>
    15. </div>
    16. </template>
  • 具名插槽

    1. // 父组件
    2. <template>
    3. <div class="home">
    4. <Child>
    5. 顺序是按照父组件中的名字的先后顺序
    6. <template v-slot:one>
    7. <span>one,</span>
    8. </template>
    9. <template v-slot:two>
    10. <span>two</span>
    11. </template>
    12. <template v-slot:default> // 默认插槽
    13. <span>three</span>
    14. </template>
    15. </Child>
    16. </div>
    17. </template>
    18. // 子组件
    19. <template>
    20. <div>
    21. <span>第一个插槽</span>
    22. <slot name="one"></slot>//给插槽添加一个nameone的名字
    23. <span>第二个插槽</span>
    24. <slot name="two"></slot>
    25. <span>第三个插槽</span>
    26. <slot></slot>
    27. </div>
    28. </template>

    页面显示结果: 第一个插槽one,第二个插槽two,第三个插槽three


  • 作用域插槽 ```vue 定义插槽


使用插槽

  1. <a name="G1B8W"></a>
  2. ### <br />
  3. <a name="ECQpg"></a>
  4. #### 四、作用域插槽的应用场景
  5. <a name="M7jNd"></a>
  6. ###### 在子组件中使用v-for创建一个列表循环,然后在父组件中通过子组件标签child调用
  7. ```vue
  8. //父组件
  9. <template>
  10. <div class="home">
  11. <child></child>
  12. <child></child>
  13. </div>
  14. </template>
  15. import Child from "@/components/child";
  16. export default {
  17. components: {
  18. Child
  19. }
  20. };
  21. //子组件
  22. <template>
  23. <div class="child">
  24. <ul>
  25. <li v-for="item in list" :key='item'">{{item}</li>
  26. </ul>
  27. </div>
  28. </template>
  29. data() {
  30. return {
  31. list: [1, 2, 3]
  32. };
  33. }

image.png因为调用了两次组件,所以会显示两遍,如果在每次调用时候需要各自渲染各自的效果,就需要作用域插槽
  1. //父组件
  2. <Child>
  3. <template slot-scope="slotProps">
  4. <li> {{ slotProps.item }}</li>
  5. </template>
  6. </Child>
  7. <Child>
  8. <template slot-scope="slotProps">
  9. <h1> {{ slotProps.item }}</h1>
  10. </template>
  11. </Child>
  12. //子组件
  13. <template>
  14. <div class="child">
  15. <ul>
  16. <slot v-for="item in list" :item="item"></slot>
  17. </ul>
  18. </div>
  19. </template>
  20. <script>
  21. export default {
  22. name: "Child",
  23. data() {
  24. return {
  25. list: [1, 2, 3]
  26. };
  27. }
  28. };
  29. </script>


image.pngimage.png

五、作用域插槽和插槽的区别

过程:
在组建中有两个插槽,slot name=’a’ && slot name=’b’ 会把里面的内容当作虚拟节点存储起来,在调用插槽的时候,把 刚才渲染的虚拟节点,替换掉slot name=’a’;
普通插槽

  • 普通插槽渲染的位置在父组件,将父组件渲染好的结果直接替换成自己,创建的过程在父组件进行渲染

作用域插槽

  • 作用域插槽内容会被渲染成一个函数,只有被调用的时候才会被渲染,渲染位置在组件内部