如何使用动态道具数据动态呈现 vue 组件的新实例

Posted

技术标签:

【中文标题】如何使用动态道具数据动态呈现 vue 组件的新实例【英文标题】:How can I render a new instance of vue component dynamically with dynamic props data 【发布时间】:2019-04-03 13:53:10 【问题描述】:

我有一个vue组件,实现接口如下。

<my-data-grid :colunms='columns' :rows='rows'></my-data-grid>

我需要在具有不同数据的多个标签页上动态呈现上述组件。每个 my-data-grid 在不同的时间呈现。就像一组新数据进来,然后创建一个呈现组件的新页面。目前它适用于正确更新列和行道具,但一旦有新数据进入,就会覆盖其他标签页上的数据。

当我尝试动态执行此操作以便可以在运行时呈现组件时,组件显示但列和行道具没有更新。它显示 data() 未定义。

我的部分代码如下所示。你也可以参考这个链接 Render other components in Tab using template

Import MyDataGrid from "./MyDataGridComponent'
Vue.component('my-data-grid', MyDataGrid)
export default 
  name: 'app',
  data: function() 
    return 
      headerText0: 
        text: 'Tab1'
      ,
      columns: ['some arrays'],
      rows: ['some arrays'],
      headerText1: 
        text: 'Tab2'
      ,
      headerText2: 
        text: 'Tab3'
      ,
      Content1: function() 
        return 
          template: Vue.component('MyDataGrid', 
              template: ' <my-data-grid :colunms='columns' :rows = 'rows' > < /my-data-grid>',
              data() 
                return 
                  colunms: this.columns,
                  rows: this.rows
                
              
            )
          
        
      
    
  

在过去的 3 天里,我一直在网上搜索,但不知怎的,我已经筋疲力尽了。这是我第一次在***上提问,如果我跑题了,请原谅我。 感谢期待您的帮助。

【问题讨论】:

【参考方案1】:

@Jim 感谢您的回复,经过大量搜索,我能够从article: https://css-tricks.com/creating-vue-js-component-instances-programmatically/ 获得解决方案。我通过使用 Vue.extend 创建 MyDataGrid 组件的副本来解决它,如下所示。

    以下行导入我的 vue 组件

    import MyDataGrid from "./MyDataGridComponent.vue";
    

    我将 MyDataGrid 组件传递给 Vue.extend 以创建 Vue 构造函数的子类

    var MyDataGridClass = Vue.extend(MyDataGrid);
    

    然后使用 new 关键字创建一个实例:propsData 为我的 vue 组件中的列和行 props 提供数据。

    var instance = new MyDataGridClass(
      propsData:  columns: this.columns, rows: this.rows 
    );
    

    我将实例挂载在一个空元素上

    instance.$mount()
    

    我使用原生 javascript api 将其插入到我页面上的 DOM 元素中。

    var tab  = document.getElementById('#mytab')
    tab.appendChild(instance.$el)
    

完整代码如下所示。

import Vue from "vue";
import MyDataGrid from "./MyDataGridComponent.vue";

export default 
data: function () 
  return 
    columns: ['some array'],
    rows: ['some array']
  
,
methods: 
  addTab() 
    var ComponentClass = Vue.extend(MyDataGrid);
    var instance = new ComponentClass(
      propsData:  columns: this.columns, rows: this.rows 
    );
    instance.$mount()
    var tab  = document.getElementById('#mytab')
    tab.appendChild(instance.$el)
  

;

有时挑战是创造力的肥料。寻找,就会找到。

【讨论】:

【参考方案2】:

属性是使用“props”在组件上定义的。您将行和列定义为组件的本地数据。

将行和列移出数据字段,并添加一个 props 字段:

props: ['rows', 'columns'],

【讨论】:

感谢您的回复。其实我知道这一点,我已经按照你的建议尝试过,它没有用。我认为在这种情况下,根据我发布的链接上的来源,他们在数据下使用了那些动态道具。请随时查看此链接here 我假设您模板中的拼写错误来自转录问题。将其分解为较小的测试用例可能会有所帮助,可能在 jsfiddle 或 codepen 或类似的地方。

以上是关于如何使用动态道具数据动态呈现 vue 组件的新实例的主要内容,如果未能解决你的问题,请参考以下文章

如何通过选定的道具动态地更改 vue js 2 中的选项卡?

将道具动态传递给VueJS中的动态组件

如何在 vue-status-indicator 中动态更改道具?

带有 Vue 选项卡的组件标签中的动态道具

如何使用 props 动态挂载 vue 组件

Vue路由器将道具传递给动态加载的孩子