使用 ES6 在 React 中将一个函数传递给多个子组件
Passing a function down multiple children components in React using ES6
我有一个 LayoutComponent
、PageComponent
和 SingleComponent
。
当我的用户单击一个按钮时,我想在我的应用程序使用 Meteor 的 FlowRouter
路由到的 NewPageComponent
上向用户显示一条消息。
为此,我将消息存储在 LayoutComponent
的状态中,然后通过 [=14] 将此消息和 handlerMethod
作为道具传递给 SingleComponent
=],这是一个无状态的功能组件。
我没有运气将 handlerMethod
正确传递给 SingleComponent
以便在 LayoutComponent
上设置消息状态。
我知道这是一个简单的语法问题,但有人可以帮我找出我的错误吗?
布局组件:
export default class LayoutComponent extends Component {
constructor() {
super();
this.state = {
message: null
};
this.handlerMethod = this.handlerMethod.bind(this);
}
handlerMethod(message) {
this.setState({ message: message });
}
render() {
// the PageComponent is actually passed via FlowRouter in this.props.content, so it needs to be cloned to add props
let contentWithProps = React.cloneElement(this.props.content, { message: this.state.message, handlerMethod: ((message) => this.handlerMethod) });
return (
<div>{contentWithProps}</div>
);
}
}
页面组件:
const PageComponent = ({ message, handlerMethod }) => {
return (
<div>
<SingleComponent message={message} handlerMethod={(message) => handlerMethod} />
</ div>
);
}
组件:
export default class SingleComponent extends Component {
constructor() {
super();
this.state = {
};
this.handleButtonClick = this.handleButtonClick.bind(this);
}
handleButtonClick(event) {
event.preventDefault();
// do some more stuff...
this.props.handlerMethod("You pressed the button!");
FlowRouter.go("newPage");
}
render() {
<div>
<button onClick={this.handleButtonClick}>button</button>
</div>
}
}
您实际上并没有在发布的代码中调用 handlerMethod
。所以这个:
handlerMethod: ((message) => this.handlerMethod)
应该是:
handlerMethod: ((message) => this.handlerMethod(message))
或者更简单地说:
handlerMethod: this.handlerMethod
你的错误是你传递了一个 return this.handlerMethod
而不是调用它的函数:
handlerMethod: ((message) => this.handlerMethod) // this returns the handlerMethod function, doesn't call it
应该是
handlerMethod: ((message) => this.handlerMethod(message))
也可以直接传:
handlerMethod: this.handlerMethod
直接传递它的原因是因为你在 LayoutComponent
的构造函数中绑定了 handlerMethod
的上下文,这意味着 handlerMethod
中的 this
将被修复到 LayoutComponent
(请参阅下面的注释)
这是一个简短的例子:
布局组件
export default class LayoutComponent extends Component {
constructor() {
// ...
this.handlerMethod = this.handlerMethod.bind(this); // handler is bound
}
handlerMethod(message) {
// ...
}
render() {
let contentWithProps = React.cloneElement(
this.props.content, {
message: this.state.message,
handlerMethod: this.handlerMethod // pass the handler directly
}
);
return <div>{contentWithProps}</div>;
}
}
页面组件
// pass the handlerMethod directly
const PageComponent = ({ message, handlerMethod }) => {
return (
<div>
<SingleComponent message={message} handlerMethod={handlerMethod} />
</ div>
);
}
单一成分
export default class SingleComponent extends Component {
// ...
handleButtonClick(event) {
// ...
this.props.handlerMethod("You pressed the button!"); // call the passed method here
// ...
}
// ...
}
注意:从技术上讲,您可以通过调用 new this.handlerMethod
来覆盖绑定 this
,但这并没有发生,所以您没问题。
如果你只是想把方法传递下去,你可以这样做:
const PageComponent = ({ message, handlerMethod }) => {
return (
<div>
<SingleComponent message={message} handlerMethod={handlerMethod} />
</ div>
);
}
我有一个 LayoutComponent
、PageComponent
和 SingleComponent
。
当我的用户单击一个按钮时,我想在我的应用程序使用 Meteor 的 FlowRouter
路由到的 NewPageComponent
上向用户显示一条消息。
为此,我将消息存储在 LayoutComponent
的状态中,然后通过 [=14] 将此消息和 handlerMethod
作为道具传递给 SingleComponent
=],这是一个无状态的功能组件。
我没有运气将 handlerMethod
正确传递给 SingleComponent
以便在 LayoutComponent
上设置消息状态。
我知道这是一个简单的语法问题,但有人可以帮我找出我的错误吗?
布局组件:
export default class LayoutComponent extends Component {
constructor() {
super();
this.state = {
message: null
};
this.handlerMethod = this.handlerMethod.bind(this);
}
handlerMethod(message) {
this.setState({ message: message });
}
render() {
// the PageComponent is actually passed via FlowRouter in this.props.content, so it needs to be cloned to add props
let contentWithProps = React.cloneElement(this.props.content, { message: this.state.message, handlerMethod: ((message) => this.handlerMethod) });
return (
<div>{contentWithProps}</div>
);
}
}
页面组件:
const PageComponent = ({ message, handlerMethod }) => {
return (
<div>
<SingleComponent message={message} handlerMethod={(message) => handlerMethod} />
</ div>
);
}
组件:
export default class SingleComponent extends Component {
constructor() {
super();
this.state = {
};
this.handleButtonClick = this.handleButtonClick.bind(this);
}
handleButtonClick(event) {
event.preventDefault();
// do some more stuff...
this.props.handlerMethod("You pressed the button!");
FlowRouter.go("newPage");
}
render() {
<div>
<button onClick={this.handleButtonClick}>button</button>
</div>
}
}
您实际上并没有在发布的代码中调用 handlerMethod
。所以这个:
handlerMethod: ((message) => this.handlerMethod)
应该是:
handlerMethod: ((message) => this.handlerMethod(message))
或者更简单地说:
handlerMethod: this.handlerMethod
你的错误是你传递了一个 return this.handlerMethod
而不是调用它的函数:
handlerMethod: ((message) => this.handlerMethod) // this returns the handlerMethod function, doesn't call it
应该是
handlerMethod: ((message) => this.handlerMethod(message))
也可以直接传:
handlerMethod: this.handlerMethod
直接传递它的原因是因为你在 LayoutComponent
的构造函数中绑定了 handlerMethod
的上下文,这意味着 handlerMethod
中的 this
将被修复到 LayoutComponent
(请参阅下面的注释)
这是一个简短的例子:
布局组件
export default class LayoutComponent extends Component {
constructor() {
// ...
this.handlerMethod = this.handlerMethod.bind(this); // handler is bound
}
handlerMethod(message) {
// ...
}
render() {
let contentWithProps = React.cloneElement(
this.props.content, {
message: this.state.message,
handlerMethod: this.handlerMethod // pass the handler directly
}
);
return <div>{contentWithProps}</div>;
}
}
页面组件
// pass the handlerMethod directly
const PageComponent = ({ message, handlerMethod }) => {
return (
<div>
<SingleComponent message={message} handlerMethod={handlerMethod} />
</ div>
);
}
单一成分
export default class SingleComponent extends Component {
// ...
handleButtonClick(event) {
// ...
this.props.handlerMethod("You pressed the button!"); // call the passed method here
// ...
}
// ...
}
注意:从技术上讲,您可以通过调用 new this.handlerMethod
来覆盖绑定 this
,但这并没有发生,所以您没问题。
如果你只是想把方法传递下去,你可以这样做:
const PageComponent = ({ message, handlerMethod }) => {
return (
<div>
<SingleComponent message={message} handlerMethod={handlerMethod} />
</ div>
);
}