使用 Vuex 和 Onboard.js 超出最大调用堆栈大小错误
Maximum call stack size exceeded error using Vuex and Onboard.js
我正在尝试使用 Vuex 和 Onboard.js 在我的 DApp 中存储 web3 提供程序,但是当我尝试提交 selected 钱包时,我一直收到 Maximum call stack size exceeded
在我的州,这是我的文件的样子:
store/ethers.js
import { ethers } from 'ethers';
import Onboard from 'bnc-onboard';
export const state = () => ({
address: '',
onboard: null,
wallet: null,
});
export const actions = {
async initOnboard({ commit, state }) {
const onboard = Onboard({
networkId: 4,
walletSelect: {
wallets: [
{ walletName: 'metamask' },
],
},
subscriptions: {
wallet: (wallet) => {
// If I comment out this line it works...
commit('SET_WALLET', wallet);
localStorage.setItem('wallet', wallet.name);
},
address: (address) => {
commit('SET_ADDRESS', address);
},
},
});
if (localStorage.getItem('wallet')) {
await onboard.walletSelect(localStorage.getItem('wallet'));
}
commit('SET_ONBOARD', onboard);
},
};
export const mutations = {
SET_WALLET(state, wallet) {
state.wallet = wallet;
},
SET_ONBOARD(state, onboard) {
state.onboard = onboard;
},
SET_ADDRESS(state, address) {
state.address = address;
},
};
index.vue
<template>
<button @click="connect">
Connect
</button>
</template>
<script>
import { mapActions } from 'vuex';
export default {
mounted() {
this.$store.dispatch('ethers/initOnboard');
},
methods: {
...mapActions('ethers', ['connect']),
},
};
</script>
我认为 ethers
库没有问题,因为我将它换成 web3
并遇到了同样的问题。如果我注释掉 commit('SET_WALLET', wallet);
行,错误就消失了,但我需要一种在我的应用程序中访问它的方法。
我认为我商店中的 commits
有问题,它导致了一些递归,但我一直无法弄清楚它是什么。
这里是 link 问题的重现,您需要安装 metamask。如果您单击“连接”按钮和 select“metamask”,您将在控制台中看到错误。
预览: https://f6875.sse.codesandbox.io/
编辑: https://codesandbox.io/s/upbeat-ardinghelli-f6875?file=/pages/index.vue
这个答案为我指明了正确的方向:
因此在调用 commit
时冻结对象解决了问题:
commit('SET_WALLET', Object.freeze(wallet));
虽然我不确定为什么会这样。
我正在尝试使用 Vuex 和 Onboard.js 在我的 DApp 中存储 web3 提供程序,但是当我尝试提交 selected 钱包时,我一直收到 Maximum call stack size exceeded
在我的州,这是我的文件的样子:
store/ethers.js
import { ethers } from 'ethers';
import Onboard from 'bnc-onboard';
export const state = () => ({
address: '',
onboard: null,
wallet: null,
});
export const actions = {
async initOnboard({ commit, state }) {
const onboard = Onboard({
networkId: 4,
walletSelect: {
wallets: [
{ walletName: 'metamask' },
],
},
subscriptions: {
wallet: (wallet) => {
// If I comment out this line it works...
commit('SET_WALLET', wallet);
localStorage.setItem('wallet', wallet.name);
},
address: (address) => {
commit('SET_ADDRESS', address);
},
},
});
if (localStorage.getItem('wallet')) {
await onboard.walletSelect(localStorage.getItem('wallet'));
}
commit('SET_ONBOARD', onboard);
},
};
export const mutations = {
SET_WALLET(state, wallet) {
state.wallet = wallet;
},
SET_ONBOARD(state, onboard) {
state.onboard = onboard;
},
SET_ADDRESS(state, address) {
state.address = address;
},
};
index.vue
<template>
<button @click="connect">
Connect
</button>
</template>
<script>
import { mapActions } from 'vuex';
export default {
mounted() {
this.$store.dispatch('ethers/initOnboard');
},
methods: {
...mapActions('ethers', ['connect']),
},
};
</script>
我认为 ethers
库没有问题,因为我将它换成 web3
并遇到了同样的问题。如果我注释掉 commit('SET_WALLET', wallet);
行,错误就消失了,但我需要一种在我的应用程序中访问它的方法。
我认为我商店中的 commits
有问题,它导致了一些递归,但我一直无法弄清楚它是什么。
这里是 link 问题的重现,您需要安装 metamask。如果您单击“连接”按钮和 select“metamask”,您将在控制台中看到错误。
预览: https://f6875.sse.codesandbox.io/
编辑: https://codesandbox.io/s/upbeat-ardinghelli-f6875?file=/pages/index.vue
这个答案为我指明了正确的方向:
因此在调用 commit
时冻结对象解决了问题:
commit('SET_WALLET', Object.freeze(wallet));
虽然我不确定为什么会这样。