Ошибка действий / мутаций VueX в консоли Chrome

#vue.js #vuex #vuetify.js #nuxt.js

#vue.js #vuex #vuetify.js #nuxt.js

Вопрос:

Я пытаюсь сохранить данные ящика в VueX, чтобы использовать их на внешнем компоненте.

Ошибка моей консоли: [vuex] unknown action type: app/switchDrawer

Мой шаблон VueJS:

страницы/test.vue

 <template>
  <v-navigation-drawer v-model="drawer" app>
    <v-list dense>
      ...
    </v-list>
  </v-navigation-drawer>
</template>

<script>
export default {
  computed: {
    drawer: {
      get () {
        return this.$store.state.app.drawer
      },
      set (value) {
        console.log(value);
        return this.$store.dispatch('app/toggleDrawer', value)
      }
    }
  }
}
</script>
  

Функция console.log () выдает мне много строк в цикле в консоли.

Я бы тоже хотел использовать класс mapGetters из VueX вместо вычисляемого get / set:

 computed: mapGetters({
  drawer: 'app/drawer'
})
  

У меня ошибка в консоли:

[Предупреждение Vue]: вычисленное свойство «drawer» было присвоено, но у него нет установщика.

Мой магазин VueX:

store/app.js

 export const state = () => ({
  drawer: true
})

export const getters = {
  drawer: state => state.drawer
}

export const mutations = {
  TOGGLE_DRAWER: (state) => {
    state.drawer = !state.drawer
  }
}

export const actions = {
  toggleDrawer ({ commit }, value) {
    commit('TOGGLE_DRAWER', value)
  }
}
  

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

1. Являются ли ваши модули namespaced ? Если нет, то сопоставление работает немного по-другому computed: { ...mapState({ drawer: state => state.FilenameOfYourModule.drawer })} . Другой проблемой может быть различное присвоение имен вашим мутациям и получателям — я называю их точно так же — но, в конце концов, это всего лишь предупреждение.

2. @Hexodus С помощью этого метода я получаю эту ошибку: Computed property "drawer" was assigned to but it has no setter.

3. Что ж, моя ошибка, ее нельзя использовать для двусторонней привязки — упустили из виду, что вам тоже нужен сеттер.

Ответ №1:

В СЛУЧАЕ, ЕСЛИ ВЫ НЕ ХОТИТЕ СОЗДАВАТЬ НОВУЮ МУТАЦИЮ И ОБРАБАТЫВАТЬ ЛОКАЛЬНО. (что я предпочел лично, поскольку мой магазин уже довольно большой)

Столкнулся с аналогичной проблемой при использовании библиотеки vue-ui (vuesax)

Решена путем инициализации новой data переменной в computed переменную (ту, что из хранилища) в созданном хуке (почему в created хуке)

    created() {
      this.localDrawer = this.drawer
   },
   data() {
      return {
         localDrawer: ''
      }
   },
   computed: {
      ...mapGetters({
         drawer: 'drawer'
      })
   },
   watch: {
      drawer(newValue, oldValue) {
         this.localDrawer = newValue
      }
   }
  

Теперь используйте localDrawer в приложении you.
ПРИМЕЧАНИЕ: я также наблюдаю за переменной drawer. Так что в любом случае, если его значение изменяется, оно отражается.

Ответ №2:

Найдена ваша проблема — у вычисляемого установщика не должно быть оператора return.

  drawer: {
      get () {
        return this.$store.state.app.drawer
      },
      set (value) {
        this.$store.dispatch('app/toggleDrawer', value)
      }
    }
  

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

 export const mutations = {
  SET_DRAWER: (state, value) => {
    state.drawer = value
  }
}

export const actions = {
  toggleDrawer ({ commit }, value) {
    commit('SET_DRAWER', value)
  }
}
  

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

1. С этим кодом у меня цикл, и я не знаю почему…

2. @pirmax Я расширил свой ответ, пожалуйста. взгляните.