如何在 Vue.js 中计算部分值和总值?

Posted

技术标签:

【中文标题】如何在 Vue.js 中计算部分值和总值?【英文标题】:How to calculate partial value and total value in Vue.js? 【发布时间】:2019-05-23 20:03:42 【问题描述】:

我从 Vue.js 开始,我不知道如何计算 v-for 显示中的部分值和总值。

我从具有下一个结构的 JSON 中获取一些信息:

[saldos]
  [bank]
    [data]
      [account]
        - name
        - balance
      [account]
        - name
        - balance
    [meta]
      - info
  [bank]
    [data]
      [account]
        - name
        - balance
      [account]
        - name
        - balance
    [meta]
      - info

每个银行可以是 0 个账户、1 个账户或多个账户。

我需要获取每家银行的部分价值(它是同一家银行内所有账户“余额”的总和)和总值(它是之前为每家银行计算的所有部分价值的总和)

我的 Vue.js 文件是:

var saldo = new Vue(
    el: "#listasaldos",
    data: 
        saldos:[],
    ,
    created: function()
        console.log("Cargando ...");
        this.get_saldos();
    ,

    methods:
        get_saldos: function()
            fetch("./api.php?action=saldosapi")
            .then(response=>response.json())
            .then(json=>this.saldos=json.saldos)
        
    
);

我的 html 文件是:

<div id="listasaldos">
    <h1>Title</h1>
    <h2>totalValue</h2>

    <div v-for="bank in saldos">

      <h3>partialValue</h3>

      <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Balance</th>
        </tr>
      </thead>
      <tbody v-for="account in bank.data">
        <tr> account.name</tr>
        <tr> account.balance</tr>
      </tbody>
      </table>

    </div>
</div>

我该怎么做?

谢谢!

【问题讨论】:

【参考方案1】:

对于saldos 总数,您可以添加computed 属性并使用reduce 来计算总数:

computed: 
    totalValue() 
      return this.saldos.map((data) => data).flat().reduce((a, b) => a + b.balance, 0);
    

我不熟悉如何在循环中添加vue 计算属性。根据this answer,您要么必须为每个bank 创建一个组件,要么在methods 内添加一个名为getBankTotal 的函数:

getBankTotal: function(bank)
   return bank.data.reduce((a, b) => a + b.balance, 0)

并在您的 HTML 中使用它:

<h3>getBankTotal(bank)</h3>

这是一个有效的 sn-p: (我之前没有使用过vue。所以,如果有任何语法或模式错误,请纠正我)

var saldo = new Vue(
  el: "#listasaldos",
  data: 
    saldos: [],
  ,
  created: function() 
    this.get_saldos();
  ,
  methods: 
    getBankTotal: function(bank) 
      return bank.data.reduce((a, b) => a + b.balance, 0)
    ,
    get_saldos: function() 
      this.saldos = [
        data: [
          name: "a/c 1",
          balance: 100
        ]
      , 
        data: [
          name: "a/c 2",
          balance: 300
        , 
          name: "a/c 3",
          balance: 400
        ]
      ]
    
  ,
  computed: 
    totalValue() 
      return this.saldos.map((data) => data).flat().reduce((a, b) => a + b.balance, 0);
    
  
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="listasaldos">
  <h1>Title</h1>
  <h2>Total Value: totalValue</h2>

  <div v-for="bank in saldos">

    <h3>Partial Value: getBankTotal(bank)</h3>
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Balance</th>
        </tr>
      </thead>

      <tbody>
        <tr v-for="account in bank.data">
          <td>account.name</td>
          <td>account.balance</td>
        </tr>
      </tbody>
    </table>
    <hr>
  </div>
</div>

【讨论】:

以上是关于如何在 Vue.js 中计算部分值和总值?的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 插槽 - 如何在计算属性中检索插槽内容

Vue.js - 如何在数组对象上实现计算属性?

如何在vue js中使用计算的三个搜索字段

Vue.js 如何从方法更改计算属性?

如何在 Vue.js 中创建 Date(now) 以在计算属性中使用?

vue如何管理下载状态