Vue.js добавить свойство к связанному объекту

#javascript #vue.js

#javascript #vue.js

Вопрос:

У меня есть список, подобный этому

 <div class="list-group entity-list">

   <a  v-for="entity in master.data"
       :class="['entity list-group-item', entity.selected ? 'selected' : '']"
       @click="itemselect(entity)"
   >
      @{{entity.name}}
   </a>
</div>
  

Список отображается так, как ожидалось. Связанный объект добавляется в качестве реквизита к внешнему компоненту, подобному этому.

 <my-compontent :entityname="customers" :master="{{json_encode($customers->toArray())}}" inline-template>
  

Как вы можете видеть, это должен быть список клиентов. Чтобы указать, выбран ли клиент, я хочу установить атрибут «выбранный» при нажатии. Однако, похоже, это не работает, если у связанного объекта по умолчанию нет свойства select.

 methods: {
    itemselect: function(item) {
        this.master.data.forEach(function(el) {
            el.selected = false;
        });

        item.selected = true;
    }
}
  

Показанный метод, похоже, не работает / не вызывает изменения

Ответ №1:

Если вы хотите изменить данные, передаваемые с помощью prop, то вам нужно скопировать их, vue выдаст предупреждение, если вы попытаетесь напрямую изменить prop. Я бы, вероятно, справился с этим, выполнив что-то вроде:

 new Vue({
  el: '#app',
  created() {
    // Assume this is passed in by a prop
      var myData = {master: {
        data: [{
          name: 'foo'
        }, {
          name: 'bar'
        }, {
          name: 'baz'
        }]
      }};

    // Copy data from prop
    myData.master.data.forEach(el => {
      var obj = {
        name: el.name,
        selected: false
      };

      this.master.data.push(obj);
    });
  },
  methods: {
    itemselect(item) {
      this.master.data.forEach(el => {
        // if this element is selected set to true      
        el['selected'] = (el.name == item.name);
      });
    }
  },
  data() {
    return {
      master: {
        data: []
      }
    }
  }
});
  

Я просто издевался над фактическими поступающими данными, но, очевидно, это добавило бы это в prop и передало бы его вашему компоненту как обычно. Вот jsFiddle:https://jsfiddle.net/xswtfkaf /

Ответ №2:

Вместо изменения ваших основных данных отслеживайте выбор в модели, используя $index предполагая, что вы не переупорядочиваете свои master.data

 <div class="list-group entity-list">
    <a  v-for="entity in master.data"
        :class="eClass[$index]"
        @click="itemselect($index)"
            >
        @{{entity.name}}
    </a>
</div>

methods: {
    itemselect: function(idx) {
        if ( 0 > this.selected.indexOf(idx) ) {
            this.selected.push(idx)
        }
    }
}
computed : {
    eClass : function () {
        var r=[];
        for (var i= 0;c=this.master.data[i];  i) {
            r[i] = {'selected': -1 < this.selected.indexOf(i),'entity list-group-item':true};
        }
        return r;
    }
}
  

если entity имеет уникальный идентификатор

 <div class="list-group entity-list">
    <a  v-for="entity in master.data"
        :class="eClass[entity.id]"
        @click="itemselect(entity.id)"
            >
        @{{entity.name}}
    </a>
</div>

methods: {
    itemselect: function(idx) {
        if ( 0 > this.selected.indexOf(idx) ) {
            this.selected.push(idx)
        }
    }
}
computed : {
    eClass : function () {
        var r={};
        for (var i= 0;c=this.master.data[i];  i) {
            r[c.id] = {'selected': -1 < this.selected.indexOf(c.id),'entity list-group-item':true};
        }
        return r;
    }
}