gpt4 book ai didi

javascript - Vuejs - 将插槽传递给嵌套的 child

转载 作者:行者123 更新时间:2023-11-30 21:18:36 25 4
gpt4 key购买 nike

我有一个看起来像这样的模态组件

//modal component
<template>
<slot></slot>
<slot name='buttons'></slot>
</template>

我想把它当作一个向导来使用

//wizard component
<template>
<modal>
<step1-state v-if='step === 1'/>
<step2-state v-if='step === 2'/>
</modal>
</template>

有没有办法让 step1、step2 等消耗 buttons 插槽?

这个好像不行

//step1-state component
<template>
<div>
<span>Does it work?</span>
<div slot='buttons'>
<button>yes</button>
<button>no</button>
</div>
</div>
</template>

最佳答案

经过一些研究,我发现默认情况下这是不可能的。我能够使用自定义渲染函数实现这一点。

child-slot 组件 - 这个组件需要放在父插槽内容中,它使您能够格式化子组件的内容。您可以添加多个 child-slot 以将其与父内容混合。它需要定义具有不同值的 ref 属性。

use-slot 组件 - 该组件用于告知哪些内容应作为 child-slot 内容传递给父级。内容将被放置在 span 元素中。它需要 namedcontainer 属性。

named - 放置内容的插槽名称

container - ref child-slot 的值

use-slot 将自动找到由 named 属性命名的第一个父插槽,无论子级深度如何

child-slot

<script>
export default {
render(createElement) {
return createElement('span', {}, this.content);
},
data() {
return {
nodesToRender: {}
}
},
computed: {
content() {
var result = [];
for (var node in this.nodesToRender) {
result = result.concat(this.nodesToRender[node] || []);
}
return result;
}
}
}
</script>

use-slot

<script>
export default {
abstract: true,
props: {
named: {
type: String,
required: true
},
container: {
type: String,
required: true
}
},
render() {
var parent = this.findParentOfSlot();
var content = this.$slots.default;
var self = this;
this.$parent.$nextTick(function () {
if (parent && parent.$refs && parent.$refs[self.container], parent.$refs[self.container].nodesToRender) {
Vue.set(parent.$refs[self.container].nodesToRender, self.$vnode.tag, content);
}
});
},
methods: {
findParentOfSlot() {
var parent = this.$parent;
while (parent) {
if (parent.$slots && parent.$slots[this.named]) {
return parent.$parent;
}
parent = parent.$parent;
}
return parent;
}
}
}
</script>

关于javascript - Vuejs - 将插槽传递给嵌套的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45416576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com