vue 封装使用 indexedDB 进行储存数据

封装indexedDB.js 文件

 

// indexedDB.js

// 数据库名称
const DB_NAME = 'myDB';
// 数据库版本号(每次结构变更需递增)
const DB_VERSION = 1;
// 对象仓库(表)名称
const STORE_NAME = 'user';

/**
 * 打开(或创建)IndexedDB 数据库
 * @returns {Promise<IDBDatabase>} 返回数据库实例的 Promise
 */
export function openDB() {
  return new Promise((resolve, reject) => {
    // 打开数据库请求
    const request = indexedDB.open(DB_NAME, DB_VERSION);

    // 如果数据库版本变更或首次创建时触发
    request.onupgradeneeded = function (event) {
      const db = event.target.result;
      // 如果对象仓库不存在则创建,主键为 'id'
      if (!db.objectStoreNames.contains(STORE_NAME)) {
        db.createObjectStore(STORE_NAME, { keyPath: 'id' });
      }
    };

    // 打开数据库成功
    request.onsuccess = function (event) {
      resolve(event.target.result);
    };

    // 打开数据库失败
    request.onerror = function (event) {
      reject(event.target.error);
    };
  });
}

/**
 * 向 user 表中添加一个用户
 * @param {Object} user 用户对象,需包含 id 字段
 * @returns {Promise<void>} 添加成功则 resolve,否则 reject
 */
export async function addUser(user) {
  const db = await openDB();
  return new Promise((resolve, reject) => {
    // 创建一个可读写事务
    const tx = db.transaction(STORE_NAME, 'readwrite');
    const store = tx.objectStore(STORE_NAME);
    // 添加用户数据
    const request = store.add(user);

    // 添加成功
    request.onsuccess = () => resolve();

    // 添加失败(如主键重复等)
    request.onerror = (e) => reject(e);
  });
}

/**
 * 获取 user 表中所有用户数据
 * @returns {Promise<Array>} 返回所有用户对象数组
 */
export async function getAllUsers() {
  const db = await openDB();
  return new Promise((resolve, reject) => {
    // 创建一个只读事务
    const tx = db.transaction(STORE_NAME, 'readonly');
    const store = tx.objectStore(STORE_NAME);
    // 获取所有数据
    const request = store.getAll();

    // 获取成功,返回结果数组
    request.onsuccess = (e) => resolve(e.target.result);

    // 获取失败
    request.onerror = (e) => reject(e);
  });
}

/**
 * 根据 id 删除 user 表中的用户
 * @param {string|number} id 用户主键 id
 * @returns {Promise<void>} 删除成功则 resolve,否则 reject
 */
export async function deleteUser(id) {
  const db = await openDB();
  return new Promise((resolve, reject) => {
    // 创建一个可读写事务
    const tx = db.transaction(STORE_NAME, 'readwrite');
    const store = tx.objectStore(STORE_NAME);
    // 删除指定 id 的数据
    const request = store.delete(id);

    // 删除成功
    request.onsuccess = () => resolve();

    // 删除失败
    request.onerror = (e) => reject(e);
  });
}

 

 使用案例

<template>
  <div>
    <h2>用户管理</h2>
    <!-- 输入框:用于输入用户ID,使用v-model实现双向绑定 -->
    <input v-model="userId" placeholder="用户ID" />
    <!-- 输入框:用于输入用户名,使用v-model实现双向绑定 -->
    <input v-model="userName" placeholder="用户名" />
    <!-- 按钮:点击后保存用户信息到IndexedDB -->
    <button @click="saveUser">保存用户</button>
    <!-- 按钮:点击后从IndexedDB读取所有用户 -->
    <button @click="loadUsers">读取所有用户</button>
    <!-- 用户列表:遍历users数组,显示每个用户的信息和删除按钮 -->
    <ul>
      <li v-for="user in users" :key="user.id">
        {{ user.id }} - {{ user.name }}
        <!-- 删除按钮:点击后删除对应用户 -->
        <button @click="removeUser(user.id)">删除</button>
      </li>
    </ul>
  </div>
</template>

<script>
// 导入IndexedDB相关操作方法
import { addUser, getAllUsers, deleteUser } from '@/utils/indexedDB.js';

export default {
  data() {
    return {
      userId: '',   // 绑定用户ID输入框
      userName: '', // 绑定用户名输入框
      users: [],    // 存储所有用户数据的数组
    };
  },
  methods: {
    /**
     * 保存用户信息到IndexedDB
     * 1. 检查输入是否合法
     * 2. 调用addUser方法保存
     * 3. 成功后刷新用户列表,失败时提示
     */
    async saveUser() {
      // 校验输入
      if (!this.userId || !this.userName) {
        alert('请输入ID和用户名');
        return;
      }
      try {
        // 调用addUser方法添加用户
        await addUser({ id: this.userId, name: this.userName });
        alert('保存成功');
        // 保存成功后刷新用户列表
        this.loadUsers();
      } catch (e) {
        // 如果ID已存在或其他错误,提示用户
        alert('保存失败,ID可能已存在');
      }
    },
    /**
     * 从IndexedDB读取所有用户并更新users数组
     */
    async loadUsers() {
      // 调用getAllUsers方法获取所有用户
      this.users = await getAllUsers();
    },
    /**
     * 删除指定ID的用户
     * @param {string} id - 要删除的用户ID
     */
    async removeUser(id) {
      // 调用deleteUser方法删除用户
      await deleteUser(id);
      // 删除后刷新用户列表
      this.loadUsers();
    },
  },
  /**
   * 组件挂载后自动加载所有用户
   */
  mounted() {
    this.loadUsers();
  },
};
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值