#vue.js #vuex
#vue.js #вуэкс #vuex
Вопрос:
Я динамически добавляю несколько атрибутов к объектам в массиве в хранилище vuex. Я наблюдаю за изменением состояния, и как только оно изменилось, я запускаю метод, который добавит атрибуты по мере необходимости.
watch: {
todayMeetings(newMeetingList, oldMeetingList) {
//alert();
this.addLine(newMeetingList);
}
}
addLine(newMeetingList) {
var isFirst = true;
for (var meeting of newMeetingList) {
var nowTime = new Date();
var meetingTime = new Date(meeting.meetingTime);
if ((nowTime.getTime() < meetingTime) amp;amp; isFirst) {
meeting.isLine = true;
meeting.isLast = false;
isFirst = false;
} else {
meeting.isLine = false;
meeting.isLast = false;
}
}
if (isFirst) {
newMeetingList[newMeetingList.length - 1].isLast = true;
}
},
Все это работает нормально , и я вижу изменения в </template>
. Но мне нужно запускать метод AddLine() каждые 5 секунд. Поэтому я использовал его внутри функции setInterval следующим образом,
setInterval(function () {
console.log('Mounted');
this.addLine(this.storeMeetings);
}.bind(this), 5000);
Я назвал его смонтированным внутри, но он не обновляет хранилище, как я ожидал.
мой полный сценарий выглядит следующим образом,
<script>
import { mapState, mapActions, setState } from 'vuex';
import todayMeetingItem from './todayMeetingItem.vue';
import todayMeeting from './todayMeeting.vue';
import { BIcon, BIconCalendar3, BIconChevronLeft, BIconChevronRight } from 'bootstrap-vue';
export default {
props: ['selectedPartner'],
components: {
todayMeetingItem,
BIcon,
BIconCalendar3,
BIconChevronLeft,
BIconChevronRight,
},
data() {
return {
organizationId:'',
today: new Date(),
todaymeeting:[],
}
},
methods: {
createMeetingEmit() {
this.$emit('createMeetingEmit');
},
...mapActions('meeting', [
'getTodayMeeting'
]),
deleteMeeting(meeting) {
this.$emit('meetingWasDelete', meeting);
},
addLine(newMeetingList) {
var isFirst = true;
for (var meeting of newMeetingList) {
var nowTime = new Date();
var meetingTime = new Date(meeting.meetingTime);
if ((nowTime.getTime() < meetingTime) amp;amp; isFirst) {
meeting.isLine = true;
meeting.isLast = false;
isFirst = false;
} else {
meeting.isLine = false;
meeting.isLast = false;
}
}
if (isFirst) {
newMeetingList[newMeetingList.length - 1].isLast = true;
}
console.log('newMeetingList');
console.log(newMeetingList);
this.$store.commit('setTodayMeetings', this.storeMeetings);
console.log(this.storeMeetings);
console.log('this.storeMeetings');
},
},
computed: {
...mapState({
storeMeetings: state => state.meeting.todayMeetings
}),
...mapState({
storeUpcomingMeetings: state => state.meeting.upcomingMeetings
}),
...mapState({
mettingLoading: state => state.meeting.meetingLoading
}),
todayMeetings() {
return this.storeMeetings
}
},
mounted: function () {
this.organizationId = JSON.parse(localStorage.getItem('organizationId'));
this.getTodayMeeting(this.organizationId);
//this.addLine(this.storeMeetings);
setInterval(function () {
console.log('Mounted');
this.addLine(this.storeMeetings);
}.bind(this), 5000);
},
watch: {
todayMeetings(newMeetingList, oldMeetingList) {
//alert();
this.addLine(newMeetingList);
}
}
}
</script>
Комментарии:
1. Очень сложно определить, что вы ожидаете, что произойдет в сравнении с тем, что происходит на самом деле, просто взглянув на этот код, но я могу вам точно сказать, что если вы настроите свое хранилище на использование строгого режима , вы увидите много предупреждений об изменении состояния вне мутации
Ответ №1:
Я надеюсь, что вы найдете мой ответ полезным. Если я вас правильно понял, вы пытаетесь изменить хранилище, но оно не работает?
Короткий ответ
используйте свой метод addLine
только тогда, когда значение хранилища изменяется с watch
Несколько кратких замечаний:
- избегайте изменения состояния компонентов
- избегайте отображения состояния, вместо этого используйте средства получения состояния
- не очень хорошая идея иметь интервал только для обновления шаблона на основе значений из хранилища. Есть способ выполнить вычисление при изменении состояния машины (хранилища)
PS: Я свободен в течение 15 минут, чтобы мы могли выполнить программу сопряжения по этому вопросу.