vue.js v-for 在两个表行上

Posted

技术标签:

【中文标题】vue.js v-for 在两个表行上【英文标题】:vue.js v-for on two table rows 【发布时间】:2018-08-07 08:19:08 【问题描述】:

Vue 2,没有 webpack。我想一次渲染两个 trs,用于主要和细节可扩展行。这就是我想要实现的目标:

<table>
   <tbody>
     <div v-for="item in items">
         <tr></tr>
         <tr class="detail-row"></tr>
     </div>
   </tbody>
</table>

问题是&lt;div&gt; 是 tbody 的无效子代。每次for循环迭代如何渲染两个&lt;tr&gt;s?

【问题讨论】:

你能用你真正想要实现的用例来扩展这个问题吗? 【参考方案1】:

在较新版本的 VueJS 中,它需要一个索引。所以解决方案看起来像

  <table>
    <tbody>
      <template v-for="(item, index) in items">
        <tr :key="index">
           <td>item.master</td>
        </tr>
        <tr :key="index" class="detail-row">
           <td>item.detail</td>
        </tr>
      </template>
    </tbody>
  </table>

【讨论】:

【参考方案2】:

如果你想在双标签中使用。 或者想要在表格 tr 标签内的模板 div 中使用单独的组件(如在新组件中),您可以在第一个 div 中使用 style="display: contents" 以保持表格行彼此内联。

Vue 组件

<table> 
<template v-for="v-for="(price, index) in prices">
<div :key="price.id"  style="display: contents">
<tr><td>price.id</td><td>price.name</td></tr>
<tr col-span="2">price.desc</tr>
</div>
</template>
</table>

或者,如果您想为行使用单独的组件

Table.vue

<template>
<div>
<table class="table">
<thead>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
</thead>
<tbody>
<template v-for="item in items">
<my-component :item=“item”/>
</template>
</tbody>
</table>
</div>
</template>

我的组件.vue

<template>
<div style="display: contents">
<tr>
<td>item.firstname</td>
<td>item.lastname</td>
</tr>
<tr>
<td colspan="2" >
item.description
</td>
</tr>
</div>
</template>

【讨论】:

【参考方案3】:

这是你在支持template的浏览器中解决它的方法。

<table>
   <tbody>
     <template v-for="item in items">
         <tr></tr>
         <tr class="detail-row"></tr>
     </template>
   </tbody>
</table>

如果您需要支持支持template的浏览器,我通常会求助于渲染函数。

这是两者的工作示例。

console.clear()

new Vue(
  el: "#app",
  data: 
    items: [
        master: "Master",
        detail: "Detail"
      ,
      
        master: "Master",
        detail: "Detail"
      ,
    ]
  
)

new Vue(
  el: "#app2",
  data: 
    items: [
        master: "Master",
        detail: "Detail"
      ,
      
        master: "Master",
        detail: "Detail"
      ,
    ]
  ,
  render(h)
    // build the rows
    let rows = []
    for (let item of this.items)
      rows.push(h("tr", [h("td", [item.master])]))
      rows.push(h("tr", class: "detail-row", [h("td", [item.detail])]))
    
    
    // add rows to body
    let body = h("tbody", rows)
    
    // return the table
    return h("table", [body])
  
)
.detail-row
 background-color: lightgray;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>

<h2>Using template</h2>
<div id="app">
  <table>
    <tbody>
      <template v-for="item in items">
        <tr><td>item.master</td></tr>
        <tr class="detail-row"><td>item.detail</td></tr>
      </template>
    </tbody>
  </table>
</div>
  
<h2>Using render function</h2>
<div id="app2"></div>

【讨论】:

但是模板是 tbody 的有效子节点吗?我认为只允许 tr 元素 @user3599803 template 未呈现。注意这个例子。 是的。这是完全有效的,因为浏览器不呈现模板元素。 请注意,如果您使用 .vue 文件,浏览器支持并不重要,因为 vue 编译器会自动为您修复这种情况 @Ferrybig 是的,或者纯字符串模板。

以上是关于vue.js v-for 在两个表行上的主要内容,如果未能解决你的问题,请参考以下文章

vue.js 中的v-for可以将遍历出来的值放入标签属性吗

在 vue js 中使用 v-for 在 div 内创建组件

包含 Vue.js v-if 和 v-for 指令的 HTML 标签在加载时闪烁

Vue.js 从源码理解v-for和v-if的优先级的高低

Vue.js 从源码理解v-for和v-if的优先级的高低

如何在 Vue.js 中获取 v-for 索引?