函数不调用 React 中的 onclick 事件
Function is not calling on onclick event in React
这里我只想在单击按钮时调用一个 walletconnect
函数。但它没有调用任何函数。如果我哪里不对,请纠正我。
App.tsx
import * as React from 'react';
import WalletConnect from "@walletconnect/client";
import QRCodeModal from "@walletconnect/qrcode-modal";
class App extends React.Component<any, any> {
constructor(props:any) {
super(props)
this.state = {
address: ''
}
const connector = new WalletConnect({
bridge: "https://bridge.walletconnect.org", // Required
qrcodeModal: QRCodeModal,
});
}
walletConnectFunc = async () => {
const connector = new WalletConnect({
bridge: "https://bridge.walletconnect.org", // Required
qrcodeModal: QRCodeModal,
});
if (connector.connected) {
alert("already connected")
return
}
connector.createSession();
connector.on("connect", async (error, payload) => {
console.log("connect")
if (error) {
throw error;
}
// Get provided accounts and chainId
const { accounts, chainId } = payload.params[0];
console.log("connect account", accounts)
console.log("chainid account", chainId)
const obj = {
"address": accounts[0],
}
this.setState({ address: obj.address })
console.log(this.state.address)
alert(this.state.address)
})
}
render() {
return (
<div className="App">
<div>
<button className="btn btn-primary my-4" type="button" onClick={() => this.walletConnectFunc()}>WalletConnect</button>
</div>
</div>
);
}
}
export default App;
如果需要更多代码,请在评论部分告诉我。我会用这些信息更新我的问题。
我想您在这里缺少的是绑定 class 方法。你只需要像这样在构造函数上编写绑定方法:
...
constructor(props:any) {
super(props)
this.state = {
address: ''
}
this.walletConnectFunc = this.walletConnectFunc.bind(this);
...
首先,你应该去掉多余的async
关键字,只要walletConnectFunc()
就够了。仅仅是因为,在你的函数中不要调用任何 await
关键字,所以那没有意义。
其次,您只需像 onClick={this.walletConnectFunc}
一样监听事件 onClick 以避免在渲染中创建额外的功能(作为@Zac Anger 的建议)
最后, 如果您必须在函数内部访问 this
,请使用 arrow function
或者您也可以绑定 this
上下文这样(对我来说,我强烈建议使用第三种方式来提高性能)
总之,在使用context
的时候只需要使用arrow function
。
import React, { Component } from "react";
import "./styles.css";
export default class extends Component {
constructor(props) {
super(props);
this.state = {
address: ""
};
this.walletConnectFuncAsync = this.walletConnectFuncAsync.bind(this);
}
async walletConnectFuncAsync() {
await this.sleep(1000);
}
sleep(ms) {
return new Promise((resolve) => {
setTimeout(() => alert("Woke up after " + ms + "ms"), ms);
});
}
walletConnectFunc() {
alert(123);
}
render() {
return (
<div className="App">
<div>
<button
className="btn btn-primary my-4"
type="button"
onClick={this.walletConnectFunc}
>
WalletConnect
</button>
<button
className="btn btn-primary my-4"
type="button"
onClick={this.walletConnectFuncAsync}
>
WalletConnect_Async
</button>
</div>
</div>
);
}
}
这里我只想在单击按钮时调用一个 walletconnect
函数。但它没有调用任何函数。如果我哪里不对,请纠正我。
App.tsx
import * as React from 'react';
import WalletConnect from "@walletconnect/client";
import QRCodeModal from "@walletconnect/qrcode-modal";
class App extends React.Component<any, any> {
constructor(props:any) {
super(props)
this.state = {
address: ''
}
const connector = new WalletConnect({
bridge: "https://bridge.walletconnect.org", // Required
qrcodeModal: QRCodeModal,
});
}
walletConnectFunc = async () => {
const connector = new WalletConnect({
bridge: "https://bridge.walletconnect.org", // Required
qrcodeModal: QRCodeModal,
});
if (connector.connected) {
alert("already connected")
return
}
connector.createSession();
connector.on("connect", async (error, payload) => {
console.log("connect")
if (error) {
throw error;
}
// Get provided accounts and chainId
const { accounts, chainId } = payload.params[0];
console.log("connect account", accounts)
console.log("chainid account", chainId)
const obj = {
"address": accounts[0],
}
this.setState({ address: obj.address })
console.log(this.state.address)
alert(this.state.address)
})
}
render() {
return (
<div className="App">
<div>
<button className="btn btn-primary my-4" type="button" onClick={() => this.walletConnectFunc()}>WalletConnect</button>
</div>
</div>
);
}
}
export default App;
如果需要更多代码,请在评论部分告诉我。我会用这些信息更新我的问题。
我想您在这里缺少的是绑定 class 方法。你只需要像这样在构造函数上编写绑定方法:
...
constructor(props:any) {
super(props)
this.state = {
address: ''
}
this.walletConnectFunc = this.walletConnectFunc.bind(this);
...
首先,你应该去掉多余的async
关键字,只要walletConnectFunc()
就够了。仅仅是因为,在你的函数中不要调用任何 await
关键字,所以那没有意义。
其次,您只需像 onClick={this.walletConnectFunc}
一样监听事件 onClick 以避免在渲染中创建额外的功能(作为@Zac Anger 的建议)
最后, 如果您必须在函数内部访问 this
,请使用 arrow function
或者您也可以绑定 this
上下文这样(对我来说,我强烈建议使用第三种方式来提高性能)
总之,在使用context
的时候只需要使用arrow function
。
import React, { Component } from "react";
import "./styles.css";
export default class extends Component {
constructor(props) {
super(props);
this.state = {
address: ""
};
this.walletConnectFuncAsync = this.walletConnectFuncAsync.bind(this);
}
async walletConnectFuncAsync() {
await this.sleep(1000);
}
sleep(ms) {
return new Promise((resolve) => {
setTimeout(() => alert("Woke up after " + ms + "ms"), ms);
});
}
walletConnectFunc() {
alert(123);
}
render() {
return (
<div className="App">
<div>
<button
className="btn btn-primary my-4"
type="button"
onClick={this.walletConnectFunc}
>
WalletConnect
</button>
<button
className="btn btn-primary my-4"
type="button"
onClick={this.walletConnectFuncAsync}
>
WalletConnect_Async
</button>
</div>
</div>
);
}
}