我试图将对象添加到我在Vue实例数据对象中声明的数组中.我可以在州的purchase对象中设置值,但当我将数据推送到orders队列数组中时,空数组不会被填充.正在触发该函数,但数组不会更新.

这是我的表格:

<form
  v-on:submit.prevent="queuePurchase"
  class="form-inline row"
  id="order-creation-form"
  method="POST"
>

  @csrf
  <autocomplete-field
    sizing="col-xs-12 col-sm-3 col-md-3"
    name="customer"
    label="Customer"
    :data="{{ json_encode($customers) }}"
    v-on:setcustomer="setCustomer($event)"
  ></autocomplete-field>

  <div class="col-xs-12 col-sm-3 col-md3 form-group d-flex flex-column align-items-start">
    <label for="phone">Product</label>
    <select
      v-model="purchase.product"
      class="form-control w-100"
      name="product"
      aria-describedby="productHelpBlock"
      required
    >
      @foreach ($products as $product)
        <option :value="{{ json_encode($product) }}">
          {{ $product->name }}
        </option>
      @endforeach
    </select>
    <small id="productHelpBlock" class="form-text text-muted">
      Select a product
    </small>
  </div>

  <div class="col-xs-12 col-sm-3 col-md-3 form-group d-flex flex-column align-items-start">
    <label for="phone">Quantity</label>
    <input
      v-model="purchase.quantity"
      type="number"
      min="1"
      name="product"
      class="form-control w-100"
      aria-describedby="productHelpBlock"
      required
    >
    <small id="productHelpBlock" class="form-text text-muted">
      Product quantity
    </small>
  </div>

  <div class="form-group">
    <button type="submit" class="btn btn-success icon-button d-flex">
      <i class="material-icons">add</i>
      <span>&nbsp;&nbsp;  Q U E U E</span>
    </button>
  </div>
</form>

下面是我的javascript:

require("./bootstrap");
window.Vue = require("vue");

Vue.component("queue-table", require('./components/QueueTable.vue'));
Vue.component("autocomplete-field", require('./components/AutocompleteField.vue'));

const purchaseApp = new Vue({
    el: "#purchase-app",

    data() {
        return {
            queue: [],
            purchase: {
                product: null,
                customer: null,
                quantity: null
            }
        }
    },

    methods: {
        setCustomer: function(customerObj) {
            this.purchase.customer = customerObj;
        },

        queuePurchase: function() {
            this.queue.push( this.purchase );
        }
    }
});

有人能解释一下什么&amp;为什么会这样?

推荐答案

push()方法应该向queue数组添加purchase个对象,但正如@FK82在他的 comments 中指出的,push()是向同一个purchase对象添加多个引用.这意味着,如果通过增加quantity来更改对象,则每个purchasequantity属性都将更新.

你可以在这里try 一下:

const exampleComponent = Vue.component("example-component", {
  name: "exampleComponent",
  template: "#example-component",
  data() {
    return {
      queue: [],
      purchase: {
        product: null,
        customer: null,
        quantity: null
      }
    };
  },
  methods: {
    queuePurchase() {
      this.queue.push( this.purchase );
    }
  }
});

const page = new Vue({
  name: "page",
  el: ".page",
  components: {
    "example-component": exampleComponent
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.min.js"></script>
<template id="example-component">
  <div>
    <p>The Queue has {{ this.queue.length }} items.</p>
    <input
      v-model="purchase.quantity"
      type="number"
      min="1"
      name="product"
      placeholder="Quantity"
    >
    <button @click="queuePurchase">
      Add to Queue
    </button>
    <pre>{{ JSON.stringify(this.queue, null, 2) }}</pre>
  </div>
</template>

<div class="page">
  <example-component></example-component>
</div>

try 使用Object.assign({}, this.purchase)或使用spread操作符创建一个浅拷贝,而不是对同一个purchase对象创建引用.下面是一个使用spread运算符,然后将副本复制到queue上的示例:

const exampleComponent = Vue.component("example-component", {
  name: "exampleComponent",
  template: "#example-component",
  data() {
    return {
      queue: [],
      purchase: {
        product: null,
        customer: null,
        quantity: null
      }
    };
  },
  methods: {
    queuePurchase() {
      this.queue.push({...this.purchase});
    }
  }
});

const page = new Vue({
  name: "page",
  el: ".page",
  components: {
    "example-component": exampleComponent
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.min.js"></script>
<template id="example-component">
  <div>
    <p>The Queue has {{ this.queue.length }} items.</p>
    <input
      v-model="purchase.quantity"
      type="number"
      min="1"
      name="product"
      placeholder="Quantity"
    >
    <button @click="queuePurchase">
      Add to Queue
    </button>
    <pre>{{ JSON.stringify(this.queue, null, 2) }}</pre>
  </div>
</template>

<div class="page">
  <example-component></example-component>
</div>

Vue.js相关问答推荐

Nuxt 3 I18N浏览器检测不起作用

Vue3外部数组的响应性

为什么 Pinia/Vuex 比使用服务类的classic 方法更受欢迎?

Vuetify 3 - NavBar 组件占据整个视口高度

何时将代码拆分为 Nuxt 中的组件?

如何在 A-La-Carte 系统中使用 vuetify 加载程序时导入 vuetify/lib

如果 Vuetify 自动完成没有匹配的结果,则保留输入的文本

我是否必须在 Vue 3 中使用 Composition API,还是仍然可以使用Vue 2的方式工作?

VuetifyJS:如何摆脱 v-stepper 组件的提升?

将props传递给设置时的VueJS 3组合API和TypeScript类型问题:类型上不存在属性 user用户

如何将Vue的主应用程序渲染到body元素?

如何修复跨域读取阻塞 (CORB) 阻止了 MIME 类型应用程序/json 的跨域响应问题?

Vuetify - 根据另一个 Select 选项过滤 Select 数据

在 VUE JS 的光标位置插入字符

我如何能够在 vue js html 中以给定格式进行多项 Select 和传递数据?

Vue在按钮单击时添加一个组件

使用 puppeteer 生成 PDF 而不保存

IOS在输入焦点上显示键盘

如何在 vuejs 中的基于类的组件中编写计算设置器

隐藏特定标题及其在 vuetify 数据表中的对应列