当前位置: 首页 > news >正文

Vue 插槽(Slot)用法详解

插槽(Slot)是Vue中一种强大的内容分发机制,它允许你在组件中定义可替换的内容区域,为组件提供了更高的灵活性和可复用性。本文将全面介绍Vue插槽的各种用法。

1. 基本插槽

基本插槽是最简单的插槽形式,它允许父组件向子组件插入内容。

子组件定义插槽:

<!-- ChildComponent.vue -->
<template><div class="child"><h2>子组件标题</h2><slot></slot>  <!-- 插槽位置 --><p>子组件底部内容</p></div>
</template>

父组件使用:

<template><ChildComponent><p>这是插入到子组件中的内容</p></ChildComponent>
</template>

2. 后备内容(默认内容)

插槽可以设置默认内容,当父组件没有提供内容时显示。

<!-- ChildComponent.vue -->
<template><button type="submit"><slot>提交</slot>  <!-- 默认显示"提交" --></button>
</template>

3. 具名插槽

当一个组件需要多个插槽时,可以使用具名插槽。

子组件定义:

<!-- BaseLayout.vue -->
<template><div class="container"><header><slot name="header"></slot></header><main><slot></slot>  <!-- 默认插槽,没有name属性 --></main><footer><slot name="footer"></slot></footer></div>
</template>

父组件使用:

<template><BaseLayout><template v-slot:header><h1>这里是页眉</h1></template><p>这里是主内容,会放入默认插槽</p><template v-slot:footer><p>这里是页脚</p></template></BaseLayout>
</template>

4. 作用域插槽

作用域插槽允许子组件向插槽传递数据,父组件可以决定如何渲染这些数据。

子组件定义:

<!-- TodoList.vue -->
<template><ul><li v-for="(item, index) in items" :key="index"><slot :item="item" :index="index"></slot></li></ul>
</template><script>
export default {data() {return {items: ['吃饭', '睡觉', '写代码']}}
}
</script>

父组件使用:

<template><TodoList><template v-slot:default="slotProps"><span v-if="slotProps.index % 2 === 0">✓</span>{{ slotProps.item }}</template></TodoList>
</template>

5. 解构插槽Prop

在作用域插槽中,可以使用ES6解构语法简化代码:

<template><TodoList><template v-slot:default="{ item, index }"><span v-if="index % 2 === 0">✓</span>{{ item }}</template></TodoList>
</template>

6. 动态插槽名

插槽名可以是动态的:

<template><base-layout><template v-slot:[dynamicSlotName]>...</template></base-layout>
</template><script>
export default {data() {return {dynamicSlotName: 'header'}}
}
</script>

7. 缩写语法

Vue提供了插槽的缩写语法:

  • v-slot:header 可以简写为 #header

  • 默认插槽 v-slot:default 可以简写为 v-slot 或 #default

<template><BaseLayout><template #header><h1>页眉</h1></template><template #default><p>主内容</p></template><template #footer><p>页脚</p></template></BaseLayout>
</template>

8. 高级用法:插槽函数

插槽可以像函数一样使用,实现更灵活的内容分发:

子组件:

<template><div><slot :user="user" :isLoggedIn="isLoggedIn"></slot></div>
</template><script>
export default {data() {return {user: { name: '张三', age: 30 },isLoggedIn: true}}
}
</script>

父组件:

<template><UserComponent><template v-slot="{ user, isLoggedIn }"><div v-if="isLoggedIn">欢迎, {{ user.name }}! 您已经{{ user.age }}岁了。</div><div v-else>请登录</div></template></UserComponent>
</template>

总结

Vue插槽提供了强大的内容分发机制,通过基本插槽、具名插槽、作用域插槽等特性,可以创建高度可复用和灵活的组件。掌握插槽的使用可以显著提升Vue组件的开发效率和可维护性。

在实际开发中,插槽常用于构建布局组件、高阶组件(HOC)、列表渲染等场景,是Vue组件化开发的重要工具之一。

http://www.xdnf.cn/news/954019.html

相关文章:

  • UFW防火墙安全指南
  • 【算法-BFS实现FloodFill算法】使用BFS实现FloodFill算法:高效识别连通块并进行图像填充
  • 时间复杂度和算法选择
  • WinUI3开发_使用mica效果
  • vitepress添加图片放大功能
  • 基于2.4G功能的使用
  • encodeURIComponent和decodeURIComponent
  • 21-Oracle 23 ai-Automatic SQL Plan Management(SPM)
  • 多元隐函数 偏导公式法 (显示变化 + 隐式变化)
  • ABAP设计模式之---“Tell, Don’t Ask原则”
  • STL 1 容器
  • 基于生态系统服务(InVEST模型)的人类活动、重大工程生态成效评估、论文写作
  • 12.找到字符串中所有字母异位词
  • Oracle查询表空间大小
  • vue的<router-link>的to里面的query和params的区别
  • pocketflow库实现guardrail
  • Nginx server_name 配置说明
  • Qt插件化编程的全面解析(QPluginLoader)
  • 微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
  • 云防火墙(安全组)配置指南:从入门到精通端口开放 (2025)
  • OCR、图像分类与目标检测
  • 雷达RCS计算中的旋转矩阵
  • 在Ubuntu上利用loongarch64交叉编译工具编译opencv4.4.0
  • 【排错】ollama报错unable to load model
  • 【知识点】第8章:程序设计方法论
  • CKA考试知识点分享(6)---PriorityClass
  • 自动化测试工具playwright中文文档-------19.评估JavaScript
  • 初版BL程序一些细节整理(碎碎念)
  • 相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
  • 无线耳机存储痛点解决方案-64Mb Quad-SPI Pseudo-SRAM CS56404L