Как я помещаю элементы в массив в объекте данных в Vuejs?Вью, похоже, не смотрит метод .push () - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь добавить объекты в массив, который я объявил в объекте данных экземпляра Vue.Я могу установить значения в объекте покупки штата, но когда я помещаю данные в массив очереди заказов, пустой массив не заполняется.Функция запускается, но массив не обновляется.

Вот моя форма:

<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 );
        }
    }
});

Может кто-тообъясните пожалуйста, что и почему это происходит?

1 Ответ

0 голосов
/ 09 сентября 2018

Метод push() должен добавлять объекты purchase в массив queue, но, как указал @ FK82 в своем комментарии, push() добавляет несколько ссылок на один и тот же объект purchase. Это означает, что если вы измените объект, увеличив quantity, каждое свойство purchase quantity будет обновлено.

Вы можете попробовать это здесь:

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
  }
});


  
    The Queue has {{ this.queue.length }} items.
    
    
    {{ JSON.stringify(this.queue, null, 2) }}
<Пример-компонента> </ пример-компонента>

Вместо push() ссылки на тот же объект purchase, попробуйте создать поверхностную копию с помощью Object.assign({}, this.purchase) или с помощью оператора распространения. Вот пример, который использует оператор распространения, а затем push() копирует в 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
  }
});


  
    The Queue has {{ this.queue.length }} items.
    
    
    {{ JSON.stringify(this.queue, null, 2) }}
<Пример-компонента> </ пример-компонента>
...