使用 ES6 在 React 中将一个函数传递给多个子组件

Passing a function down multiple children components in React using ES6

我有一个 LayoutComponentPageComponentSingleComponent

当我的用户单击一个按钮时,我想在我的应用程序使用 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>
  );
}