#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 Я расширил свой ответ, пожалуйста. взгляните.