vue隔代组件层层动态插槽并且附带数据
# vue隔代组件层层动态插槽并且附带数据
最近写代码,孙子组件有插槽,想要在爷爷组件里面往孙子组件里面插东西,发现插不进去,于是在父组件也建立了一个插槽。
比较特殊的地方在于这个插槽的名字是动态的,而且可能不止一个(v-for根据数据循环判断有多少插槽)
# 孙子组件
<div v-for="(item,index) in config" :key=index>
<span v-if="item.custom">
<slot :name="item.custom" :value="item.key" :index="index"></slot>
</span>
</div>
1
2
3
4
5
2
3
4
5
可以看到,孙子组件的具名插槽的名字是动态的,其实也就是由爷爷组件提供的
# 子组件
<template v-for="item in config" v-slot:[item]="value">
<slot :name="item" :value="value.value"></slot>
</template>
1
2
3
2
3
父组件是一个桥梁,根据数据得到相应需要有的插槽数来创建模板插入孙子组件,由于孙子组件的插槽名是动态的,所以,这里使用v-slot指令,插槽名为item对应的值,同时附带孙子组件的value值。
而模板里面又是一个插槽供爷爷组件进行插入,名字依旧是动态的item的值,附带从孙子组件得到的value
# 爷爷组件
<template v-slot:slot-name-one="value">
<div class="slot-name-one">
<div class="value">{{ value.value }}</div>
<div class="value">{{ value.value }}</div>
</div>
</template>
<template v-slot:slot-name-two="value">
<div class="slot-name-two">
<div :class="value.value === 'a' ? 'a' : 'other'">{{ value.value }}</div>
</div>
</template>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
这样爷爷组件就可以尽情的往孙子组件插入了
上次更新: 2023/06/01, 12:40:50