В одностраничном приложении Vue, если вы нажмете «Обновить» на определенной странице определенного маршрута, информация о состоянии страницы может быть потеряна после обновления. Что нужно делать в это время? Если у вас также есть это сомнение, эта статья может помочь вам
1. Проблемы
Теперь в продукте есть требование: одностраничное приложение переходит на определенную страницу, а затем нажимает обновить, обновленная страница должна соответствовать странице до обновления.
На данный момент нам нужно сохранить состояние страницы перед обновлением.
Во-вторых, решение
В этом одностраничном приложении Vue Ван Эр использует Vuex для управления состоянием.В начале идея Ван Эра заключалась в том, чтобы синхронизировать данные в Vuex с localStorage.
То есть: как только данные в vuex будут изменены, он сработаетlocalStorage.setItem
метод, обратитесь к следующему коду:
import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)
function storeLocalStore (state) {
window.localStorage.setItem("userMsg",JSON.stringify(state));
}
export default new Vuex.Store({
state: {
username: "王二",
schedulename: "标题",
scheduleid: 0,
},
mutations: {
storeUsername (state,name) {
state.username = name
storeLocalStore (state)
},
storeSchedulename (state,name) {
state.schedulename = name
storeLocalStore (state)
},
storeScheduleid (state,id) {
state.scheduleid = Number(id)
storeLocalStore (state)
},
}
})
Затем, когда страница загружается, данные извлекаются из localStorage и помещаются в vuex, поэтому Ван Эр находится вApp.vue
изcreated
В функции ловушки написан следующий код:
localStorage.getItem("userMsg") && this.$store.replaceState(JSON.parse(localStorage.getItem("userMsg")));
//考虑到第一次加载项目时localStorage里没有userMsg的信息,所以在前面要先做判断
Это позволит решить проблему более удовлетворительно.
3. Другое решение
Приведенное выше решение связано с частым срабатываниемlocalStorage.setItem
метод, поэтому он очень недружелюбен к производительности. И если вы продолжите синхронизировать данные в vuex с localStorage, мы можем напрямую использовать localStorage для управления состоянием, и кажется, что нет необходимости снова использовать vuex.
В это время Ван Эр подумал, что если есть какой-либо способ отслеживать событие обновления страницы, а затем сохранять данные в Vuex в localStorage в этом методе мониторинга, это было бы здорово.
К счастью, есть такое событие слушателя, мы можем использоватьbeforeunload
Для достижения вышеуказанной цели Ван Эр вApp.vue
изcreated
В функции ловушки написан следующий код:
//在页面加载时读取localStorage里的状态信息
localStorage.getItem("userMsg") && this.$store.replaceState(JSON.parse(localStorage.getItem("userMsg")));
//在页面刷新时将vuex里的信息保存到localStorage里
window.addEventListener("beforeunload",()=>{
localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
})
Таким образом, это кажется идеальным.
Добавлено 27 марта 2018 г.:
Когда Ван Эр использовал вышеуказанный метод, он столкнулся с проблемой, а именно: на этапе разработки,Если в Vuex добавляется новое поле, новое поле нельзя сохранить в localStorage., поэтому приведенный выше код изменяется следующим образом:
//在页面加载时读取localStorage里的状态信息
localStorage.getItem("userMsg") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("userMsg"))));
//在页面刷新时将vuex里的信息保存到localStorage里
window.addEventListener("beforeunload",()=>{
localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
})
Оригинальный адрес:Личный сайт Ван Юлюэ