概况

web3-react是由Noah Zinsmeister开发的一个web3框架,主要功能是实时获取DApp里的关键数据(如用户当前连接的地址、网络、余额等)。

Noah也是著名的去中心化交易所uniswap里的工程师,因此这个库在uniswap里也已被大量的使用。

web3-react有两个版本,V6和V8,先把这两个版本的仓库地址都贴一下:

V6:https://github.com/Uniswap/web3-react/tree/v6

V8:https://github.com/Uniswap/web3-react/tree/main

搜了下网上的大部分教程都是针对V6的,V8的很少,官方文档内容也不多。所以这篇文章是基于最新的V8版本的实践教程。

安装

第一步自然需要一个react项目,用create-react-app生成就好了。然后安装@web3-react所需要的依赖。

    "@walletconnect/web3-provider": "^1.7.1",
"@web3-react/coinbase-wallet": "^8.0.33-beta.0",
"@web3-react/core": "8.0.35-beta.0",
"@web3-react/gnosis-safe": "^8.0.5-beta.0",
"@web3-react/metamask": "8.0.29-beta.0",
"@web3-react/network": "^8.0.26-beta.0",
"@web3-react/types": "^8.0.19-beta.0",
"@web3-react/walletconnect": "^8.0.34-beta.0",

使用

以连接metamask为例,先创建一个连接器(connector),并将这个连接器对象导出。

import { initializeConnector } from '@web3-react/core'
import { MetaMask } from '@web3-react/metamask' export const [metaMask, hooks] = initializeConnector<MetaMask>((actions) => new MetaMask({ actions }))

上面这个connector暴露了两个属性,hooks和metaMask,通过hooks就可以获取到当前账户的关键信息,比如

获取当前网络的chainId

const chainId = useChainId()

获取当前连接的账户地址

const accounts = useAccounts()

获取当前账户的连接状态

const isActive = useIsActive()

可以将上述值传给一个容器组件

const { useChainId, useAccounts, useIsActivating, useIsActive, useProvider, useENSNames } = hooks

export default function MetaMaskCard() {
const chainId = useChainId()
const accounts = useAccounts()
const isActivating = useIsActivating() const isActive = useIsActive() const provider = useProvider()
const ENSNames = useENSNames(provider) const [error, setError] = useState(undefined) // attempt to connect eagerly on mount
useEffect(() => {
void metaMask.connectEagerly().catch(() => {
console.debug('Failed to connect eagerly to metamask')
})
}, []) return (
<Card
connector={metaMask}
chainId={chainId}
isActivating={isActivating}
isActive={isActive}
error={error}
setError={setError}
accounts={accounts}
provider={provider}
ENSNames={ENSNames}
/>
)
}

容器组件Card:

export function Card({
connector,
chainId,
isActivating,
isActive,
error,
setError,
ENSNames,
accounts,
provider,
}: Props) {
return (
<div
style={{
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between',
width: '500px',
padding: '20px',
margin: '20px',
overflow: 'auto',
border: '1px solid',
borderRadius: '10px',
}}
>
{/* <b>{getName(connector)}</b> */}
<div style={{ marginBottom: '1rem' }}>
<Status isActivating={isActivating} isActive={isActive} error={error} />
</div>
<Chain chainId={chainId} />
<div style={{ marginBottom: '1rem' }}>
<Accounts accounts={accounts} provider={provider} ENSNames={ENSNames} />
</div>
<ConnectWithSelect
connector={connector}
chainId={chainId}
isActivating={isActivating}
isActive={isActive}
error={error}
setError={setError}
/>
</div>
)
}

最终出来的效果,样式可能不太美观,关注功能点就好~

默认未登录:

点击登录,登录后的状态:

默认是在主网,还能切换到别的网络

可以看到,切换网络后,余额也实时发生了变化。

和web3Modal对比

有些小伙伴可能有疑惑,要连接钱包的话,用web3Modal就可以实现了,样式还更美观,为什么要多此一举用web3-react呢?

这是因为:

1. web3modal没有提供能直接获取地址,余额和状态的hooks,需要自己去调用api才能获取。

2. 要切换网络的话,用web3modal还得自己去写switch函数,用起来不够方便。

从v6升级

虽然web3-react的内部在v6和v8之间发生了相当大的变化,但升级时改变也不太多。迁移到新的连接器和状态管理模式后,就能够使用@web3-react/core中定义的hooks,特别是useWeb3React。

v8的最大好处是钩子现在是per-connector,而不是全局钩子,因此不再需要在连接器/多个根之间进行混合了。

