【问题标题】:Vue js how to add component to cell in tableVue js如何将组件添加到表格中的单元格
【发布时间】:2018-07-02 23:15:34
【问题描述】:

我正在尝试添加一个组件(从数据库中获取选项的下拉列表)...

export default {
  name: 'IngMenu',
  props:['ingredients'],
  data () {
    return {
      selected: '',
    }
  },
  render: function(createElement){
    return createElement('select', 
      this.$props.ingredients.map(function(ing){
        return createElement('option', ing.name)
      })
    )

  }
}

进入使用按钮生成的单元格/行

<button class="btn" id="add" v-on:click="addRow">Add Ingredient</button>

这里方法...

methods: {
    addRow: function(){
        let table = document.getElementById("tab");
        let row = table.insertRow();
        let cell1 = row.insertCell(0);
        let cell2 = row.insertCell(1);
        let cell3 = row.insertCell(2);
        let cell4 = row.insertCell(3);
        let cell5 = row.insertCell(4);
        cell1.appendChild(document.createElement('Ingmenu')); //ERROR
        cell2.innerHTML = "NEW CELL2";
        cell3.innerHTML = "NEW CELL2";
        cell4.innerHTML = "NEW CELL2";
        cell5.innerHTML = "NEW CELL2";

}

} }

如果我将它添加到页面顶部但我无法插入到单元格内,该组件可以完美运行。

到目前为止我尝试过的:

cell1.innerHtml = "" 它在表格树中添加标签而不是渲染组件

cell1.appendChild(document.createElement('Ingmenu'));和上面的一样

cell1.innerText 显然它将标签显示为文本

正如我上面所说,组件已正确初始化,只要它可以访问成分属性,它就可以在任何页面上工作。

我花了将近一天的时间试图独自解决这个问题。

有人知道解决办法吗?感谢您的关注

【问题讨论】:

  • 为什么...您使用 DOM 操作来创建 Vue 组件?让 Vue 渲染表格。
  • 我不确定我明白你的意思。你指的是 Vue 网格组件吗?谢谢

标签: vue.js vuejs2


【解决方案1】:

Vue 的全部意义在于允许您的“视图”(如果您愿意,可以使用 DOM 或 HTML)作为数据的表示。

在 Vue 中几乎没有理由让您直接使用 getElementByIdappendChild 操作 DOM。

相反,以您期望基于某些数据结构布局的方式编写您的模板。在这种情况下,您正在添加“行”。 what 的行我不知道,但某处应该有 thing 的集合。当您想向表格中添加一行时,只需向集合中添加一个新的 事物,Vue 会负责将其添加到 DOM 中。

这是一个例子。

console.clear()

const IngMenu = {
  name: 'IngMenu',
  props:['ingredients'],
  data () {
    return {
      selected: '',
    }
  },
  render: function(createElement){
    return createElement('select', 
      this.$props.ingredients.map(function(ing){
        return createElement('option', ing.name)
      })
    )

  }
}

new Vue({
  el: "#app",
  data:{
    rows:[],
    ingredients: [{name: "One"}, {name: "Two"}]
  },
  methods: {
    addRow(){
      // Push some real data object here that represents 
      // what each row "is"
      this.rows.push({})
    }
  },
  components: {IngMenu}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<div id="app">
  <table>
    <tr v-for="row in rows">
      <td>
        <ing-menu :ingredients="ingredients"></ing-menu>
      </td>
      <td>NEW CELL2</td>
      <td>NEW CELL3</td>
      <td>NEW CELL4</td>
      <td>NEW CELL5</td>
    </tr>
  </table>
  <button class="btn" id="add" v-on:click="addRow">Add Ingredient</button>
</div>

【讨论】:

  • 非常感谢,您的代码运行良好,我需要创建一个行组件,因为这是较大应用程序的一部分。我唯一不明白的是,当您将一个空对象推送到行数组并创建一个新行时。我确实理解 v-for 部分,它是如何从我不理解的 addRow() 中获取的。你能解释一下吗?再次感谢
  • @FraPetIm 同样,这又回到了一个事实,即表格是事物集合的表示。在上面的答案中,该集合称为rows。我不知道想在表格中显示什么,但你有一些的东西。为了示例的目的,我将事物集合设为空对象的集合。 v-for="row in rows" 只显示rows 集合中的每一行。每次单击按钮时,都会将一个新的空对象添加到集合中,因此您会得到一个新行。在典型的应用程序中,当您单击 addRow 时,您将添加您的事物之一。
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2015-12-29
  • 2021-06-04
  • 2015-12-16
  • 1970-01-01
  • 2013-11-02
相关资源
最近更新 更多