wagmi `useConnection` Hook 完全指南:实时读取与订阅当前钱包连接状态

发布时间:2026/9/17 23:11:04

wagmi `useConnection` Hook 完全指南:实时读取与订阅当前钱包连接状态 wagmiuseConnectionHook 完全指南实时读取与订阅当前钱包连接状态【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmiuseConnection是 wagmi React 包中用于获取当前连接状态的核心 Hook它封装了wagmi/core的getConnection与watchConnection能力让组件能够以响应式方式读取地址、链、连接器等实时信息。本文基于仓库中 useConnection.md 文档并结合 useConnection.ts 源码、核心层 getConnection.ts 与 watchConnection.ts 实现以及对应测试带你掌握该 Hook 的参数、返回值、类型收窄技巧与底层运行原理。核心作用与适用场景useConnection返回一个描述当前连接的对象包含当前连接的账户地址address/addresses当前连接的链与链 IDchain/chainId当前使用的连接器connector例如 MetaMask、Coinbase Wallet 等连接生命周期状态status及其派生布尔标志isConnected、isConnecting、isReconnecting、isDisconnected。典型的适用场景包括根据连接状态切换 UI“连接钱包”按钮 / “账户信息”面板、展示当前账户地址与所在链、在交易前校验连接器与网络等。它是useConnect、useDisconnect等变更类 Hook 之外读取侧最常用的状态来源。导入与基础用法导入import { useConnection } from wagmi最简用法import { useConnection } from wagmi function App() { const connection useConnection() }在真实项目中通常配合WagmiProvider一起使用。Provider 通过 React Context 向下注入 Config使useConnection无需显式传参即可拿到配置import { WagmiProvider } from wagmi import { QueryClient, QueryClientProvider } from tanstack/react-query import { config } from ./config const queryClient new QueryClient() function App() { return ( WagmiProvider config{config} QueryClientProvider client{queryClient} YourApp / /QueryClientProvider /WagmiProvider ) }其中config由 config.ts 创建示例配置了主网与 Sepolia 两条链import { createConfig, http } from wagmi import { mainnet, sepolia } from wagmi/chains export const config createConfig({ chains: [mainnet, sepolia], transports: { [mainnet.id]: http(), [sepolia.id]: http(), }, })注意useConnection的响应式更新依赖WagmiProvider或显式传入config参数。在没有 Provider 包裹的情况下直接调用会抛出WagmiProviderNotFoundError——该行为在 useConfig.ts 中实现。完整实践示例import { useConnection } from wagmi import { mainnet } from wagmi/chains function Account() { const { address, chain, connector, status } useConnection() if (status connected address) { return ( div p地址{address}/p p网络{chain?.name}/p p连接器{connector?.name}/p /div ) } if (status connecting || status reconnecting) { return p正在连接…/p } return p未连接/p }参数Parametersimport { type UseConnectionParameters } from wagmiUseConnectionParameters本质上是ConfigParameterconfig只有一个可选字段config类型Config | undefined作用显式指定要使用的 Config默认不传时从最近的WagmiProvider中获取。当组件树中不方便使用 Context例如在 Provider 之外的工具函数组件、或同一页面存在多个 Config 实例时可以显式传入import { useConnection } from wagmi import { config } from ./config function App() { const connection useConnection({ config, // 显式指定 Config }) }传入方式与useConfig保持一致useConfig内部采用parameters.config ?? useContext(WagmiContext)的取值策略见 useConfig.ts因此显式config的优先级高于 Context。返回值Return Typeimport { type UseConnectionReturnType } from wagmiUseConnectionReturnTypeconfig与wagmi/core的GetConnectionReturnTypeconfig完全一致见 useConnection.ts完整字段说明收录于 getConnection-return-type.md具体如下addressAddress | undefined来自连接器的已连接地址默认取addresses数组中的第一个地址。addressesreadonly Address[] | undefined来自连接器的已连接地址列表。chainChain | undefined来自连接器的已连接链。如果该链未在 config 中配置则为undefined即便连接器实际连在该链上。这一点与chainId的取值逻辑不同详见下文源码解析。chainIdnumber | undefined来自连接器的已连接链 ID。connectorConnector | undefined当前已连接的连接器如 MetaMask、Coinbase Wallet、WalletConnect 等。isConnecting / isReconnecting / isConnected / isDisconnectedboolean由status派生的四个布尔标志用于简化条件判断。statusconnecting | reconnecting | connected | disconnectedconnecting正在尝试建立连接reconnecting正在尝试与一个或多个连接器重新建立连接例如页面刷新后通过reconnectOnMount自动重连见 WagmiProvider.mdconnected至少有一个连接器已连接disconnected未与任何连接器建立连接。利用status收窄返回类型GetConnectionReturnType被定义为一个可辨识联合discriminated unionstatus就是判别字段见 getConnection.ts 中四个分支的类型定义。因此可以直接通过status做类型收窄让 TypeScript 帮你保证字段可用性。当status connected时address等属性被保证已定义import { type GetConnectionReturnType } from wagmi/core const connection {} as GetConnectionReturnType if (connection.status connected) { connection.address // Address非 undefined connection.chainId // number非 undefined }当status disconnected时address等属性被保证为undefinedif (connection.status disconnected) { connection.address // undefined connection.connector // undefined }这一收窄行为在 useConnection.test-d.ts 中有完整的类型测试四个status分支分别对应一组精确的字段类型约束例如connected分支要求address: Address、chainId: number、connector: Connector而disconnected分支要求全部为undefined。源码级原理一次 Hook 调用背后发生了什么从 React Hook 到 core Action 的调用链useConnection.ts 的实现非常精简核心只有三步export function useConnectionconfig extends Config ResolvedRegister[config]( parameters: UseConnectionParametersconfig {}, ): UseConnectionReturnTypeconfig { const config useConfig(parameters) return useSyncExternalStoreWithTracked( (onChange) watchConnection(config, { onChange }), () getConnection(config), ) }useConfig(parameters)解析出实际生效的 Config显式参数优先否则取 Context订阅subscribe调用watchConnection(config, { onChange })在连接状态变化时触发更新读取快照getSnapshot调用getConnection(config)计算当前连接快照并通过useSyncExternalStoreWithTracked接入 React 的并发安全外部存储机制。getConnection状态如何被组装核心实现位于 getConnection.ts。它从 Config 的内部状态中读取三类数据const uid config.state.current! // 当前连接器实例的 uid const connection config.state.connections.get(uid) // 连接记录accounts、chainId、connector const status config.state.status // 全局连接状态然后根据status的四个取值分别组装返回对象connectedaddress、addresses、chainId、connector均为非空值reconnecting字段可能已恢复address存在时isConnected为trueisReconnecting: trueconnectingisConnecting: true其余字段按当前部分数据返回disconnected所有账户、链、连接器字段统一为undefined。值得注意的实现细节是chain的取值const chain config.chains.find( (chain) chain.id connection?.chainId, )它通过chainId在config 已配置的链列表中查找这解释了为什么“连接器连到一条未在 config 中配置的链时chain会返回undefined而chainId仍能返回连接器上报的原始数值”。watchConnection变化如何被感知watchConnection.ts 负责订阅并提供了一个关键的相等性判断return config.subscribe(() getConnection(config), onChange, { equalityFn(a, b) { const { connector: aConnector, ...aRest } a const { connector: bConnector, ...bRest } b return ( deepEqual(aRest, bRest) aConnector?.id bConnector?.id aConnector?.uid bConnector?.uid ) }, })连接器对象connector本身可能是引用不稳定的实例因此单独用iduid比较其余字段使用deepEqual做深比较避免因对象引用变化而触发无意义的重新渲染。useSyncExternalStoreWithTracked按需订阅的细粒度优化useSyncExternalStoreWithTracked.ts 是对 React 官方useSyncExternalStore的增强封装它通过Object.defineProperties给返回对象注入带“记录访问 key”功能的 getter当组件只读取了status、address等部分字段时trackedKeys会记录这些 key后续状态变化时isEqual只比较被访问过的 key从而跳过无关字段变化引发的重渲染。这意味着一个只读取status的组件不会因为address的变化而重新渲染一个只读取address的组件也不会因为链切换而重渲染。这是 wagmi Hook 在大型应用中保持高性能的关键机制。与 core 层getConnection的关系useConnection本质上是 core 层 getConnection 的 React 响应式封装。core 层用法为命令式调用import { getConnection } from wagmi/core import { config } from ./config const connection getConnection(config)而 Hook 版额外提供了订阅与按需渲染能力两者返回值类型完全一致均指向GetConnectionReturnType。测试验证仓库中的测试覆盖了useConnection的核心行为useConnection.test.tstest(default, async () { const { result, rerender } await renderHook(() useConnection()) expect(result.current.address).not.toBeDefined() expect(result.current.status).toEqual(disconnected) await connect(config, { connector: config.connectors[0]! }) rerender() expect(result.current.address).toBeDefined() expect(result.current.status).toEqual(connected) await disconnect(config) })测试验证了两个关键点初始状态为disconnectedaddress未定义调用connect后Hook自动响应式更新为connectedaddress变为已定义disconnect后恢复。此外parameters: config用例验证了显式传入config的用法——该场景下组件不必被WagmiProvider包裹测试中使用React.Fragment作为 wrapper印证了config参数与 Context 互为替代的关系。常见实战模式1. 根据状态渲染登录 / 登出 UIfunction ConnectButton() { const { status, address } useConnection() if (status connected) return button{address}/button if (status connecting || status reconnecting) return button disabled连接中…/button return button连接钱包/button }2. 校验当前网络是否为目标链import { useConnection } from wagmi import { mainnet } from wagmi/chains function NetworkGuard() { const { chainId, status } useConnection() const isConnected status connected if (isConnected chainId ! mainnet.id) { return p请切换到主网后再进行操作/p } return null }3. SSR 场景注意WagmiProvider的reconnectOnMount默认为true见 WagmiProvider.md服务端渲染时首次快照通常为disconnected状态客户端水合后才可能自动重连并更新为connected。若需要服务端预填充状态可结合initialState使用避免首屏出现“未连接”闪动。小结useConnection以极薄的封装为 React 组件提供了完整、响应式、类型安全的连接状态读取能力唯一可选参数config让你可以在 Context 之外显式指定 Config返回值通过status判别联合实现精确的类型收窄connected状态下address、chainId、connector均被保证存在底层由getConnection状态组装watchConnection订阅与相等性判断useSyncExternalStoreWithTracked按需渲染优化三层协作兼顾正确性与性能与 core 层getConnection共享同一返回类型可在命令式与响应式两种风格间平滑切换。相关源码与文档Hook 实现 useConnection.ts、core Action getConnection.ts 与 watchConnection.ts、返回类型说明 getConnection-return-type.md、行为测试 useConnection.test.ts 与类型测试 useConnection.test-d.ts。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/17 23:06:02

ArcGIS JS 基础教程(22):BuildingSceneLayer 建筑场景图层

ArcGIS JS 基础教程(22):BuildingSceneLayer 建筑场景图层零、写在前面一、功能介绍二、功能实现三、功能应用四、核心代码五、在线示例六、关键 API 说明七、系列导航零、写在前面 📌 本系列教程完整目录:ArcGIS JS 系…

2026/9/18 0:11:10

首件鉴定控制程序落地:FAI判定、数据闭环与PDF受控

简介:这份《首件鉴定控制程序.pdf》是一份制造业质量管理企业标准,面向技术质量、生产、业务及供应商管理人员,用于规范新产品或重大升级产品的首件鉴定流程,确保首件满足设计图纸与生产工艺要求。文件为青岛铁辉工贸有限公司THJY…

2026/9/18 0:11:10

Android Service插件化:Hook AMS与占坑代理的完整实现指南

简介:针对安卓插件化开发中的技术难点,这份方案围绕Service组件难以动态加载的问题,提出不修改宿主应用即可运行插件服务的实现思路。方案从ActivityThread启动Service不依赖Instrumentation这一差异切入,分析Service与Activity在…

2026/9/18 0:11:10

当 Claude 从提问到交付,TaoToken Key 记谁消耗

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 0:11:10

同一把 TaoToken Key,驱动 Vercel式 inbound 销售 Agent

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 0:06:10

Adam优化器:原理、手写实现与PyTorch调参实战

调参这件事,真正让人头大的往往不是网络结构本身,而是优化器。同一个模型、同一份数据,换个优化器或者改一下默认参数,收敛速度和最终指标能差出一大截。我这些年做模型训练和工程落地,从早期手写SGD加动量&#xff0c…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码