原因就是页面刷新后页面数据都会重建导致的,数据重建那么你的对象都是一个全新的对象,如果此时websocket服务器或walletconnect钱包断开链接,回调会调用之前那个对象的事件。从而导致页面中的事件失效

以walletconnect为例子:

import Web3 from "web3"
import WalletConnectProvider from "@walletconnect/web3-provider"
import * as api from '@/api/auth.js';
import * as userAPI from '@/api/user.js';

import {
	SetItem,
	RemoveItem
} from '@/utils/auth';
const InfuraId = "774b1e4252de48c3997d66ac5f5078d8";
export default {
	provider: null,
	web3: null,
	//显示二维码
	async showQrcode() {
		if (typeof WalletConnectProvider === 'undefined') {
			return;
		}
		this.provider = new WalletConnectProvider({
			infuraId: InfuraId,
		});
		//获取钱包链接
		this.connect(this.provider);
	},
	async connect(provider){
		this.provider = provider;
		let that = this;
		await provider.enable().then(res => {
			//封装web3对象
			that.web3 = new Web3(provider);
			//初始化事件
			that.init(provider)
			//登录
			that.login(res[0]);
		}).catch(err => {
			console.log(err)
		})
	},
	async login(walletAddress) {
		api.walletLogin({
			"walletAddress": walletAddress
		}).then(res => {
			//获取token
			SetItem("V-Token", res.data);
			//获取用户信息
			userAPI.info().then(res => {
				SetItem("loginUser", res.data);
			})
		});
	},
	/**
	 * 链接建立成功
	 */
	async init(provider) {
		console.log("初始化")
		provider.on("accountsChanged", (accounts) => {
			console.log("accounts", accounts)
			provider.close() //关闭二维码
		})
		provider.on("chainChanged", (chainId) => {
			console.log("chainId", chainId)
		})
		provider.on("networkChanged", (networkId) => {
			console.log("networkId", networkId)
		})
		provider.on("disconnect", (code, reason) => {
			console.log("disconnect", code, reason)
			RemoveItem("V-Token");
			RemoveItem("loginUser");
		})
	},
	async getAccounts() {
		//  Get Accounts 获取帐户
		return await this.web3.eth.getAccounts()
		// console.log(accounts)
		// //  Get Chain Id 获取链 ID
		// const chainId = await web3.eth.getChainId()
		// console.log(chainId)
		// //  Get Network Id 获取网络 ID
		// const networkId = await web3.eth.net.getId()
		// console.log(networkId)
		// // Send Transaction 发送交易
		// const txHash = await web3.eth.sendTransaction()
		// console.log(txHash)
		// // Sign Transaction 签署交易
		// const signedTx = await web3.eth.signTransaction()
		// console.log(signedTx)
		// // Sign Message 签名留言
		// const signedMessage = await web3.eth.sign()
		// console.log(signedMessage)
		// // Sign Typed Data 签署类型的数据
		// const signedTypedData = await web3.eth.signTypedData()
		// console.log(signedTypedData)
		// // Send JSON RPC requests 发送JSON RPC请求
		// const result = await provider.request()
		// console.log(result)
	}

}

上述代码通过一个showQrcode创建与walletconnect的链接并监听此链接的状态,websocket类似。

页面刷新后如果钱包端断开链接,事件就会不执行。websocket类似。

那么只需要在app.vue重建链接即可,websocket类似。

<template>
	<div id="app">
		<div id="nav">
			<router-view />
		</div>
	</div>
</template>

<script>
	export default {
		components: {},
		data() {
			return {}
		},
		created() {
			console.log("页面刷新")
			//如果缓存中链接存在 就每次刷新页面重新建立链接
			if(this.$GetItem("walletconnect")){
				this.$web3.showQrcode();
			}
		}
	}
</script>

就可以解决,虽然解决很简单,重要的是思路,小改变解决大麻烦

Logo

前往低代码交流专区

更多推荐