Vue.js入门系列(十八):利用浏览器本地存储实现TodoList数据持久化

news2024/9/22 13:34:15

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

      • Vue.js入门系列(十八):利用浏览器本地存储实现TodoList数据持久化
        • 引言
      • 一、浏览器本地存储
        • 1.1 什么是本地存储?
        • 1.2 本地存储的基本操作
      • 二、TodoList应用中实现本地存储
        • 2.1 保存任务列表到本地存储
        • 2.2 从本地存储加载任务列表
      • 三、完整的TodoList应用示例
      • 四、总结
        • 4.1 关键点回顾
        • 4.2 进一步的扩展

Vue.js入门系列(十八):利用浏览器本地存储实现TodoList数据持久化

引言

在前面的博客中,我们构建了一个功能齐全的TodoList应用。然而,这个应用的一个主要缺点是它的数据在页面刷新后会丢失。为了解决这个问题,我们可以利用浏览器的本地存储功能来保存用户的任务列表,从而实现数据的持久化。在本篇博客中,我们将首先介绍Vue.js中如何使用浏览器的本地存储,然后将这一功能集成到我们的TodoList应用中。


一、浏览器本地存储

1.1 什么是本地存储?

本地存储(LocalStorage)是浏览器提供的一种持久化存储机制,允许你将数据以键值对的形式保存在浏览器中,且数据不会随浏览器关闭而丢失。它的特点是:

  • 持久化:数据存储在浏览器中,除非被手动删除,否则不会丢失。
  • 容量:本地存储的容量通常在5MB左右,足够存储较小的数据集。
  • 简单易用:通过简单的API即可实现数据的存储、读取和删除操作。
1.2 本地存储的基本操作

本地存储提供了localStorage对象,用于在客户端存储数据。常用的方法包括:

  • setItem(key, value):存储数据,以键值对的形式保存。
  • getItem(key):读取数据,通过键名获取对应的值。
  • removeItem(key):删除数据,通过键名删除对应的键值对。
  • clear():清空所有本地存储的数据。
// 存储数据
localStorage.setItem('username', 'JohnDoe');

// 读取数据
const username = localStorage.getItem('username');
console.log(username); // 输出: JohnDoe

// 删除数据
localStorage.removeItem('username');

// 清空所有数据
localStorage.clear();

在实际应用中,数据通常以字符串的形式存储在本地存储中,如果要存储复杂的数据结构(如对象或数组),需要使用JSON.stringify将其转换为字符串,在读取时使用JSON.parse将其转换回原来的数据结构。


二、TodoList应用中实现本地存储

2.1 保存任务列表到本地存储

为了使TodoList中的任务在页面刷新后仍然存在,我们可以在任务列表发生变化时将其保存到本地存储中。

methods: {
  saveTasks() {
    localStorage.setItem('tasks', JSON.stringify(this.tasks));
  }
}

我们将这个saveTasks方法绑定到任务列表的增删改操作中,每次对任务列表进行修改时,都会自动保存到本地存储。

methods: {
  addTask() {
    if (this.newTask.trim() !== '') {
      this.tasks.push({
        id: this.tasks.length + 1,
        text: this.newTask,
        completed: false
      });
      this.newTask = '';
      this.saveTasks();
    }
  },
  removeTask(task) {
    this.tasks = this.tasks.filter(t => t.id !== task.id);
    this.saveTasks();
  },
  toggleTask(task) {
    task.completed = !task.completed;
    this.saveTasks();
  }
}
2.2 从本地存储加载任务列表

在应用启动时,我们希望能够从本地存储中读取之前保存的任务列表,并初始化应用的数据状态。我们可以在Vue实例的created生命周期钩子中实现这一功能。

created() {
  const savedTasks = localStorage.getItem('tasks');
  if (savedTasks) {
    this.tasks = JSON.parse(savedTasks);
  }
}

通过这个方法,每次页面加载时,应用会从本地存储中读取任务列表并进行初始化。


三、完整的TodoList应用示例

<div id="app">
  <div class="todo-list">
    <h1>My Todo List</h1>
    <input type="text" v-model="newTask" placeholder="Add a new task" @keyup.enter="addTask" />
    <ul>
      <li v-for="task in tasks" :key="task.id">
        <input type="checkbox" :checked="task.completed" @change="toggleTask(task)" />
        <span :class="{ completed: task.completed }">{{ task.text }}</span>
        <button @click="removeTask(task)">Delete</button>
      </li>
    </ul>
    <div class="todo-footer">
      <input type="checkbox" v-model="allCompleted" @change="toggleAllTasks" /> Toggle All
      <p>{{ remainingTasks }} tasks remaining</p>
    </div>
  </div>
