You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vue.js新手求助:如何利用给定数据渲染带rowspan的表格?

用Vue.js渲染带rowspan的销售数据表格

嘿,作为Vue新手碰到rowspan表格渲染确实容易懵,我来一步步教你怎么实现你想要的效果~

核心思路

每个产品的名称单元格需要合并与它对应的月份行数,也就是rowspan的值等于该产品months数组的长度。我们可以通过嵌套循环来处理:外层遍历产品,内层遍历每个产品的月份数据,只在第一个月份的行里显示产品名称并设置rowspan,后续月份的行跳过产品名称列即可。

完整实现代码

下面是可直接运行的示例,包含数据处理、表格渲染和总销售额计算:

<!DOCTYPE html>
<html>
<head>
  <title>Vue Monthly Sales Table</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  <style>
    table {
      border-collapse: collapse;
      width: 80%;
      margin: 20px auto;
    }
    th, td {
      border: 1px solid #ddd;
      padding: 8px;
      text-align: left;
    }
    th {
      background-color: #f2f2f2;
    }
  </style>
</head>
<body>
  <div id="app">
    <h2>{{ title }}</h2>
    <table>
      <thead>
        <tr>
          <th>Product</th>
          <th>Month</th>
          <th>Unit Price</th>
          <th>Units Sold</th>
          <th>Total</th>
        </tr>
      </thead>
      <tbody>
        <!-- 用template包裹每个产品的所有行,避免生成多余DOM -->
        <template v-for="(product, prodIndex) in monthlySales" :key="prodIndex">
          <tr v-for="(month, monthIndex) in product.months" :key="monthIndex">
            <!-- 仅在第一个月份行显示产品名称,并设置rowspan -->
            <td v-if="monthIndex === 0" :rowspan="product.months.length">
              {{ product.product }}
            </td>
            <td>{{ month.month }}</td>
            <td>{{ month.unitPrice }}</td>
            <td>{{ month.unitsSold }}</td>
            <!-- 计算并格式化总销售额 -->
            <td>{{ calculateTotal(month.unitPrice, month.unitsSold) }}</td>
          </tr>
        </template>
      </tbody>
    </table>
  </div>

  <script>
    new Vue({
      el: '#app',
      data() {
        return {
          title: "Monthly Sales",
          monthlySales: [
            {
              "product": "P123",
              "months": [
                { "month": "January", "unitPrice": "$80", "unitsSold": 2200 },
                { "month": "February", "unitPrice": "$82", "unitsSold": 1900 },
                { "month": "March", "unitPrice": "$81", "unitsSold": 1800 }
              ]
            },
            {
              "product": "Q456",
              "months": [
                { "month": "January", "unitPrice": "$20", "unitsSold": 200 },
                { "month": "February", "unitPrice": "$22", "unitsSold": 100 }
              ]
            }
          ]
        }
      },
      methods: {
        // 计算单月总销售额并格式化为美元
        calculateTotal(unitPrice, unitsSold) {
          const price = parseFloat(unitPrice.replace('$', ''));
          const total = price * unitsSold;
          return total.toLocaleString('en-US', { 
            style: 'currency', 
            currency: 'USD' 
          });
        }
      }
    })
  </script>
</body>
</html>

关键细节解释

  1. <template>标签的使用:它是Vue的占位符元素,不会被渲染成实际DOM,用来包裹每个产品的所有行,让结构更清晰。
  2. rowspan的动态绑定:通过:rowspan="product.months.length"让产品名称单元格自动合并对应行数。
  3. 条件渲染产品列:用v-if="monthIndex === 0"确保只有每个产品的第一行显示产品名称,后续行跳过该列,实现单元格合并效果。
  4. 总销售额计算:通过自定义方法calculateTotal处理价格格式转换和乘法计算,最后用toLocaleString格式化美元金额。

这样就能完美渲染出你想要的带合并单元格的销售表格啦~

内容的提问来源于stack exchange,提问作者Rohith

火山引擎 最新活动