如何将本地存储数据从一个页面持久化到另一个页面?
How can I persist local storage data from one page to another?
我几乎完成了我的第一个 Vue.js 应用程序,我需要做的最后一件事是保留我的本地存储数据,以便我可以在另一个页面上访问它。我举个例子。
目前,这些是我拥有的本地存储方法(以及一些不太相关的数据属性):
data() {
return {
testData: [],
testDataIndex: 0,
selectedIndex: null,
submittedIndex: null,
healthScore: 0,
}
},
computed: {
setHealthScore() {
localStorage.setItem('SavedHealthScore', this.healthScore)
},
getHealthScore() {
localStorage.getItem('SavedHealthScore')
},
},
这是一款健康测验应用。因此,在用户回答最后一个问题后,我希望将 he/she 带到最后一页(这会改变路线),以便可以 return 编辑“健康评分”。在整个测验过程中,健康分数会根据用户给出的答案增加一定的值。上面的计算方法成功地跟踪了健康评分并将其保存在本地存储中。也就是说,直到用户完成测验并到达最后一页。然后,本地存储中的健康评分返回到 0,因为这是原始健康评分恢复到的值。
我希望本地存储中的健康分数在返回到 0 之前保存原始健康分数的最后一个已知值。这样,我可以 return 本地存储中的健康分数显示到用户。现在,无论给出的答案如何,最终页面都只呈现 0/21,显然,这不是我想要的。
如何防止我的本地存储健康评分 return 回到 0?
P.S。我知道 Vuex 可能会解决这个问题,但现在了解本地存储对我来说比学习 Vuex 更重要。
下面是处理持久存储的一些选择,但是,您的代码中的问题是您的设置存储基于计算 属性。卸载组件的那一刻,计算的 属性 将恢复为默认值,在您的情况下为 0。如果您将默认分数从 0 更改为 1 并刷新您的应用程序,您会看到它的实际效果,您会注意到本地存储在测试后恢复为 1。
编辑: 添加评论答案以获取更多信息。
您可以将它移动到一个按钮,点击可能是在保存或提交时,或者如果您真的想让它保持计算状态,甚至可以在计算中添加一些逻辑。
if(this.healthScore != 0) {
localStorag.setItem(this.healthScore)
}
您的检索需要从 localStorage 获取并分配回局部变量
getHealthScore() {
this.healthScore = localStorage.getItem('SavedHealthScore')
},
这样它只会在测试分数不为 0 时设置本地存储。
您需要从不同的事件调用集合存储,而不是从计算的 属性。或者你需要添加逻辑来防止计算总是保存到本地存储
(你已经知道了,但我还是会告诉你,以防有帮助)
持久存储选择:
1) 你使用浏览器 localStorage
并在那里存储信息,这些信息将一直存在,直到用户清除他们的浏览器,但是,在你的情况下你可能想要考虑 sessionStorage
,因为当他们离开您的应用程序时它会清除。不需要为这些安装任何 NPM 包,因为它们已经可用。下面的代码片段,如果你想创建一个方法,如果你想使用 Session 而不是只需将 localStorage
更改为 sessionStorage
和 viola.
**
* Adds an item to Storage
* @param key The Key value
* @param value The String Value to be Stored
*/
export function AddToStorage(key: string, value: string): any {
localStorage.setItem(key, value);
}
2) 另一个稍微复杂一点但你会在中大型项目中看到的选择是 Vuex
这是 Vue 在过渡时处理状态的方式应用程序。它的设置有点复杂,对于你已经快完成的项目来说有点过分了,但如果你想尝试一下,这将是一个很好的机会。
您不应使用计算方法在每个组件内部的本地存储中设置值。当值未定义或更改时,在本地存储中设置值的更好方法。代码片段如下:
let healthScore = localStorage.getItem("healthScore");
if(healthScore == undefined) {
localStorage.setItem("healthScore");
}
您应该首先检查本地存储中是否分配了任何值。如果没有,则分配默认值,在您的情况下将值设置为 0。
我几乎完成了我的第一个 Vue.js 应用程序,我需要做的最后一件事是保留我的本地存储数据,以便我可以在另一个页面上访问它。我举个例子。
目前,这些是我拥有的本地存储方法(以及一些不太相关的数据属性):
data() {
return {
testData: [],
testDataIndex: 0,
selectedIndex: null,
submittedIndex: null,
healthScore: 0,
}
},
computed: {
setHealthScore() {
localStorage.setItem('SavedHealthScore', this.healthScore)
},
getHealthScore() {
localStorage.getItem('SavedHealthScore')
},
},
这是一款健康测验应用。因此,在用户回答最后一个问题后,我希望将 he/she 带到最后一页(这会改变路线),以便可以 return 编辑“健康评分”。在整个测验过程中,健康分数会根据用户给出的答案增加一定的值。上面的计算方法成功地跟踪了健康评分并将其保存在本地存储中。也就是说,直到用户完成测验并到达最后一页。然后,本地存储中的健康评分返回到 0,因为这是原始健康评分恢复到的值。
我希望本地存储中的健康分数在返回到 0 之前保存原始健康分数的最后一个已知值。这样,我可以 return 本地存储中的健康分数显示到用户。现在,无论给出的答案如何,最终页面都只呈现 0/21,显然,这不是我想要的。
如何防止我的本地存储健康评分 return 回到 0?
P.S。我知道 Vuex 可能会解决这个问题,但现在了解本地存储对我来说比学习 Vuex 更重要。
下面是处理持久存储的一些选择,但是,您的代码中的问题是您的设置存储基于计算 属性。卸载组件的那一刻,计算的 属性 将恢复为默认值,在您的情况下为 0。如果您将默认分数从 0 更改为 1 并刷新您的应用程序,您会看到它的实际效果,您会注意到本地存储在测试后恢复为 1。
编辑: 添加评论答案以获取更多信息。
您可以将它移动到一个按钮,点击可能是在保存或提交时,或者如果您真的想让它保持计算状态,甚至可以在计算中添加一些逻辑。
if(this.healthScore != 0) {
localStorag.setItem(this.healthScore)
}
您的检索需要从 localStorage 获取并分配回局部变量
getHealthScore() {
this.healthScore = localStorage.getItem('SavedHealthScore')
},
这样它只会在测试分数不为 0 时设置本地存储。
您需要从不同的事件调用集合存储,而不是从计算的 属性。或者你需要添加逻辑来防止计算总是保存到本地存储
(你已经知道了,但我还是会告诉你,以防有帮助)
持久存储选择:
1) 你使用浏览器 localStorage
并在那里存储信息,这些信息将一直存在,直到用户清除他们的浏览器,但是,在你的情况下你可能想要考虑 sessionStorage
,因为当他们离开您的应用程序时它会清除。不需要为这些安装任何 NPM 包,因为它们已经可用。下面的代码片段,如果你想创建一个方法,如果你想使用 Session 而不是只需将 localStorage
更改为 sessionStorage
和 viola.
**
* Adds an item to Storage
* @param key The Key value
* @param value The String Value to be Stored
*/
export function AddToStorage(key: string, value: string): any {
localStorage.setItem(key, value);
}
2) 另一个稍微复杂一点但你会在中大型项目中看到的选择是 Vuex
这是 Vue 在过渡时处理状态的方式应用程序。它的设置有点复杂,对于你已经快完成的项目来说有点过分了,但如果你想尝试一下,这将是一个很好的机会。
您不应使用计算方法在每个组件内部的本地存储中设置值。当值未定义或更改时,在本地存储中设置值的更好方法。代码片段如下:
let healthScore = localStorage.getItem("healthScore");
if(healthScore == undefined) {
localStorage.setItem("healthScore");
}
您应该首先检查本地存储中是否分配了任何值。如果没有,则分配默认值,在您的情况下将值设置为 0。