</div>
new Vue({
  el: '#app',
  data: {
    newTask: '',
    tasks: []
  },
  computed: {
    remainingTasks() {
      return this.tasks.filter(task => !task.completed).length;
    },
    allCompleted: {
      get() {
        return this.tasks.length > 0 && this.tasks.every(task => task.completed);
      },
      set(value) {
        this.tasks.forEach(task => {
          task.completed = value;
        });
        this.saveTasks();
      }
    }
  },
  methods: {
    addTask() {
      if (this.newTask.trim() !== '') {
        this.tasks.push({
          id: this.tasks.length + 1,
          text: this.newTask,
          completed: false
        });
        this.newTask = '';
        this.saveTasks();
      }
    },
    removeTask(task) {
      this.tasks = this.tasks.filter(t => t.id !== task.id);
      this.saveTasks();
    },
    toggleTask(task) {
      task.completed = !task.completed;
      this.saveTasks();
    },
    toggleAllTasks() {
      this.allCompleted = !this.allCompleted;
    },
    saveTasks() {
      localStorage.setItem('tasks', JSON.stringify(this.tasks));
    }
  },
  created() {
    const savedTasks = localStorage.getItem('tasks');
    if (savedTasks) {
      this.tasks = JSON.parse(savedTasks);
    }
  }
});

四、总结

通过在TodoList应用中集成本地存储功能,我们使得应用的数据在页面刷新或关闭后仍能保持。这不仅提升了用户体验,还展示了如何使用浏览器提供的API来增强Vue.js应用的功能。

4.1 关键点回顾
  • 本地存储的使用:通过localStorage对象的setItemgetItem等方法,能够轻松地将数据保存到本地,并在页面加载时恢复数据。
  • 数据持久化:通过在Vue实例的生命周期钩子中加载和保存数据,实现数据的持久化,确保用户的操作不会因页面刷新而丢失。
  • Vue.js的实用性:通过这个案例,我们进一步体会了Vue.js的灵活性和强大功能,特别是在处理用户交互和数据管理方面。
4.2 进一步的扩展

你可以继续扩展这个TodoList应用,比如:

  • 同步到云端:将本地数据同步到云端,以便用户可以跨设备访问。
  • 增加分类标签:为每个任务添加分类标签,并允许用户按标签筛选任务。
  • 高级搜索功能:允许用户在任务列表中搜索特定任务。

通过这篇博客,我们学习了如何在Vue.js中使用浏览器的本地存储API,并将其集成到TodoList应用中,以实现数据持久化。在接下来的博客中,我们将继续探讨Vue.js的更多高级功能和实践。如果你有任何疑问或建议,欢迎在评论区留言。感谢你的阅读,期待在下一篇博客中继续与你分享更多的Vue.js开发技巧与经验!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python的机器学习系列(17):梯度提升回归(Gradient Boosting Regression)

简介 梯度提升&#xff08;Gradient Boosting&#xff09;是一种强大的集成学习方法&#xff0c;类似于AdaBoost&#xff0c;但与其不同的是&#xff0c;梯度提升通过在每一步添加新的预测器来减少前一步预测器的残差。这种方法通过逐步改进模型&#xff0c;能够有效提高预测准…

欧洲游戏市场的文化和语言特征

欧洲游戏市场是一个由无数文化和语言特征塑造的丰富多样的景观。作为世界上最大、最多样化的游戏地区之一&#xff0c;欧洲为旨在创造与广大受众产生共鸣的内容的开发者带来了独特的挑战和机遇。 欧洲市场最引人注目的方面之一是语言的多样性。欧盟有24种官方语言和众多地区方…

开源软件指南

目录 什么是开源软件 开源软件的历史和哲学 什么是开源许可证 开源许可证的类型 ​编辑 开源合规性 版权和知识产权合规性 安全合规性 什么是开源软件政策 开源软件安全 库存和软件物料清单(SBOM) 依赖项更新 开源漏洞扫描 二进制存储库管理器 开源软件的当前趋势…

C#语言实现最小二乘法算法

最小二乘法&#xff08;Least Squares Method&#xff09;是一种常用的拟合方法&#xff0c;用于在数据点之间找到最佳的直线&#xff08;或其他函数&#xff09;拟合。以下是一个用C#实现简单线性回归&#xff08;即一元最小二乘法&#xff09;的示例代码。 1. 最小二乘法简介…

【kubernetes】金丝雀部署

概念&#xff1a; 金丝雀发布&#xff08;又称灰度发布、灰度更新&#xff09;&#xff1a;金丝雀发布一般先发1台&#xff0c;或者一个小比例&#xff0c;例如2%的服务器&#xff0c;主要做流量验证用&#xff0c;也称为金丝雀 (Canary) 测试 &#xff08;国内常称灰度测试&a…

一文读懂Linux用户密码管理

目录 前言1. 基本知识2. 命令行 前言 作为全栈人员&#xff0c;对于Linux的账号密码管理也要熟知 下述文章直奔主题&#xff0c;直接讲解知识点 1. 基本知识 修改密码、查看密码哈希值、管理密码到期时间等 用户的密码和相关信息主要存储在两个文件中&#xff1a; /etc/pa…

