Vue中solt插槽

375 阅读1分钟

相关知识点

  • 匿名插槽
  • 具名插槽
  • 作用域插槽
  • 动态插槽名

匿名插槽

子组件:

<div>
  <slot>如果父组件中传递数据,会替换此处内容</slot>
</div>

父组件:

<!-- 此处会显示子组件中的内容 -->
<Comp1></Comp1>
<!-- 此处显示父组件传递的内容 -->
<Comp1>我是组件1的匿名插槽</Comp1>

具名插槽

v-onv-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如 v-slot:header 可以被重写为 #header

子组件:

<div>
  <!-- 默认插槽 -->
  <slot></slot>
	<!-- 具名插槽 -->
  <slot name="content"></slot>
</div>

父组件:

<Comp2>
  <!-- 默认插槽用default做参数 -->
  <template v-slot:default>具名插槽</template>
  <!-- 具名插槽用插槽名做参数 -->
  <template v-slot:content>内容...</template>
</Comp2>

作用域插槽

父组件中要显示的数据由子组件决定。

子组件:

<div>
  <slot :foo="foo"></slot>
  <slot name="content" bar="bar~~~"></slot>
</div>

父组件:

<Comp3>
  <!-- 把v-slot的值指定为作用域上下文对象 -->
  <!-- 只能有一个v-slot:default -->
  <template v-slot:default="ctx">来自子组件数据:{{ ctx.foo }}</template>
  <!-- 或者 -->
  <template v-slot:default="{ foo }">来自子组件数据:{{ foo }}</template>
  
  <template v-slot:content="{ bar }">来自子组件数据:{{ bar }} </template>
</Comp3>

动态插槽名

动态指令参数也可以用在 v-slot 上,来定义动态的插槽名。

子组件:

<div>
  <slot name="comp4SlotName" tua="tua"></slot>
</div>

父组件:

<Comp4>
  <template v-slot:[dynamicSlotName]="{ tua }">来自子组件数据:{{ tua }}</template>
</Comp4>

data() {
  return {
    dynamicSlotName: "comp4SlotName"
  };
}