localStorage
在创建应用程序、扩展、文档和各种用例的体验方面,可以成为一个非常有用的工具。 我本人在每个方面都使用过它! 在存储用户一些不需要永久保留的小数据时,localStorage
是我们的好帮手。 让我们将 localStorage
与 Vue 配合使用,我个人觉得它是一种很棒且易于阅读的开发体验。
简化示例
我最近教了一门前端大师课程,我们用 Nuxt 从头到尾构建了一个应用程序。 我一直在寻找一种方法,让我们可以将构建应用程序的方式分解成更小的部分,并随着我们的进行逐一检查,因为我们需要涵盖很多内容。 localStorage
是一个解决方案,因为每个人都在个人跟踪自己的进度,而且我不需要将所有这些信息存储在 AWS 或 Azure 之类的服务中。
这是我们最终要构建的东西,一个简单的待办事项列表
存储数据
我们首先建立我们需要的用于所有元素的数据,这些元素可能是我们想要检查的,以及一个用于用户将要检查的任何内容的空数组。
export default {
data() {
return {
checked: [],
todos: [
"Set up nuxt.config.js",
"Create Pages",
// ...
]
}
}
}
我们还将在模板标签中将其输出到页面
<div id="app">
<fieldset>
<legend>
What we're building
</legend>
<div v-for="todo in todos" :key="todo">
<input
type="checkbox"
name="todo"
:id="todo"
:value="todo"
v-model="checked"
/>
<label :for="todo">{{ todo }}</label>
</div>
</fieldset>
</div>
挂载和监视
目前,我们正在响应 UI 的更改,但还没有将它们存储在任何地方。 为了存储它们,我们需要告诉 localStorage
,“嘿,我们有兴趣与你合作。” 然后,我们还需要挂钩到 Vue 的响应性来更新这些更改。 组件挂载后,我们将使用 mounted
钩子来选择待办事项列表中的已选中项目,然后将它们解析为 JSON,以便我们能够将数据存储在 localStorage
中
mounted() {
this.checked = JSON.parse(localStorage.getItem("checked")) || []
}
现在,我们将监视 checked
属性的更改,如果任何内容调整,我们也将更新 localStorage
!
watch: {
checked(newValue, oldValue) {
localStorage.setItem("checked", JSON.stringify(newValue));
}
}
就是这样!
实际上,对于这个示例,我们只需要这些。 这仅仅展示了一个很小的用例,但你可以想象我们可以如何使用 localStorage
为网络上的许多高性能和个性化体验!
所有复选框都绑定到同一个 v-model,所以点击一个框就会选中所有框。
我没有看到这种情况 - 如果你在调试窗口中检查演示:https://cdpn.io/sdras/debug/JjXdNrO 然后转到 Chrome DevTools 中的“应用程序”选项卡,然后是“本地存储”,你就可以看到它们正在正确更新。 但是,如果你可以复制其他情况,请告诉我! 我很乐意看到它。 谢谢!
嗨,很棒的小教程! 我刚刚发现了一个小问题:如果用户最初在 localStorage 中没有
checked
,那么在挂载时,他读取checked
为null
,这将被解析为false
,导致出现一个错误的行为,即勾选一个复选框会选中所有复选框。 一个快速修复是,在从 localStorage 读取时回退到空数组。谢谢! 已更新
对于 Composition API 用户来说,有很多选项可以简化操作:一些工作几乎就像 ref() 替换 以及 其他一些已经处理了跨标签同步数据。
我最近写了一个基于 LocalStorage 和 Vue 的完整 CMS/DB 系统。 可惜它还没有发布,因为 UI 工具包目前处于封闭状态。 :(
https://cocktailcms.com/
喜欢它。 谢谢! 一个很好的入门,可以了解如何使用它
在写入本地存储之前,你可能应该先检查一下是否可行,因为配额可能已满,或者浏览器是在私密浏览模式下的 Safari。
我最近发现,在使用 jest 进行测试时,localStorage 本身并不存在,必须进行模拟。
https://github.com/d-kochanzhi/LocalStorageAdapter
不错的教程。 或许值得一提的是使用 localStorage 的安全问题,以及考虑重新措辞“在存储用户一些不需要永久保留的小数据时,localStorage 是我们的好帮手。” 实际上,localStorage 会在会话结束后很久才被清除,除非你手动清除它。 这可能会让新开发人员产生误解,尤其是在他们开始将 JWT 存储在 localStorage 中时 - 在这种情况下,他们会希望使用在浏览器选项卡或窗口关闭后终止的 sessionStorage。 否则,我真的很喜欢你的写作。 尤其是在 CSS 和 SVG 方面的见解。