Как получить значение после мутации в Vuex?
У меня простой Vuex
модуль для объекта глобальной даты:
import moment from 'moment';
const state = {
date: moment()
}
// getters
const getters = {
date: state => state.date,
daysInMonth: state => state.date.daysInMonth()
}
// mutations
const mutations = {
subtractOneDay(state) {
state.date.subtract(1, 'days');
}
}
export default {
state,
getters,
mutations
}
Один из моих дочерних компонентов:
import { mapGetters, mapMutations } from 'vuex';
export default {
computed: Object.assign(mapGetters(['date', 'daysInMonth']), {}),
methods: {
subtractOneDay() {
this.$store.commit('subtractOneDay');
console.log(this.date.format('YYYY-MM-DD'), this.date.daysInMonth(), this.daysInMonth)
}
},
created() {
console.log('blocks created')
},
mounted() {
console.log('blocks mounted')
}
}
В основном мне нужно получить дни месяца (29, 29, 30 или 31), когда date
изменено
Проблема в том, что вычисляемое свойство daysInMonth
не меняется...
1 ответ
Решение
Минутное subtract
метод мутирует указанный объект момента. Это проблема для Vue, потому что это означает ссылку на state.date
не изменился, и вычисленные свойства не будут повторно вычислять их значение.
Вы можете обойти это, используя момент clone
способ вернуть новый момент в subtractOneDay
метод.
Вот пример.
console.clear()
const store = new Vuex.Store({
state:{
date: moment()
},
getters:{
date: state => state.date,
daysInMonth: state => state.date.daysInMonth()
},
mutations: {
subtractOneDay(state) {
state.date = state.date.clone().subtract(1, 'days');
}
}
})
new Vue({
el: "#app",
store,
computed: Object.assign(Vuex.mapGetters(['date', 'daysInMonth']), {}),
methods:{
subtractOneDay(){
this.$store.commit('subtractOneDay');
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
{{date}}
<hr>
{{daysInMonth}}
<hr>
<button @click="subtractOneDay">Subtract 1 Day</button>
</div>