【问题标题】:Vuejs - interpolation in dynamic component template & scopeVuejs - 动态组件模板和范围内的插值
【发布时间】:2018-06-30 03:10:03
【问题描述】:

我一直在尝试让一个动态组件工作,它允许我根据提供的模板单独呈现列表项。
然而,Vue 似乎在父范围内插入模板,而不是在 dynamicComponent 范围内。

简单示例:

<dynamicComponent 
    v-for="item in listItems" 
    v-bind:input="item" 
    v-bind:is="{template:'<p>{{input.name}}</p>'}"
</dynamicComponent>

这会失败,因为 input 在父范围内是未知的。

有没有办法动态传递模板在组件范围内引用变量/属性?

编辑:解决方案

原来我有点误解了v-bind:is 的工作原理。
它允许您内联绑定/创建匿名组件,而不是添加/操作引用的组件。

正确的解决方案似乎是:

<component
  v-for="item in listItems"
  v-bind:input="item"
  v-bind:is="{template:'<p>{{input.name}}</p>', props:['input']}">
</component>

【问题讨论】:

    标签: vue.js vuejs2


    【解决方案1】:

    v-bind 用于组件名称属性,正如您所拥有的,它绑定到一个对象。您可以注册一个自定义组件,例如:

    component:{
      name: 'my-component',
      template: '<div>...foo...</div>',
    },
    data () {
        return {
            currentComponent: 'my-component'
        }
    }
    

    然后执行以下操作:

    <dynamicComponent v-bind:is="current-component">..</dynamicComponent>
    

    当然,您可以根据需要注册多个组件,然后将 currentComponent 数据属性设置为您要呈现的任何一个。

    另一个例子:

    import Component1 from 'component-1'
    import Component2 from 'component-2'
    import Component3 from 'component-3'
    
    components: {
         'component-1': Component1,
         'component-2': Component2,
         'component-3': Component3
    },
    data () {
        return {
            current: 'component-1'
        }
    },
    methods: {
        someAction (componentName) {
              this.current = componentName
        }
     }
    

    【讨论】:

    • 感谢您的意见。我特别试图避免在这种情况下创建多个单独的组件,并且正在寻找一种通过传递的模板动态生成组件的方法。这很好用,我只是纠结于如何在这个动态模板中引用传递的属性。
    • 您是否尝试过添加data 属性,例如:v-bind:is="{template:'

      {{input.name}}

      ', data () {返回 { foo: input.name }}}"?不知道这是否可行,只是在这一点上抛出想法。
    • 我假设您的意思是模板中的&lt;p&gt;{{foo}}&lt;/p&gt;?是的,我试过但无济于事,这是同样的问题,foo 不存在于父范围内,因此插值失败,因为模板是在父范围内评估的,而不是子组件...
    • 嗯,使用作用域插槽怎么样?这就是我能想到的。您以这种方式而不是在父文件或单个文件中创建组件是否有特殊原因?
    • 原来我有点误解了v-bind:is。现在想通了,并在上面添加了解决方案/解释。不过感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 2018-10-20
    • 2016-11-06
    • 2019-12-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多