Vue 中 slot 的常用场景有哪些

1. 可定制的按钮组件

场景描述 :创建一个通用的按钮组件,允许父组件自定义按钮的内容和样式。 子组件(Button.vue)

js 复制代码
<template>
  <button>
    <slot>默认按钮文本</slot>
  </button>
</template>

父组件

js 复制代码
<template>
  <Button>
    <span>点击我</span>
  </Button>
</template>

渲染结果

HTML 复制代码
<button>
  <span>点击我</span>
</button>

2. 布局组件

场景描述:创建一个布局组件,允许父组件自定义头部、主体和底部内容。

子组件(Layout.vue)

vue 复制代码
<template>
  <div class="layout">
    <header>
      <slot name="header">默认头部内容</slot>
    </header>
    <main>
      <slot>默认主体内容</slot>
    </main>
    <footer>
      <slot name="footer">默认底部内容</slot>
    </footer>
  </div>
</template>

父组件

vue 复制代码
<template>
  <Layout>
    <template v-slot:header>
      <h1>这是自定义头部</h1>
    </template>
    <p>这是主体内容</p>
    <template v-slot:footer>
      <p>这是自定义底部</p>
    </template>
  </Layout>
</template>

渲染结果

HTMl 复制代码
<div class="layout">
  <header>
    <h1>这是自定义头部</h1>
  </header>
  <main>
    <p>这是主体内容</p>
  </main>
  <footer>
    <p>这是自定义底部</p>
  </footer>
</div>

3. 数据展示组件

场景描述 :创建一个数据展示组件,允许父组件自定义数据的展示方式。 子组件(UserCard.vue)

vue 复制代码
<template>
  <div class="user-card">
    <slot :user="user">默认用户信息</slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: { name: 'Alice', age: 25 },
    };
  },
};
</script>

父组件

vue 复制代码
<template>
  <UserCard v-slot="slotProps">
    <p>{{ slotProps.user.name }} is {{ slotProps.user.age }} years old.</p>
  </UserCard>
</template>

渲染结果

HTML 复制代码
<div class="user-card">
  <p>Alice is 25 years old.</p>
</div>

4. 表单组件

场景描述 :创建一个表单组件,允许父组件自定义表单字段和布局。 子组件(Form.vue)

vue 复制代码
<template>
  <form>
    <slot name="fields">默认表单字段</slot>
    <button type="submit">提交</button>
  </form>
</template>

父组件

vue 复制代码
<template>
  <Form>
    <template v-slot:fields>
      <input type="text" placeholder="用户名" />
      <input type="password" placeholder="密码" />
    </template>
  </Form>
</template>

渲染结果

HTML 复制代码
<form>
  <input type="text" placeholder="用户名" />
  <input type="password" placeholder="密码" />
  <button type="submit">提交</button>
</form>

5. 列表组件

场景描述 :创建一个列表组件,允许父组件自定义列表项的展示方式。 子组件(List.vue)

vue 复制代码
<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      <slot :item="item">默认列表项内容</slot>
    </li>
  </ul>
</template>

<script>
export default {
  props: {
    items: Array,
  },
};
</script>

父组件

vue 复制代码
<template>
  <List :items="users" v-slot="slotProps">
    <p>{{ slotProps.item.name }} - {{ slotProps.item.email }}</p>
  </List>
</template>

<script>
export default {
  data() {
    return {
      users: [
        { id: 1, name: 'Alice', email: 'alice@example.com' },
        { id: 2, name: 'Bob', email: 'bob@example.com' },
      ],
    };
  },
};
</script>

渲染结果

HTML 复制代码
<ul>
  <li>
    <p>Alice - alice@example.com</p>
  </li>
  <li>
    <p>Bob - bob@example.com</p>
  </li>
</ul>

6. 模态框组件

场景描述 :创建一个模态框组件,允许父组件自定义标题、内容和操作按钮。 子组件(Modal.vue)

vue 复制代码
<template>
  <div class="modal">
    <div class="modal-header">
      <slot name="header">默认标题</slot>
    </div>
    <div class="modal-body">
      <slot>默认内容</slot>
    </div>
    <div class="modal-footer">
      <slot name="footer">
        <button @click="close">关闭</button>
      </slot>
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    close() {
      this.$emit('close');
    },
  },
};
</script>

父组件

vue 复制代码
<template>
  <Modal @close="handleClose">
    <template v-slot:header>
      <h2>自定义标题</h2>
    </template>
    <p>这是模态框的内容</p>
    <template v-slot:footer>
      <button @click="handleSave">保存</button>
      <button @click="handleClose">取消</button>
    </template>
  </Modal>
</template>

<script>
export default {
  methods: {
    handleSave() {
      console.log('保存操作');
    },
    handleClose() {
      console.log('关闭模态框');
    },
  },
};
</script>

渲染结果

HTML 复制代码
<div class="modal">
  <div class="modal-header">
    <h2>自定义标题</h2>
  </div>
  <div class="modal-body">
    <p>这是模态框的内容</p>
  </div>
  <div class="modal-footer">
    <button @click="handleSave">保存</button>
    <button @click="handleClose">取消</button>
  </div>
</div>

7. 工具栏组件

场景描述:创建一个工具栏组件,允许父组件自定义工具栏中的按钮和图标。

子组件(Toolbar.vue)

vue 复制代码
<template>
  <div class="toolbar">
    <slot>默认工具栏内容</slot>
  </div>
</template>

父组件

vue 复制代码
<template>
  <Toolbar>
    <button @click="handleAdd">添加</button>
    <button @click="handleDelete">删除</button>
    <button @click="handleSave">保存</button>
  </Toolbar>
</template>

<script>
export default {
  methods: {
    handleAdd() {
      console.log('添加操作');
    },
    handleDelete() {
      console.log('删除操作');
    },
    handleSave() {
      console.log('保存操作');
    },
  },
};
</script>

渲染结果

HTML 复制代码
<div class="toolbar">
  <button @click="handleAdd">添加</button>
  <button @click="handleDelete">删除</button>
  <button @click="handleSave">保存</button>
</div>

8. 动态内容组件

场景描述:创建一个动态内容组件,允许父组件根据条件动态插入内容。

子组件(DynamicContent.vue)

vue 复制代码
<template>
  <div>
    <slot :content="dynamicContent">默认内容</slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dynamicContent: '动态内容',
    };
  },
};
</script>

父组件

vue 复制代码
<template>
  <DynamicContent v-slot="slotProps">
    <p>{{ slotProps.content }}</p>
  </DynamicContent>
</template>

渲染结果

HTML 复制代码
<div>
  <p>动态内容</p>
</div>
相关推荐
dy17171 小时前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
2501_915918415 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂5 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技5 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip5 小时前
JavaScript二叉树相关概念
前端
attitude.x6 小时前
PyTorch 动态图的灵活性与实用技巧
前端·人工智能·深度学习
β添砖java6 小时前
CSS3核心技术
前端·css·css3
空山新雨(大队长)7 小时前
HTML第八课:HTML4和HTML5的区别
前端·html·html5
猫头虎-前端技术7 小时前
浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧
前端·css·node.js·bootstrap·ecmascript·css3·媒体