【问题标题】:Is it possible to resolve child components per instance in Vue.js?是否可以在 Vue.js 中为每个实例解析子组件?
【发布时间】:2016-06-20 09:29:06
【问题描述】:

我希望能够动态传递子组件。子组件可以根据父组件的实例而有所不同,有没有什么办法可以在不注册全局组件的情况下实现?

这是我想要实现的一个简单示例:

// Component A
export default {
    template: `
        <div>
            <div>Some stuff...</div>
            <component-b :passed-component="passedComponent"></component-b>
        </div>
    `,
    data() {
        return {
            passedComponent: { /* ... */ },
        };
    },
    // Note: passedComponent doesn't necessarily come from `data`
};

// Component B
export default {
    template: `
        <div>
            <div>Some more stuff...</div>
            <component-c :passed-component="passedComponent"></component-c>
        </div>
    `,
    props: ['passedComponent'],
};

// Component C
export default {
    template: `
        <div>
            <div is="passedComponent"></div>
        </div>
    `,
    props: ['passedComponent'],
    components: {
        // How can I register `passedComponent` here?
        // (it can differ per instance of `component-c`)
    },
};

为清楚起见进行编辑:最好传递一个实际的组件对象而不是名称。

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    编辑:

    在你说你想将组件定义作为道具传递之后,即使我想不出用例,我很想知道这是否可行。

    原来可以使用async component 功能来完成。

    要玩的 JSFiddle:https://jsfiddle.net/rvsbccan/4/

    HTML:

    <div id="app">
      <test :passed-comp="compDefToPass"></test>
    </div>
    <template id="test">
      <passed-comp></passed-comp>
    </template>
    

    JS:

    Vue.component('test', {
      template: '#test',
      props: ['passedComp'],
      components: {
        'passed-comp': function(resolve) {
          resolve(this.passedComp)
        }
      },
    })
    
    var vm = new Vue({
      el: '#app',
      data: {
        'compDefToPass': {
          template: '<div>When you see this, we successfully passed down a component definition as a prop!</div>',
          ready: function() {
            console.log('Hello from a prop-passed component.')
          }
        }
      }
    })
    

    旧回复供参考:

    您似乎已经知道的只有两种方法:

    • 在全球范围内注册
    • 在组件 C 中本地导入和注册 所有可能的组件

    如果第二种可能性由于大量导入而令人生畏,您可以将它们提取到另一个模块:

    // componentBundle.js
    import X from './components/X.vue'
    import Y from './components/Y.vue'
    // .... and so on...
    export default {
      X, Y, ....
    }
    
    // component-c.vue
    import componentBundle from '../component-bundle'
    export default {
      components: componentBundle
    }
    

    【讨论】:

    • 我更愿意实际发送一个对象作为道具而不是组件名称。除此之外,第二个选项也不错。如果没有更好的结果,我会接受这篇文章作为答案。
    • 几乎有效。这实际上是我的第一个实现,但问题是该组件仅在第一次得到解决,这意味着它不能在每个实例中有所不同。
    • 根据我的用例:我正在构建一个组件,该组件将分发在一个包中,其中一部分必须为每个应用程序定制。我希望能够传递一个完全自定义的组件。 (slots 不会这样做,因为自定义组件嵌套得很深)
    • 接受这个作为答案,因为我最终将所有可能的组件注册为 assign 调用作为 components 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2016-11-20
    • 2020-12-29
    • 2016-04-29
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多