首页 > 其他分享 >先不要管indexedDB的部分,这个模块我只想提供三个方法, 1、put(key, strValue) 2、get(key) 3、remove(key)

先不要管indexedDB的部分,这个模块我只想提供三个方法, 1、put(key, strValue) 2、get(key) 3、remove(key)

时间:2024-12-01 13:12:53浏览次数:5  
标签:indexedDB IndexedDB transaction const get request key event

明白了,如果这个模块只需要提供三个简单的方法 put(key, strValue)get(key)remove(key),可以按照以下的方式实现:

代码实现:

import React, { useState, useEffect } from 'react';

// 提供三个方法用于对IndexedDB进行基本操作
const IndexedDB = () => {

  // put 方法:将数据存储到 IndexedDB 中
  const put = (key, strValue) => {
    const request = indexedDB.open('AdhocTabsStatus', 1);

    request.onupgradeneeded = (event) => {
      const db = event.target.result;
      // 创建对象存储区(如果不存在的话)
      if (!db.objectStoreNames.contains('tabs')) {
        db.createObjectStore('tabs', { keyPath: 'id' });
      }
    };

    request.onsuccess = (event) => {
      const db = event.target.result;
      const transaction = db.transaction(['tabs'], 'readwrite');
      const store = transaction.objectStore('tabs');
      const requestPut = store.put({ id: key, value: strValue });

      requestPut.onsuccess = () => {
        console.log('数据存储成功');
      };

      requestPut.onerror = (event) => {
        console.error('存储数据失败:', event.target.error);
      };
    };

    request.onerror = (event) => {
      console.error('打开数据库失败:', event.target.error);
    };
  };

  // get 方法:从 IndexedDB 中读取数据
  const get = (key) => {
    const request = indexedDB.open('AdhocTabsStatus', 1);

    request.onsuccess = (event) => {
      const db = event.target.result;
      const transaction = db.transaction(['tabs'], 'readonly');
      const store = transaction.objectStore('tabs');
      const requestGet = store.get(key); // 使用传入的key读取数据

      requestGet.onsuccess = (event) => {
        if (event.target.result) {
          console.log('数据获取成功:', event.target.result);
          return event.target.result.value; // 返回存储的值
        } else {
          console.log('未找到该数据');
          return null;
        }
      };

      requestGet.onerror = (event) => {
        console.error('读取数据失败:', event.target.error);
      };
    };

    request.onerror = (event) => {
      console.error('打开数据库失败:', event.target.error);
    };
  };

  // remove 方法:从 IndexedDB 中删除数据
  const remove = (key) => {
    const request = indexedDB.open('AdhocTabsStatus', 1);

    request.onsuccess = (event) => {
      const db = event.target.result;
      const transaction = db.transaction(['tabs'], 'readwrite');
      const store = transaction.objectStore('tabs');
      const requestRemove = store.delete(key); // 使用传入的key删除数据

      requestRemove.onsuccess = () => {
        console.log('数据删除成功');
      };

      requestRemove.onerror = (event) => {
        console.error('删除数据失败:', event.target.error);
      };
    };

    request.onerror = (event) => {
      console.error('打开数据库失败:', event.target.error);
    };
  };

  // 这部分可以是UI或者不需要显示的部分
  return (
    <div>
      <h3>IndexedDB Methods</h3>
      {/* UI 代码部分可以根据需要自行添加 */}
    </div>
  );
};

export default IndexedDB;

代码说明:

1. put(key, strValue)

  • 使用 indexedDB.open() 打开数据库。
  • onupgradeneeded 中创建 tabs 存储区(如果不存在)。
  • 通过 transaction.objectStore('tabs').put({ id: key, value: strValue }) 将数据存入 IndexedDB。
  • key 作为 id,并保存值 strValue

2. get(key)

  • 使用 indexedDB.open() 打开数据库。
  • onsuccess 中读取存储在 tabs 存储区中的数据。
  • 使用 store.get(key) 根据 key 获取值,如果找到了,返回对应的 value

3. remove(key)

  • 使用 indexedDB.open() 打开数据库。
  • 通过 store.delete(key) 根据 key 删除存储的数据。

使用这些方法:

您可以通过导入 IndexedDB 模块,在应用中的其他部分使用这三个方法。比如:

import IndexedDB from './IndexedDB';

const someFunction = () => {
  // 存储数据
  IndexedDB.put('user123', 'Some user data');

  // 获取数据
  const userData = IndexedDB.get('user123');
  console.log(userData);

  // 删除数据
  IndexedDB.remove('user123');
};

注意:

  1. 由于 IndexedDB 的操作是异步的,get 方法实际上是无法同步返回数据的,因为它是基于事件(如 onsuccess)的。所以,如果要同步获取数据,你需要使用 Promise 来处理异步操作,或者通过回调函数来处理。

  2. putremove 都是异步操作,因此也可以通过回调或 Promise 来处理操作完成后的反馈。

如果你需要将这些方法改成 Promise 风格,方便在调用时 await 获取结果,可以参考下面的修改版本:

Promise 风格的实现:

