我有一个像这样的模态组件
//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>发布于 2017-10-13 11:36:58
经过一些研究,我发现这在默认情况下是不可能的。我能够使用自定义呈现函数来实现这一点。
child-slot组件-这个组件需要放置在父槽内容中,它使您能够格式化子组件的内容。您可以添加多个child-slot来将其与父内容混合。它需要定义具有不同值的ref属性。
use-slot组件-这个组件用于判断哪些内容应该作为child-slot内容传递给父组件。内容将放置在span元素中。它需要named和container属性。
named -放置内容的槽名
container - ref值child-slot
use-slot将自动找到由named属性命名的第一个父槽,而不考虑子深度。
子槽
<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>使用槽
<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>发布于 2017-07-31 15:46:32
据我所知,这是不可能的,目前和没有太多的意义,因为它变得复杂和难以阅读。想象一下,在编写了3个月的嵌套槽代码之后,就会看到它。如果您的两个步骤组件都需要这个buttons插槽,那么当您从这个buttons插槽中进行更改时,将它写为他们附近的兄弟姐妹,然后发送道具。
顺便说一句,似乎有一个向导组件存在https://github.com/cristijora/vue-form-wizard,是我意外编写的))
https://stackoverflow.com/questions/45416576
复制相似问题