动态添加圈子以与区块链反应传单
Dynamically add circles to react leaflet with blockchain
我已阅读 post 部分回答了我的问题,但我的问题是 provider.on
方法使用 setData(_data)
创建的无限循环。我只是想更新要从我的本地区块链呈现的圈子信息,但是 setData(_data)
调用创建了一个无限循环。
我试过使用全局变量而不是使用 useState
,这解决了无限循环,但是在代码的其他部分看不到这个更新的值。
function App() {
const initialPos = [55, 12];
const zoomLv = 13;
const [data, setData] = useState([])
const greeterAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3"
const provider = new ethers.providers.JsonRpcProvider("http://localhost:8545");
const contract = new ethers.Contract(greeterAddress, Greeter.abi, provider)
provider.on("block", async (blockNumber) => {
const _data = await contract.getCircle().split(", ") //[lat, lng, radius]
setData(_data)
});
function RenderCircle() {
if (data.length > 1) {
return <Circle center={[parseFloat(data[0]), parseFloat(data[1])]} radius={parseFloat(data[2])} />
}
return null
}
return (
<>
<MapContainer center={initialPos} zoom={zoomLv} id='map'>
<TileLayer
url="https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png"
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
maxZoom={20}
/>
<RenderCircle/>
</MapContainer>
</>
);
}
为了解决这个问题,我把它变成了一个反应组件class,并使用它的setState()
而不是useState()
。这避免了无限循环。
我已阅读 provider.on
方法使用 setData(_data)
创建的无限循环。我只是想更新要从我的本地区块链呈现的圈子信息,但是 setData(_data)
调用创建了一个无限循环。
我试过使用全局变量而不是使用 useState
,这解决了无限循环,但是在代码的其他部分看不到这个更新的值。
function App() {
const initialPos = [55, 12];
const zoomLv = 13;
const [data, setData] = useState([])
const greeterAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3"
const provider = new ethers.providers.JsonRpcProvider("http://localhost:8545");
const contract = new ethers.Contract(greeterAddress, Greeter.abi, provider)
provider.on("block", async (blockNumber) => {
const _data = await contract.getCircle().split(", ") //[lat, lng, radius]
setData(_data)
});
function RenderCircle() {
if (data.length > 1) {
return <Circle center={[parseFloat(data[0]), parseFloat(data[1])]} radius={parseFloat(data[2])} />
}
return null
}
return (
<>
<MapContainer center={initialPos} zoom={zoomLv} id='map'>
<TileLayer
url="https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png"
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
maxZoom={20}
/>
<RenderCircle/>
</MapContainer>
</>
);
}
为了解决这个问题,我把它变成了一个反应组件class,并使用它的setState()
而不是useState()
。这避免了无限循环。