【p2p、分布式,区块链笔记 DAM】GUN用户认证实例 useGunContext

  • useGunContext(https://github.com/SuaYoo/gundb-react-express-auth-example/blob/main/server/server.js)代码创建了一个上下文(Context)来为整个应用提供 GUN 实例及其用户认证逻辑,在多个组件之间共享 GUN 数据库连接和用户状态数据()。 useGunContext() 钩子提供以下内容:
{
   
  getGun: Function, // 返回 `gun` 实例
  getUser: Function, // 返回 `gun.user()` 实例
  getCertificate: Function, // 返回当前用户的证书
  setCertificate: Function, // 设置当前用户的证书
  onAuth: Function, // 接收回调函数,在 `gun.user().auth()` 时触发
}

概述

  1. GUN 实例管理

    • 通过 useRef 保持 GUN 实例、用户对象和认证 token 的持久性。
    • 确保整个应用只使用一个 GUN 实例,避免多次初始化。
  2. 用户认证

    • useEffect 中监听 GUN 的 auth 事件,当用户认证成功时,通过 API 获取 accessTokencertificate
    • 支持自动记住用户登录状态(使用 sessionStorage)。
  3. 跨组件共享

    • 通过 GunContext.Provider 将 GUN 实例、用户对象和相关方法传递给整个应用,使各个组件可以轻松访问。

代码解释

1. 引入依赖和createContext函数

import React, { createContext, useContext, useRef, useEffect } from 'react';
import Gun from 'gun/gun';
import 'gun/sea';

const GunContext = createContext({
  getGun: () => {},
  getUser: () => {},
  getCertificate: () => {},
  setCertificate: () => {},
  onAuth: () => () => {},
});
  • createContextcreateContext函数用于创建 Context 对象。Context 允许你在组件树中共享数据,而无需显式地通过每一级组件的 props 进行传递。
  • 使用 Context.Provider提供数据 <MyContext.Provider value={value}> …… </MyContext.Provider>
  • 使用 useContext消费数据:用于在子组件中访问 GunContext 提供的值。

2. GunContextProvider组件

  • 虽然在技术上你可以使用普通对象来存储这些引用,如:var gunRef = {}; gunRef.current = ...。如果你在组件内部直接使用 var gunRef = {},每次组件重新渲染时 gunRef 都会重新初始化。
  • 但 useRef 提供了更好的组件内数据持久化方式,同时确保与 React 的生命周期管理相匹配。
export const GunContextProvider = ({
     children }) => {
   
  // 使用 useRef 保存 GUN 实例、用户对象、认证 token 和回调函数
  const gunRef = useRef();
  const userRef = useRef();
  const certificateRef = useRef();
  const accessTokenRef = useRef();
  const onAuthCbRef = useRef();
  // 初始化 GUN 和用户认证(依赖数组为[],仅在组件挂载时运行)
  useEffect(() => {
   
    // 调用 Gun() 创建一个实例时,Gun.js 会触发一个 opt 事件。这个事件用于配置 Gun 的上下文(ctx)
    // GUN 的中间件,用于在每个请求的消息头中添加 accessToken
    Gun.on(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值