【问题标题】:Computed function from Vue component Data来自 Vue 组件数据的计算函数
【发布时间】:2017-01-03 08:49:52
【问题描述】:

我有以下 Vue 组件和数据:

    Vue.component('receipt', {
    template: '#receipt-template',
    data: function() {
        return {
            tip: 8.50
        };
    },
    computed: {
        subtotal: function() {
            return this.sales.price;
            console.log(this.sales.price);
        }
    },
    props: ['header', 'date', 'sales' ]
})

new Vue({
    el: '#content',
    data: {
        sales1: [
            {amount: 1, desc: 'A book title', price: 13.99},
            {amount: 3, desc: 'An espresso title', price: 5.00},
            {amount: 6, desc: 'A drink title', price: 4.25},
            {amount: 2, desc: 'A pastrt', price: 3.99}
        ],
        sales2: [
            {amount: 1, desc: 'A title', price: 9},
            {amount: 2, desc: 'An title', price: 0},
            {amount: 3, desc: 'A title', price: 5},
            {amount: 4, desc: 'A ', price: 99}
        ]
    }
})

还有以下模板:

<div class="page page2 current">

        <!-- Call our custom receipt vue component -->
        <receipt header="Between the Covers &amp; Grinders Café" date="Sept. 23, 2016 10:52 am" :sales="sales1"></receipt>
        <receipt header="Between the Covers &amp; Grinders Café" date="Sept. 25, 2016 3:08 pm" :sales="sales2"></receipt>

        <div class="clearfix"></div>

    </div><!--end page2-->

    <template id="receipt-template">
        <div class="receipt">
                <div class="receipt-header">
                    <h2>{{ header }}</h2>
                </div><!--end receipt-header-->
                <div class="receipt-body">
                    <div class="receipt-labels">
                        <p>Sales</p>
                        <p>{{ date }}</p>
                        <div class="clearfix"></div>
                    </div><!--end receipt-labels-->
                    <div class="receipt-sales">
                        <div class="receipt-sale-row" v-for="sale in sales">
                            <p>{{ sale.amount }}</p>
                            <p>{{ sale.desc }}</p>
                            <p class="sale-price">${{ sale.price }}</p>
                        </div><!--end receipt-sale-row-->
                    </div><!--end receipt-sales-->
                    <div class="receipt-subtotals">
                        <p>Subtotal</p>
                        <p>{{ subtotal }}</p>
                        <p>Tax</p>
                        <p>$2.64</p>
                        <div class="clearfix"></div>
                    </div><!--end subtotals-->
                    <div class="receipt-totals">
                        <p>Tip</p>
                        <p>{{ tip }}</p>
                        <p>Total</p>
                        <p></p>
                        <div class="clearfix"></div>
                    </div><!--end totals-->
                    <div class="receipt-card">
                        <p>Visa 1825</p>
                        <p>$41.25</p>
                        <div class="clearfix"></div>
                    </div><!--end card-->
                </div><!--end receipt-body-->
            </div><!--end receipt-->
    </template>

我不知道如何计算“小计”。我需要做的是让计算函数“小计”返回每个“销售”对象的所有价格的总和。我做错了什么?

【问题讨论】:

    标签: javascript vue.js vue-component computed-properties


    【解决方案1】:

    您需要将this.sales 中的所有price 组件相加。

    subtotal: function() {
      let result = 0;
    
      this.sales.forEach((sale) => result += sale.price);
      return Math.round(100 * result) / 100;
    }
    

    Vue.component('receipt', {
      template: '#receipt-template',
      data: function() {
        return {
          tip: 8.50
        };
      },
      computed: {
        subtotal: function() {
          let result = 0;
          
          this.sales.forEach((sale) => result += sale.price);
          return Math.round(100 * result) / 100;
        }
      },
      props: ['header', 'date', 'sales']
    });
    
    new Vue({
      el: '.page.current',
      data: {
        sales1: [{
          amount: 1,
          desc: 'A book title',
          price: 13.99
        }, {
          amount: 3,
          desc: 'An espresso title',
          price: 5.00
        }, {
          amount: 6,
          desc: 'A drink title',
          price: 4.25
        }, {
          amount: 2,
          desc: 'A pastrt',
          price: 3.99
        }],
        sales2: [{
          amount: 1,
          desc: 'A title',
          price: 9
        }, {
          amount: 2,
          desc: 'An title',
          price: 0
        }, {
          amount: 3,
          desc: 'A title',
          price: 5
        }, {
          amount: 4,
          desc: 'A ',
          price: 99
        }]
      }
    });
    .receipt-subtotals p,
    .receipt-labels p,
    .receipt-sale-row p,
    .receipt-totals p {
      display: inline-block;
      margin: 1rem;
    }
    <script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
    <div class="page page2 current">
    
      <!-- Call our custom receipt vue component -->
      <receipt header="Between the Covers &amp; Grinders Café" date="Sept. 23, 2016 10:52 am" :sales="sales1"></receipt>
      <receipt header="Between the Covers &amp; Grinders Café" date="Sept. 25, 2016 3:08 pm" :sales="sales2"></receipt>
    
      <div class="clearfix"></div>
    
    </div>
    <!--end page2-->
    
    <template id="receipt-template">
      <div class="receipt">
        <div class="receipt-header">
          <h2>{{ header }}</h2>
        </div>
        <!--end receipt-header-->
        <div class="receipt-body">
          <div class="receipt-labels">
            <p>Sales</p>
            <p>{{ date }}</p>
            <div class="clearfix"></div>
          </div>
          <!--end receipt-labels-->
          <div class="receipt-sales">
            <div class="receipt-sale-row" v-for="sale in sales">
              <p>{{ sale.amount }}</p>
              <p>{{ sale.desc }}</p>
              <p class="sale-price">${{ sale.price }}</p>
            </div>
            <!--end receipt-sale-row-->
          </div>
          <!--end receipt-sales-->
          <div class="receipt-subtotals">
            <p>Subtotal</p>
            <p>${{ subtotal }}</p>
            <p>Tax</p>
            <p>$2.64</p>
            <div class="clearfix"></div>
          </div>
          <!--end subtotals-->
          <div class="receipt-totals">
            <p>Tip</p>
            <p>{{ tip }}</p>
            <p>Total</p>
            <p></p>
            <div class="clearfix"></div>
          </div>
          <!--end totals-->
          <div class="receipt-card">
            <p>Visa 1825</p>
            <p>$41.25</p>
            <div class="clearfix"></div>
          </div>
          <!--end card-->
        </div>
        <!--end receipt-body-->
      </div>
      <!--end receipt-->
    </template>

    【讨论】:

    • 谢谢,@roy 我让它工作了。我希望用户能够更新价格,所以我将它们放在输入中并将输入绑定到 v-model="sales.price"。但是当价格更新时,我会丢失小计。我认为这就是 Vue 的全部意义所在?
    • @JordanBarber 你能澄清一下丢失小计的意思吗?每当修改基础数据时,都应该重新计算计算属性。是否存在某种 JS 错误?
    • @ceejayoz 在此处查看有关输入更改的更新小计jsbin.com/fecukitisu/edit?html,js,output
    • @JordanBarber 文本字段值是文本。您需要转换为数字才能获得正确的计算。 this.sales.forEach((sale) =&gt; result += +sale.price); 会做到的。
    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 2021-04-10
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多