Задать вопрос
alaskafx
@alaskafx
Не .do Frontend

Как из компонента обновлять объект в хранилище?

Задача: изменения с input(range) отправлять в разные ключ:значение в хранилище Vuex, но дело в том, что там было всё распределено по объектам, и input был не один.

Стэйт хранилища:

state: {
CarSetup: {
      wheels: 0,
      color: 0,
      sim: 0,
    },
}

Компонент с инпутами:

data(){
  return{
     rangeValues: {
        wheels: 0,
        color: 0,
        sim: 0
      },
  }
},

computed: {
    returnValue() {
      return { ...this.rangeValues };
    },
},

watch:{
    returnValue(newValue, oldValue) {
      if(newValue.wheels!= oldValue.wheels){
        this.$store.commit('setCarInfo', {to: 'wheels', value: newValue.wheels})
      }
      if(newValue.color!= oldValue.color){
        this.$store.commit('setCarInfo', {to: 'color', value: newValue.color})
      }
      if(newValue.sim!= oldValue.sim){
        this.$store.commit('setCarInfo', {to: 'sim', value: newValue.sim})
      }
    },
}

Мутация:

mutations: {
    setCarInfo(store, v){
      store.CarSetup[v.to] = v.value
    },
  },

Хочу узнать:
Является ли этот способ "не костылём"?
Есть ли способы лучше?
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Когда в хранилище появится новое свойство, будете вручную его добавлять в компонент? Хранилище доступно в data (если, конечно, не будете делать её стрелочной), так что можно просто скопировать объект; в наблюдателе вместо проверок конкретных свойств можно сделать цикл по всем:

rangeValues: { ...this.$store.state.CarSetup },

Object.entries(newValue).forEach(([ k, v ]) => {
  if (v !== oldValue[k]) {
    this.$store.commit('setCarInfo', { to: k, value: v });
  }
});


А вообще, не надо ни копии объекта из хранилища, ни наблюдателя. Вырезаете returnValue, свойство rangeValues из обычного делаете вычисляемым:

computed: {
  rangeValues() {
    return new Proxy(this.$store.state.carSetup, {
      set: (target, key, val) => {
        this.$store.commit('setCarInfo', { [key]: val });
        return true;
      },
    });
  },
},

Мутацию переписываете следующим образом:

setCarInfo: (state, payload) => Object.assign(state.carSetup, payload),
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы