如何使用 onClick 触发两个函数 reactJs
How to use onClick to fire two functions reactJs
对 React Js 还很陌生,所以请多多包涵...
我在子组件中使用 onClick 来更改父组件的状态。父状态是一个布尔值,它又用于在与被单击的元素分开的元素上打开和关闭 class。像这样:
在Parent.js中(仅相关代码):
constructor(props) {
super(props);
this.state = {
elementOpen: false;
}
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({
elementOpen: !this.state.bucketListOpen
})
}
render() {
return (
<Child
className = {this.state.elementOpen ? "open" : "closed"}
toggleClassName = {this.handleClick}
/>
)
}
在Child.js中(仅相关代码):
render() {
return (
<div>
<div className={this.props.className}>Test</div>
<a onClick={this.props.toggleClassName}>Click Me</a>
</div>
)
}
... 这很好用。没问题。当我想将 Child 组件中的 {this.props.toggleClassName} 移动到一个处理函数中时,问题就出现了(原因是我可以在点击时触发多个事件)。简而言之,它停止工作了。
我试过在 Child 组件中创建一个方法并将 prop 放入方法中,如下所示:
handleClassSwitch() {
return this.props.toggleClassName;
}
render() {
return (
<div>
<div className={this.props.className}>Test</div>
<a onClick={this.handleClassSwitch}>Click Me</a>
</div>
)
}
...但遗憾的是它不起作用,我很困惑。可能真的很明显,但我在这里挣扎。任何帮助表示赞赏。
您可以在 handleClassSwitch
中调用多个函数,但您需要使用 ()
.
来调用这些方法
像这样:
handleClassSwitch() {
this.props.toggleClassName(); // notice ()
function2();
function3();
}
注意:不要忘记在子组件中绑定handleClassSwitch
方法,要么在构造函数中绑定,要么使用箭头函数。
检查此代码段以了解两者之间的区别:
function abc() {
console.log('calling abc');
return 1;
}
console.log('without () => ', abc);
console.log('with () => ', abc());
您目前没有像绑定 Parent
组件中的 handleClick
那样绑定 handleClassSwitch
函数。
如果您也将其绑定到 Child
组件中,它将起作用。如果您愿意,也可以将 handleClassSwitch
变成箭头函数。
class Child {
handleClassSwitch = () => {
this.props.toggleClassName();
};
render() {
return (
<div>
<div className={this.props.className}>Test</div>
<a onClick={this.handleClassSwitch}>Click Me</a>
</div>
);
}
}
看来您实际上不再调用 toggleClassName
了。当您单击 a
标记时,它会调用 handleClassSwitch
,其中 returns 是对 toggleClassName
的引用,而不是调用它。试试这样写:
handleClassSwitch = () => {
this.props.toggleClassName();
}
请注意,我使用 =>
语法绑定 handleClassSwitch
,因此它可以访问 this
对 React Js 还很陌生,所以请多多包涵...
我在子组件中使用 onClick 来更改父组件的状态。父状态是一个布尔值,它又用于在与被单击的元素分开的元素上打开和关闭 class。像这样:
在Parent.js中(仅相关代码):
constructor(props) {
super(props);
this.state = {
elementOpen: false;
}
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({
elementOpen: !this.state.bucketListOpen
})
}
render() {
return (
<Child
className = {this.state.elementOpen ? "open" : "closed"}
toggleClassName = {this.handleClick}
/>
)
}
在Child.js中(仅相关代码):
render() {
return (
<div>
<div className={this.props.className}>Test</div>
<a onClick={this.props.toggleClassName}>Click Me</a>
</div>
)
}
... 这很好用。没问题。当我想将 Child 组件中的 {this.props.toggleClassName} 移动到一个处理函数中时,问题就出现了(原因是我可以在点击时触发多个事件)。简而言之,它停止工作了。
我试过在 Child 组件中创建一个方法并将 prop 放入方法中,如下所示:
handleClassSwitch() {
return this.props.toggleClassName;
}
render() {
return (
<div>
<div className={this.props.className}>Test</div>
<a onClick={this.handleClassSwitch}>Click Me</a>
</div>
)
}
...但遗憾的是它不起作用,我很困惑。可能真的很明显,但我在这里挣扎。任何帮助表示赞赏。
您可以在 handleClassSwitch
中调用多个函数,但您需要使用 ()
.
像这样:
handleClassSwitch() {
this.props.toggleClassName(); // notice ()
function2();
function3();
}
注意:不要忘记在子组件中绑定handleClassSwitch
方法,要么在构造函数中绑定,要么使用箭头函数。
检查此代码段以了解两者之间的区别:
function abc() {
console.log('calling abc');
return 1;
}
console.log('without () => ', abc);
console.log('with () => ', abc());
您目前没有像绑定 Parent
组件中的 handleClick
那样绑定 handleClassSwitch
函数。
如果您也将其绑定到 Child
组件中,它将起作用。如果您愿意,也可以将 handleClassSwitch
变成箭头函数。
class Child {
handleClassSwitch = () => {
this.props.toggleClassName();
};
render() {
return (
<div>
<div className={this.props.className}>Test</div>
<a onClick={this.handleClassSwitch}>Click Me</a>
</div>
);
}
}
看来您实际上不再调用 toggleClassName
了。当您单击 a
标记时,它会调用 handleClassSwitch
,其中 returns 是对 toggleClassName
的引用,而不是调用它。试试这样写:
handleClassSwitch = () => {
this.props.toggleClassName();
}
请注意,我使用 =>
语法绑定 handleClassSwitch
,因此它可以访问 this