一篇文章带你了解vue 中插槽的作用

简介: 一篇文章带你了解vue 中插槽的作用

插槽的使用:可以把插槽理解为组件B中留下的一个坑,谁用这个坑谁就可以往里面填放东西,同时呢,谁也就要认组件B做儿子-----组件B也就成了这个来填坑的组件的子组件。

插槽不单单是可以让父组件用它填充东西,也可以引用子组件的数据,而父组件用坑的时候也就可以用子组件传过来的数据。

单个插槽(默认插槽、匿名插槽)

子组件:(child.vue)

<template>
    <div>
        <h2>子组件</h2>
        <slot>
           <h3> 匿名插槽(●ˇ∀ˇ●)</h3>
        </slot>
    </div>
</template>
<script>
export default {
  name: 'child',
}
</script>

父组件:(father.vue)—既然使用子组件的插槽就的先import引入子组件

//只引用了子组件,但是没有使用子组件的插槽,那么插槽中如果有内容会默认显示出来
<template>
  <div>
    <h2>我是爸爸~</h2>
     <!--使用子组件-->
    <child></child>
  </div>
</template>
<script>
import childfrom './child.vue'
export default {
  components: { child},
}
</script>

只引用了子组件,但是没有使用子组件的插槽,那么插槽中如果有内容会默认显示出来

使用子组件的插槽,父组件要填坑了(**给子组件里面加 ),子组件不变,父组件修改代码如下:

<template>
  <div>
    <h2>我是爸爸~</h2>
    <!--使用子组件-->
    <child>
      <template>
          <h4>--------给我儿子填坑--------</h4>
      </template>
    </child>
  </div>
</template>
会发现:子组件代码不变,父组件使用给<template>中加入了一段文字,
这段文字直接把子组件中的<slot>插槽中的文字替换了。
——如果子组件有插槽而父组件使用子组件但不使用插槽,
插槽内容默认展示;如果父组件使用了插槽,以父组件的填充内容为主

具名插槽(有具体名字,有标识的插槽)可以根据名字来有针对性的使用插槽

子组件:(child.vue)

<template>
    <div>
        <h2>子组件</h2>
        <slot name="slot-fruits">
           <h3>这儿放水果!</h3>
        </slot>
        <hr>
        <slot name="slot-foods">
           <h3>这儿放美食!</h3>
        </slot>
    </div>
</template>
//父组件
<template>
  <div>
    <h2>我是爸爸~</h2>
    <child>
        <div slot="slot-fruits">
            <p>葡萄柚</p>
            <p>猕猴桃</p>
        </div>
        <div slot="slot-foods">
            <h5>饺子</h5>
            <h5>意大利面</h5>
        </div>
        <!--注意:Vue3中要用v-slot去指向插槽名:<div v-slot=slot-foods> -->
    </child>
  </div>
</template>

注:可以看到只是在使用子组件时,向其内部的结构标签div中加上了slot属性并指向了子组件中定义的插槽的插槽名,就把这个div按照对应的插槽名替换成子组件中的插槽了,如果把多个结构都指向了同一个插槽名,那么会把这些数据都渲染出来,后面的不会覆盖前面的

作用域插槽(可视为携带数据的匿名插槽)没名,但可以携子组件的数据带给父组件

子组件:(通过 :数据别名=“数据” 来给到插槽,将数据绑定给这个插槽)

<template>
  <div>
    <h2>子组件</h2>
    <slot :fruits="Fruits"> 水果来啦! </slot>
  </div>
</template>
<script>
export default {
  name: 'child',
   data() {
    return {
      Fruits: {
        'warmFruit':[
          ['红果','草莓', '红心火龙果', '红皮苹果', '圣女果'],
          ['黄果','香蕉', '菠萝', '黄桃', '葡萄柚', '柠檬'],
          ['橙果','橙子', '沙糖桔', '橘子'],
        ],
        'coolFruit':[
          ['黑果','东北冻梨', '黑枣'],
          ['蓝果','蓝莓', '蓝靛果'],
          ['紫果','飓风葡萄', '西梅', '桑葚', '黑布林李子'],
        ],
      },
    }
  },
}
</script>
<style>
</style>

父组件:(通过给template加 slot-scope 属性)

这里会将slot-scope属性的属性值作为一个对象-----用于保存子组件插槽中绑定的数据

这个用于保存插槽数据的slot-scope的属性值要通过子组件插槽定义的数据别名来访问数据


<template>
  <div>
    <h2>看看儿子给我带什么来了~</h2>
    <child>
      <!--通过slot-scope来定义一个对象scope(名字可以随便起)来接收子组件传递过来的数据-->
      <template slot-scope="scope">
        <!--使用插值表达式直接把接收到的插槽数据渲染到页面(scope保存数据,所以真正的数据在scope的下一层)-->
        {{ scope.fruits }}
      </template>
    </child>
  </div>
</template>
<script>
import childfrom './child.vue'
export default {
  components: { child },
}
</script>
<style>
</style>

父组件对插槽带来的数据进行遍历,并将数组元素渲染到页面上

<template>
  <div>
    <h2>看看儿子给我带什么来了~</h2>
    <child>
      <template slot-scope="scope">
        <!--通过层层对象指定获取到目标数据-->
        <p v-for="(warmItem,index) in scope.fruits.warmFruit" :key="index">
            <span v-for="(item,index) in warmItem" :key="index">{{item}}、</span>
        </p>
        <hr>
         <p v-for="(coolItem,index) in scope.fruits.coolFruit" :key="index">
            <span v-for="(item,index) in coolItem" :key="index">{{item}}、</span>
        </p>
      </template>
    </child>
  </div>
</template>
目录
相关文章
|
6天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
6天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
6天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
6天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
5天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
7天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
5天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1050 0
|
7天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
12天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发