随笔九、SARADC按键程控测试

目录 1. 泰山派环境 2. 按键3分析 3. 编程测试 1. 泰山派环境 泰山派开发板上有3个按键 按键1是电源按键PWRON&#xff0c;实测按几下会导致开发板重启 按键2是复位按键RESET&#xff0c;按下立马复位重启 按键3是升级按键RECOVER&#xff0c;配合RESET按键可以使开发板进…

现在做项目不看能力!

有人还在执着于能力&#xff0c;但当你多接触一些高手之后&#xff0c;你会发现他们想问题想得很透彻&#xff0c;什么能力&#xff0c;其实不重要。能力是辅助的&#xff0c;在互联网赚钱机会是更重要的&#xff0c;能力不是重点&#xff0c;优先的是执行力。执行力才是第一生…

泛微E9开发 获取浏览按钮的显示值

获取浏览按钮的显示值 1、显示效果2、实现方法3、标准API3.1.获取浏览按钮的显示值3.1.1.格式3.1.2.参数说明3.1.3.案例 3.2. 获取选择框字段的显示值3.2.1.获取选择框字段的显示值3.2.2.格式3.2.3.参数说明3.2.4.案例 1、显示效果 2、实现方法 <script>debugger;var tb…

IO练习:用信号实现司机和售票员问题

【1】问题描述 1&#xff09;售票员捕捉SIGINT&#xff08;代表开车&#xff09;信号&#xff0c;向司机发送SIGUSR1信号&#xff0c;司机打印&#xff08;lets gogogo&#xff09; 2&#xff09;售票员捕捉SIGQUIT&#xff08;代表停车&#xff09;信号&#xff0c;向司机发送…

x-cmd pkg | lazydocker - Docker 和 docker-compose 的 Terminal UI

目录 简介快速上手功能特点竞品和相关项目进一步探索 简介 lazydocker 是由 Jesse Duffield 用 Go 语言开发的 Docker 和 docker-compose 的 Terminal UI 管理工具。它提供 docker 的终端图形界面&#xff0c;支持鼠标操作和键盘快捷键&#xff0c;能实时监控 docker 容器&…

python简介及开发环境配置总结

参考&#xff1a;Python 基础教程 | 菜鸟教程 (runoob.com) Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python 由 Guido van Rossum 于 1989 年底发明&#xff0c;第一个公开发行版发行于 1991 年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU G…

国风高铁站可视化:传统文化与现代科技的融合

图扑国风高铁站可视化系统展示了浓厚的传统文化元素&#xff0c;结合现代科技&#xff0c;使旅客在便捷出行的同时体验独特的文化风情。高铁站可视化管理系统通过实时监控和数据分析&#xff0c;为车站运营人员提供全面、直观的管理工具&#xff0c;提升决策效率。

物联网架构之HBase

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

06.登录页面开发

1. 前言 前面已经完成了一些基础的配置&#xff0c;接下来开始进入真正的开发阶段。开发过程中会涉及到一些其它插件的集成&#xff0c;这里用到什么就记录一下使用的心得体会。 这里需要交代一下&#xff0c;项目里的文件命名规则&#xff0c;以及文件结构&#xff0c;views…

数学建模之入门篇

目录 什么是数学建模 建模、编程、写作 一、初步建模选择模型 二、进阶熟练掌握 1. 数学模型 线性规划 图与网络模型及方法 插值与拟合 灰色预测 动态规划 层次分析法 AHP 整数规划 目标规划模型 偏最小二乘回归 微分方程模型 博弈论 / 对策论 排队论模型 存…

Java笔试面试题AI答之面向对象(5)

文章目录 25. Java 包装类的实例是否可变&#xff1f;不可变类&#xff08;Immutable Classes&#xff09;特殊情况总结 26. 简述Java什么是自动装箱和自动拆箱&#xff1f;自动装箱&#xff08;Autoboxing&#xff09;自动拆箱&#xff08;Unboxing&#xff09;注意事项 27. J…

[译] APT分析报告:12.APT29利用spy软件供应商创建的IOS、Chrome漏洞

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

秒杀抢券很难吗?oneCoupon带你成为面试中的王牌

秒杀抢券很难吗&#xff1f;oneCoupon带你成为面试中的王牌 如果你在为简历上找不到亮眼的项目发愁&#xff0c;oneCoupon牛券可能就是你的救星。这个系统不仅高性能&#xff0c;还能承受十万次查询和分发请求。本文将带你走进oneCoupon牛券的世界&#xff0c;看看它是如何助力…

【C++】容器vector常用接口详解

目录 一.vector基本介绍 二.vector的构造&#xff08;constructor&#xff09; 三.vector迭代器&#xff08;iterator&#xff09; 四.vector的三种遍历 1.for循环 2.范围for 3.迭代器&#xff08;正向、反向&#xff09; 五. vector扩容操作 1.reserve 2.resize 六.…