当前位置: 首页 > article >正文

Javascript IndexedDB(Dexie.js) React 存储大量(5-50M)的完整示例

IndexedDB 整合到 React 应用中,可以为你的应用提供高效的客户端存储解决方案,特别适用于需要存储大量结构化数据或离线功能的场景。为了简化 IndexedDB 的使用,通常推荐使用封装好的库,如 Dexie.js 或 idb。这些库提供了更简洁和友好的 API,方便在 React 中进行集成。

下面,我将详细介绍如何使用 Dexie.jsIndexedDB 整合到 React 应用中,并创建一个自定义钩子来管理数据库操作。

目录

  1. 安装 Dexie.js
  2. 设置 Dexie 数据库
  3. 创建 React 上下文(Context)
  4. 创建自定义钩子(Hook)
  5. 在组件中使用 IndexedDB
  6. 完整示例
  7. 最佳实践

1. 安装 Dexie.js

首先,安装 Dexie.js 库:

npm install dexie

或使用 yarn:

yarn add dexie

2. 设置 Dexie 数据库

创建一个单独的文件来配置和初始化 Dexie 数据库,例如 db.js

// src/db.js
import Dexie from 'dexie';

// 创建数据库
const db = new Dexie('MyReactAppDB');

// 定义数据库的结构
db.version(1).stores({
   
  users: '++id, name, email', // 表示自动递增的主键 'id',以及索引字段 'name' 和 'email'
  posts: '++id, title, content, userId'
});

// 可选:打开数据库
db.open().catch((err) => {
   
  console.error('Failed to open db:', err.stack || err);
});

export default db;

解释:

  • 数据库名称MyReactAppDB
  • 对象存储区(Tables)usersposts
  • 索引users 表有 id(自动递增)、nameemail 作为索引。

3. 创建 React 上下文(Context)

为了在整个 React 应用中方便地访问数据库,可以创建一个上下文。

// src/contexts/DBContext.js
import React, {
    createContext } from 'react';
import db from '../db';

export const DBContext = createContext();

export const DBProvider = ({
     children }) => {
   
  return (
    <DBContext.Provider value={
   db}>
      {
   children}
    </DBContext.Provider>
  );
};

4. 创建自定义钩子(Hook)

为了简化在组件中进行数据库操作,可以创建自定义钩子。例如,创建一个 useUsers 钩子来管理 users 表的数据。

// src/hooks/useUsers.js
import {
    useState, useEffect, useContext } from 'react';
import {
    DBContext } from '../contexts/DBContext';

const useUsers = () => {
   
  const db = useContext(DBContext);
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);

  // 获取所有用户
  const fetchUsers = async () => {
   
    setLoading(true);
    const allUsers = await db.users.toArray();
    setUsers(allUsers);
    setLoading(false);
  };

  // 添加新用户
  const addUser = async (user) => {
   
    await db.users.add(user);
    fetchUsers(); // 更新用户列表
  };

  // 更新用户
  const updateUser = async (id, updatedFields) => {
   
    await db.users.update(id, updatedFields)

http://www.kler.cn/a/516305.html

相关文章:

  • 规模化指令微调的语言模型
  • 谷歌(Google) Pixel 8/9 Pro(xl)如何获取 root 权限
  • 23. C语言 文件操作详解
  • GS-SLAM论文阅读--SplatMAP
  • SpringBoot使用MockMVC通过http请求controller控制器调用测试
  • leetcode_链表 21.合并两个有序链表
  • Github 2025-01-23 Go开源项目日报 Top10
  • 【29】Word:李楠-学术期刊❗
  • GPSd定时检测保活TCP GPS源
  • React 路由导航与传参详解
  • 力扣hot100-->滑动窗口、贪心
  • Vue入门(Vue基本语法、axios、组件、事件分发)
  • Python自带模块实现屏幕像素高效操作
  • VUE对接deepseekAPI调用
  • 【LeetCode 刷题】二叉树-深度优先遍历
  • Chromium 132 编译指南 Mac 篇(二)- 安装 Xcode
  • WPF-系统资源
  • 豆包MarsCode:小C点菜问题
  • 左/右侧边栏布局(Semi design)
  • FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转