玩转web3第一篇——web3-react的更多相关文章

  1. 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...

  2. 15天玩转redis —— 第一篇 开始入手

    双十一终于还是过去了,我负责的mongodb由于做了副本集,最终还是挺过去了,同事负责的redis,还是遗憾的在早上8点左右宕机了,然后大家就是马不停 蹄的赶往公司解决问题,因为我对redis也不是很 ...

  3. AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX

    AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX 一.什么是JSX 使用JSX声明一个变量(REACT当中的元素): const element =< ...

  4. 从零构建以太坊(Ethereum)智能合约到项目实战——第22章 玩转truffle framework 、Web3.js 框架

    P84 .1-玩转truffle framework.Web3.js 框架 内容介绍 truffle官方网站:https://truffleframework.com/ P85 .2-truffle ...

  5. Three.js 第一篇:绘制一个静态的3D球体

    第一篇就画一个球体吧 首先我们知道Three.js其实是一个3D的JS引擎,其中的强大之处就在于这个JS框架并不是依托于JQUERY来写的.那么,我们在写这一篇绘制3D球体的文章的时候,应该注意哪些地 ...

  6. 我的第一篇Markdown语法博客

    这是我的第一篇使用markdown语法编写的博客 使用的编辑器为Sublime Text2 并且使用了sublog插件, sublog是一个开源项目 sublog 并且参考了作者的博客 AmongOt ...

  7. 第一篇:SOUI是什么?

    概述 用C++做产品最痛苦的是什么?肯定是做UI. SOUI的使命就是把痛苦的UI变化成快乐的UI. 什么?UI还能快乐?脑子进水了吗? 当你看完这个系统教程的时候相信你面对UI至少不会再痛苦.你可以 ...

  8. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  9. 从.Net到Java学习第一篇——开篇

    以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...

  10. 解剖SQLSERVER 第一篇 数据库恢复软件商的黑幕(有删减版)

    解剖SQLSERVER 第一篇  数据库恢复软件商的黑幕(有删减版) 这一系列,我们一起来解剖SQLSERVER 在系列的第一篇文章里本人可能会得罪某些人,但是作为一位SQLSERVER MVP,在我 ...

随机推荐

  1. webgl(three.js)3D光伏,3D太阳能能源,3D智慧光伏、光伏发电、清洁能源三维可视化解决方案——第十六课

    序: 能源是文明和发展的重要保障,人类命运不可避开的话题,无论是战争还是发展,都有它存在的身影.从石器时代到现代文明,人类的能源应用在进步,也在面临能源枯竭的危机与恐惧,而开发与应用可再生能源才是解决 ...

  2. 二十四、PV与PVC介绍

    PV 与 PVC介绍 一.概念介绍 ​PersistentVolume (PV) 是由管理员设置的存储,它是群集的一部分.就像节点是集群中的资源一样,PV 也是集群中的资源. PV 是Volume 之 ...

  3. Oracle部署,关于日志文件系统选择(硬盘格式化、挂载)

    之前部署过好多Oracle服务,采用的日志文件系统一直是ext3.但是我观察到很多人在格式化/挂载数据盘时,采用的日志文件系统类型有ext3.ext4.xfs等,这不禁让我发出疑问,哪个类型的数据处理 ...

  4. 【操作说明】全能型H.265播放器如何使用?

    本播放器集成了公司业务的接口,包含了实播,回放,云台控制和回放速度控制,截图和全屏功能可以根据type直接初始化接口地址如果是第三方业务对接,也可以单独配置接口地址 正确使用H.265播放器需要按以下 ...

  5. jmeter接口性能测试【CSV文件读取+接口关联+设置集合点】

    一.前言 周计划上安排了个接口性能测试的任务,便开始了职业生涯的第一个接口性能测试... 接口进行压测之前,首先需要调通脚本.有两种方式,一种是通过抓包工具(如fiddler)抓取业务接口:另一种是通 ...

  6. springboot的全局异常处理类

    import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import or ...

  7. C#自定义控件(3)—PanelHead控件

    有时候我们会需要这样一种控件效果,上面是标题,下面是另外一个区域,且分别需要设置不同的颜 色等,当然我们可以使用splitContainer控件来制作,也可以直接使用自定义控件来,这样可以减少一 定的 ...

  8. mindxdl--common--head_handler.go

    // Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common the commo ...

  9. Android网络请求(1)

    Android网络请求(1) ​ 安卓开发网络请求可谓是安卓开发的灵魂,如果你不会网络请求,那么你开发的应用软件就是一具没有灵魂的枯骨. ​ 在安卓开发中进行网络请求和java中的网络请求有异曲同工之 ...

  10. Karmada跨集群优雅故障迁移特性解析

    摘要:在 Karmada 最新版本 v1.3中,跨集群故障迁移特性支持优雅故障迁移,确保迁移过程足够平滑. 本文分享自华为云社区<Karmada跨集群优雅故障迁移特性解析>,作者:Karm ...