2

我从 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>

我该怎么做?

谢谢!

4

1 回答 1

3

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

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

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

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

并在您的 HTML 中使用它:

<h3>{{getBankTotal(bank)}}</h3>

这是一个工作片段:(我以前没有使用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>

于 2018-12-24T20:32:07.413 回答