VueJS 2.0 Циклирование компонентов и изменение реквизита

#javascript #vue.js

#javascript #vue.js

Вопрос:

Я пытаюсь выяснить, каков наилучший способ обработки компонентов цикла. Вот несколько примеров кода.

Это своего рода то, что я пытаюсь сделать. Мой основной компонент содержит данные о платежах, которые зацикливаются на дочерних компонентах.

 <tr v-for="payment in payments"
is="component-payment-item"
:payment="payment
v-on:toggleReported="togglePaymentReported"">
 </tr>
  

Мой дочерний компонент, когда он хочет пометить платеж как сообщенный, просто отправляет событие. Который фиксирует родительский компонент. Итак, в родительском компоненте я пробую это.

 togglePaymentReported(payment) {
    payment.reported = ! payment.reported;
}
  

Я точно знаю, что это срабатывает, однако это изменение никогда не возвращается к дочернему компоненту. Я не знаю, лучший ли это способ справиться с этим. Другой способ, которым я думал, — это действительно найти этот платеж в массиве и изменить его таким образом, но я полагал, что он будет передан по ссылке и распространится на дочерний компонент.

В vue 1.0 я бы просто изменил его на дочернем компоненте самостоятельно. Я знаю, что это не одобряется и просто невозможно в vue2.0. Какова наилучшая практика здесь?

Ответ №1:

Вам необходимо передать текущий платеж вашему togglePaymentReported методу, чтобы он получил его в качестве аргумента.

 pb = Vue.extend({
  template: '#paybutton-template',
  props: ['payment'],
  methods: {
    toggle: function() {
      this.$emit('toggle');
    }
  }
});

vm = new Vue({
  el: '#app',
  components: {
    'payment-button': pb
  },
  data: {
    payments: []
  },
  methods: {
    handleToggle: function(payment) {
      payment.paid = !payment.paid;
    }
  },
  mounted: function() {
    // Simulating setting from ajax
    setTimeout(() => {
      this.payments = [{
        id: 1,
        paid: false
      }, {
        id: 2,
        paid: false
      }];
    }, 800);
  }
});  
 <script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.0.1/vue.min.js"></script>
<div id="app">
  <payment-button v-for="payment in payments" :payment="payment" v-on:toggle="handleToggle(payment)"></payment-button>
</div>

<template id="paybutton-template">
  <div>
    {{payment.id}}: {{payment.paid}}
    <button @click="toggle">Pay</button>
  </div>
</template>  

Комментарии:

1. Он по-прежнему не обновляет пользовательский интерфейс компонента элемента моего платежа. Единственное различие, которое я действительно вижу в моем и вашем, заключается в том, что мой v-for находится в том же элементе, что и мой компонент. Я не знаю, почему это имело бы значение. Я вижу, как это меняется в инструментах разработки vue.

2. Может быть, это потому, что мои платежи поступают из запроса ajax?

3. @mikelbring Я обновил свой пример, чтобы поместить v-for в тег компонента. До тех пор, пока вы объявили платежи в своем data , установка их значений с помощью запроса ajax не должна быть проблемой. Также имитируется значение настройки через ajax.