首页 > 解决方案 > 在 Vuejs 中使用复选框和单选按钮计算价格

问题描述

我是 Vue.js 的新手,试图制作这个小型披萨订购应用程序,您可以在其中选择不同价格的披萨大小,如中号、大号和特大号,以及意大利辣香肠、额外奶酪、蘑菇等配料,价格不同,当u 选择披萨尺寸,它将显示该尺寸的价格,如中号是 3000,当您通过选择像意大利辣香肠这样的复选框添加浇头时,价格将添加到中号披萨尺寸中,如果您希望选中所有复选框每个配料的价格应添加到所选披萨大小,如果您未选中,价格应相应降低。到目前为止,我想要的一切都完美无缺,除了当我在比萨大小上选中两个或多个复选框时,它会被添加,但是当我将比萨大小更改为从中到大时,只有最后一个选中的复选框价格被添加到剩余的选中复选框价格被忽略,任何如何解决这个问题的想法都将受到赞赏,甚至是编写此代码的更好方法

这是模板

<template>
    <app-layout title="Order Pizza">
        <template #header>
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                Order Pizza
            </h2>
        </template>
        <!-- Container -->
        <div class="container mx-auto">
            <div class="flex justify-center px-6 my-12">
                <!-- Row -->
                <div class="w-full xl:w-3/4 lg:w-11/12 flex">
                    <!-- Col -->
                    <div class="w-full h-auto bg-gray-400 hidden lg:block lg:w-7/12 bg-cover 
          rounded-l-lg" style="background-image: url('https://images.unsplash.com/photo- 
         1604382355076-af4b0eb60143?ixlib=rb')"></div>
                    <!-- Col -->
                    <div class="w-full lg:w-12/12 bg-white p-2 rounded-lg lg:rounded-l- 
       none">
                        <h3 class="pt-4 text-2xl text-center">Make Your Order With Your
                            Favorite Toppings!</h3>
                        <form @submit.prevent="store" class="px-2 pt-4 pb-4 mb-4 bg-white 
            rounded">

                            <div class="mb-4">
                                <label class="block mb-2 text-sm font-bold text-gray-700" for="address">
                                    Address
                                </label>
                                <input class="w-full px-3 py-2 mb-3 text-sm leading-tight text- 
              gray-700 border rounded shadow appearance-none focus:outline-none 
                     focus:shadow-outline" id="address" type="address" placeholder="Address" v-model="form.address" />
                            </div>
                            <div class="mb-4 md:flex md:justify-between">

                                <div class="mb-4 md:mr-2 md:mb-0">
                                    <label class="block mb-2 text-sm font-bold text-gray- 
                  700" for="address">
                                        Size
                                    </label>
                                    <div>
                                        <input class="cursor-pointer " @change="setSizePrice($event)" type="radio"
                                            v-bind:value="m" v-model="form.size">
                                        <span class="text-sm px-1">Medium</span>
                                    </div>
                                    <div>
                                        <input class="cursor-pointer" @change="setSizePrice($event)" type="radio"
                                            v-bind:value="l" v-model="form.size">
                                        <span class="text-sm px-1">Large</span>
                                    </div>
                                    <div>
                                        <input class="cursor-pointer" @change="setSizePrice($event)" type="radio"
                                            v-bind:value="xl" v-model="form.size">
                                        <span class="text-sm px-1">Extra Large</span>
                                    </div>



                                </div>

                            </div>


                            <div class="mb-4">
                                <label class="block mb-2 text-sm font-bold text-gray-700" for="address">
                                    Toppings
                                </label>
                                <div id="checkboxes" class="flex">
                                    <div class="md:ml-2">
                                        <input type="checkbox" @change="addToppings($event)" :value="200" id="pepperoni"
                                            v-model="form.toppings" class="rounded border-gray-300 text-indigo-600 
              shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 
          focus:ring-opacity-50" />
                                        <span class="text-sm pl-1 pr-2">Pepperoni</span>
                                    </div>

                                    <div class="md:ml-2">
                                        <input type="checkbox" @change="addToppings($event)" :value="300"
                                            id="extracheese" v- model="form.toppings" class="rounded border-gray-300 text-indigo-600 
              shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 
           focus:ring-opacity-50" />
                                        <span class="text-sm pl-1 pr-2">Extra
                                            Cheese</span>
                                    </div>

                                    <div class="md:ml-2">
                                        <input type="checkbox" @change="addToppings($event)" :value="400" id="mushrooms"
                                            v-model="form.toppings" class="rounded border-gray-300 text-indigo-600 
                      shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 
               focus:ring-opacity-50" />
                                        <span class="text-sm pl-1 pr-2">Mushrooms</span>
                                    </div>

                                    <div class="md:ml-2">
                                        <input type="checkbox" @change="addToppings($event)" :value="500"
                                            id="groundbeef" v-model="form.toppings" class="rounded border-gray-300 text-indigo-600 
                         shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo200 
                   focus:ring-opacity-50" />
                                        <span class="text-sm pl-1 pr-2">Ground
                                            Beef</span>
                                    </div>

                                    <div class="md:ml-2">
                                        <input type="checkbox" @change="addToppings($event)" :value="600" id="pineapple"
                                            v-model="form.toppings" class="rounded border-gray-300 text-indigo-600 
                        shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 
                      focus:ring-opacity-50" />
                                        <span class="text-sm pl-1 pr-2">Pineapple</span>
                                    </div>
                                </div>
                            </div>


                            <div class="mb-4">

                                <label class="block mb-2 text-sm font-bold text-gray-700" for="instruction">
                                    Instruction
                                </label>
                                <input class="w-full px-3 py-2 mb-3 text-sm leading-tight text- 
                          gray-700 border rounded shadow appearance-none focus:outlinenone 
                       focus:shadow-outline" id="instructions" type="instructions" name="instructions"
                                    placeholder="Instructions" v-model="form.instructions" />
                            </div>

                            <div class="mb-6 text-center">
                                <button class="w-full px-4 py-2 font-bold text-white bg-blue-500 
                            rounded-full hover:bg-blue-700 focus:outline-none 
                       focus:shadow-outline">
                                    Place Order
                                </button>
                            </div>
                            <hr class="mb-6 border-t" />

                            <span>Price: N{{totalPrice ? totalPrice : sizePrice}} </span>

                        </form>
                    </div>
                </div>
            </div>
        </div>
    </app-layout>
</template>

剧本

<script>

import Checkbox from '../../Jetstream/Checkbox.vue';
import Input from '../../Jetstream/Input.vue';
import AppLayout from '@/Layouts/AppLayout.vue';

export default {
  components: { Input, Checkbox, AppLayout },
  data: function () {
    return {
      form: this.$inertia.form({
        address: null,
        size: null,
        toppings: [],
        instructions: null,
      }),

      m: 'medium',
      l: 'large',
      xl: 'extralarge',

      sizeStatus: null,
      sizePrice: null,
      toppingsPrice: null,
      totalPrice: null,

      medium: 2000,
      large: 3000,
      extralarge: 4500,

      pizzaSize: null,

      pepperoni: 'pepperoni',
      extraCheese: 'extracheese',
      mushrooms: 'mushrooms',
      groundBeef: 'groundbeef',
      pineapple: 'pineapple',

      toppings: null,
      toppingsSum: null,
      toppingsStatus: null,
    };
  },

  methods: {
    store() {
      this.form.post(this.route('order.store'));
    },

    setSizePrice(event) {
      this.pizzaSize = event.target.value;
      this.sizeStatus = event.target.checked;

      if (this.pizzaSize == this.m) {
        this.sizePrice = this.medium;

        if (this.toppingsStatus == true && this.sizeStatus == true) {
          this.sizePrice += parseInt(this.toppings);
        }
      } else if (this.pizzaSize == this.l) {
        this.sizePrice = this.large;

        if (this.toppingsStatus == true && this.sizeStatus == true) {
          this.sizePrice += parseInt(this.toppings);
        }
      } else {
        this.sizePrice = this.extralarge;

        if (this.toppingsStatus == true && this.sizeStatus == true) {
          this.sizePrice += parseInt(this.toppings);
        }
      }

      console.log(this.sizePrice);
    },

    addToppings(event) {
      this.toppings = event.target.value;
      this.toppingsStatus = event.target.checked;

      if (this.toppingsStatus) {
        this.sizePrice += parseInt(this.toppings);
        console.log(this.sizePrice);
      } else if (this.toppingsStatus == false) {
        this.sizePrice -= this.toppings;
        console.log(this.sizePrice);
      }
    },
  },
};

</script>

标签: javascriptvue.jscheckboxradio-buttoncalculation

解决方案


推荐阅读