首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vuejs -从Vuejs到嵌套子槽

Vuejs -从Vuejs到嵌套子槽
EN

Stack Overflow用户
提问于 2017-07-31 12:56:18
回答 2查看 3K关注 0票数 1

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

代码语言:javascript
复制
//modal component
<template>
   <slot></slot>
   <slot name='buttons'></slot>
</template>

我想用它当巫师

代码语言:javascript
复制
//wizard component
<template>
   <modal>
      <step1-state v-if='step === 1'/>
      <step2-state v-if='step === 2'/>
   </modal>
</template>

step1,step2等是否有使用buttons插槽的方式?

这似乎不起作用

代码语言:javascript
复制
//step1-state component
<template>
   <div>
       <span>Does it work?</span>
       <div slot='buttons'>
          <button>yes</button>
          <button>no</button>
       </div>
   </div>
</template>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-13 11:36:58

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

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

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

named -放置内容的槽名

container - refchild-slot

use-slot将自动找到由named属性命名的第一个父槽,而不考虑子深度。

子槽

代码语言:javascript
复制
<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>

使用槽

代码语言:javascript
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2017-07-31 15:46:32

据我所知,这是不可能的,目前和没有太多的意义,因为它变得复杂和难以阅读。想象一下,在编写了3个月的嵌套槽代码之后,就会看到它。如果您的两个步骤组件都需要这个buttons插槽,那么当您从这个buttons插槽中进行更改时,将它写为他们附近的兄弟姐妹,然后发送道具。

顺便说一句,似乎有一个向导组件存在https://github.com/cristijora/vue-form-wizard,是我意外编写的))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45416576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档