vue之插槽(slot)

插槽(slot)是 Vue.js 提供的一种机制,用于在组件中插入内容。插槽允许你在父组件中定义内容,并将其传递到子组件中进行渲染。

插槽的基本概念

插槽可以分为三种类型:

  1. 默认插槽:没有名称的插槽。
  2. 具名插槽:具有名称的插槽。
  3. 作用域插槽:可以接收子组件传递的数据的插槽。

具名插槽

<template #help> 是具名插槽的一种简写形式。具名插槽允许你在子组件中定义多个插槽,并在父组件中通过名称来插入内容。

语法

假设你有一个子组件 MyComponent,它定义了一个具名插槽 help

子组件 (MyComponent.vue)

<template>
  <div>
    <label>{{ label }}</label>
    <input :name="name" />
    <slot name="help"></slot>
  </div>
</template>

<script>
export default {
  props: {
    label: String,
    name: String
  }
};
</script>

父组件

在父组件中,你可以使用 <template v-slot:help> 或其简写形式 <template #help> 来插入内容:

<template>
  <MyComponent label="测试机器IP" name="test_ips">
    <template #help>
      <span style="color: red;">若无所需测试机器IP,请输入IP后按Enter键添加(例如: x)</span>
    </template>
  </MyComponent>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  }
};
</script>
简写形式

<template #help><template v-slot:help> 的简写形式。Vue.js 2.6.0+ 引入了这种简写形式,使得代码更加简洁。

子组件 (MyComponent.vue)

<template>
  <div>
    <label>{{ label }}</label>
    <input :name="name" />
    <slot name="help"></slot>
  </div>
</template>

<script>
export default {
  props: {
    label: String,
    name: String
  }
};
</script>

父组件

<template>
  <div>
    <MyComponent label="测试机器IP" name="test_ips">
      <template #help>
        <span style="color: red;">若无所需测试机器IP,请输入IP后按Enter键添加(例如: x)</span>
      </template>
    </MyComponent>
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  }
};
</script>

默认插槽

默认插槽是没有名称的插槽,通常用于在子组件中插入默认内容。如果父组件没有提供内容,子组件会显示默认内容。

子组件 (MyComponent.vue)

<template>
  <div>
    <label>{{ label }}</label>
    <input :name="name" />
    <slot>默认帮助文本</slot>
  </div>
</template>

<script>
export default {
  props: {
    label: String,
    name: String
  }
};
</script>

在这个例子中,<slot> 标签定义了一个默认插槽。如果父组件没有提供内容,插槽会显示 “默认帮助文本”。

父组件

<template>
  <div>
    <MyComponent label="测试机器IP" name="test_ips">
      <span style="color: red;">若无所需测试机器IP,请输入IP后按Enter键添加(例如: x)</span>
    </MyComponent>
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  }
};
</script>

在这个例子中,父组件提供了内容,因此插槽会显示父组件提供的内容,而不是默认内容。

作用域插槽

作用域插槽(Scoped Slots)允许子组件将数据传递给插槽内容。父组件可以使用这些数据来动态渲染内容。

子组件 (MyComponent.vue)

<template>
  <div>
    <label>{{ label }}</label>
    <input :name="name" />
    <slot :help-text="helpText"></slot>
  </div>
</template>

<script>
export default {
  props: {
    label: String,
    name: String
  },
  data() {
    return {
      helpText: '若无所需测试机器IP,请输入IP后按Enter键添加(例如: x)'
    };
  }
};
</script>

在这个例子中,子组件通过 slot 标签的 :help-text 属性将 helpText 数据传递给插槽内容。

父组件

<template>
  <div>
    <MyComponent label="测试机器IP" name="test_ips">
      <template v-slot:default="slotProps">
        <span style="color: red;">{{ slotProps.helpText }}</span>
      </template>
    </MyComponent>
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  }
};
</script>

在这个例子中,父组件使用 v-slot:default 指令接收子组件传递的数据,并通过 slotProps 对象访问 helpText

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼爱吃火锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值