const IndexedDB = () => {

  const openDB = () => {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open('AdhocTabsStatus', 1);
      request.onsuccess = (event) => resolve(event.target.result);
      request.onerror = (event) => reject(event.target.error);
    });
  };

  const put = async (key, strValue) => {
    const db = await openDB();
    const transaction = db.transaction(['tabs'], 'readwrite');
    const store = transaction.objectStore('tabs');
    const request = store.put({ id: key, value: strValue });
    
    return new Promise((resolve, reject) => {
      request.onsuccess = () => resolve('数据存储成功');
      request.onerror = (event) => reject('存储数据失败');
    });
  };

  const get = async (key) => {
    const db = await openDB();
    const transaction = db.transaction(['tabs'], 'readonly');
    const store = transaction.objectStore('tabs');
    const request = store.get(key);
    
    return new Promise((resolve, reject) => {
      request.onsuccess = (event) => {
        if (event.target.result) {
          resolve(event.target.result.value);
        } else {
          reject('未找到该数据');
        }
      };
      request.onerror = (event) => reject('读取数据失败');
    });
  };

  const remove = async (key) => {
    const db = await openDB();
    const transaction = db.transaction(['tabs'], 'readwrite');
    const store = transaction.objectStore('tabs');
    const request = store.delete(key);

    return new Promise((resolve, reject) => {
      request.onsuccess = () => resolve('数据删除成功');
      request.onerror = (event) => reject('删除数据失败');
    });
  };

  return (
    <div>
      <h3>IndexedDB Methods</h3>
    </div>
  );
};

使用这个版本时,您可以像下面这样调用这些方法:

const someFunction = async () => {
  await IndexedDB.put('user123', 'Some user data');
  const data = await IndexedDB.get('user123');
  console.log(data);
  await IndexedDB.remove('user123');
};

这样,方法会返回 Promise,可以通过 async/awaitthen/catch 来处理。

标签:indexedDB,IndexedDB,transaction,const,get,request,key,event
From: https://www.cnblogs.com/Tifahfyf/p/18579707

相关文章

  • indexedDB的具体使用方法
    IndexedDB简介IndexedDB是浏览器提供的一种本地存储解决方案,用于存储大量的结构化数据。它支持异步操作,允许你存储对象、数组、甚至是二进制数据,并为它们提供索引以提高查询效率。它的设计目的是用于处理大规模数据存储,适合离线应用和大数据处理。IndexedDB的特点存储大数据:......
  • 深度剖析 | 低功耗模组Air724UG的软件实例:KEYPAD教程!
    本次我要要深度剖析的是低功耗4G模组Air724UG的软件实例,关于KEYPAD的教程,赶紧来学吧。一、简介在电路设计中,通常需要较多的外部输入,如果每个按键都单独去占用一个IO接口,就会非常浪费资源,为了减少I/O口的占用,通常将按键排列成矩阵形式,即矩阵键盘。特性:KEYIN0扫描键盘输入......
  • 【攻防世界】WEB-inget
    首先找到该关卡启动靶场环境访问靶场构造一个id参数,尝试访问,无内容回显使用sqlmap工具,先获取数据库,输入命令sqlmap-uhttp://61.147.171.105:58893/?id=1--dbs发现第一个即为所需数据库,接下来进行获取字段,输入命令sqlmap-uhttp://61.147.171.105:58893/?id=1......
  • getelementbyId和queryselect平时经常使用哪一个?说说你的看法
    在前端开发中,getElementById和querySelector都是用于选择HTML元素的常用方法,但它们各有优缺点,适用场景略有不同。我通常会根据具体情况选择更合适的方法:getElementById:优点:速度最快:因为它直接通过ID查找,浏览器可以进行优化,使其速度非常快。代码简洁:语法简单,易......
  • 介绍一下IndexedDB以及封装IndexedDB的模块代码
    IndexedDB简介IndexedDB是一种浏览器内置的低层次的API,用于在客户端存储大量结构化数据。它是一个浏览器端的数据库,允许你存储各种类型的对象,包括文件、二进制数据等,并通过键值对的方式进行快速查询。与WebStorage(如localStorage和sessionStorage)不同,IndexedDB可以存储......
  • [C++][CMake][Error] set_target_properties called with incorrect number of argume
    1简介这篇文章将探讨了在使用CMake构建C++项目时,调用set_target_properties函数时参数数量不正确所引发的问题。2错误案例以下为可能发生错误的案例include_directories(${CMAKE_SOURCE_DIR}/common)find_package(Threads)add_library(libusbmuxdSHAREDlibusbm......
  • 介绍一下IndexedDB以及封装IndexedDB的模块代码
    1.IndexedDB简介IndexedDB是一种在浏览器中存储结构化数据的方式,类似于关系数据库,但它具有更高的存储容量和灵活性。相比于localStorage,IndexedDB适合存储大量数据,能够处理更复杂的数据结构,并且支持异步操作。它是浏览器端持久化存储的一种常用方式。IndexedDB的特点:异步:I......
  • 在使用 PowerShell 与 Excel COM 对象交互时,Get-Member 命令通常用于查看对象的成员(方
    在使用PowerShell与ExcelCOM对象交互时,Get-Member命令通常用于查看对象的成员(方法、属性等)。不过,Excel的COM对象可能会出现一些成员在使用Get-Member时无法完全显示的情况,尤其是在显示属性或方法时没有完全列出所有可用的成员。为了解决这个问题,可以使用以下几种方法来......
  • scanf函数、getchar函数、gets函数等函数的误区(回车输出问题)
     目录一、运行原理二、从代码角度观察三、总结四、那怎么解决这种情况呢(1)、方法一(2)、方法二 五、补充一、运行原理scanf函数、getchar函数、gets函数等这类函数是这样的运行的:可以看出来,scanf函数并不是键盘按什么,就读取什么,换种说法是键盘输入和函数读取不......
  • docker-compose 报错 container.image_config['ContainerConfig'].get('Volumes') or
    应该使用dockercompose而不是docker-compose(废弃的1.0版本)env:WSLUbuntu-22.04报错关键字如下File"/usr/lib/python3/dist-packages/compose/service.py",line1579,inget_container_data_volumescontainer.image_config['ContainerConfig'].get('......