代码之家  ›  专栏  ›  技术社区  ›  rhysclay

从components函数调用react context prop(函数)

  •  0
  • rhysclay  · 技术社区  · 6 年前

    我有一个这样工作的上下文使用者:

    <ToastConsumer>
              {({ openToast }) => (
                <button onClick={() => openToast('You clicked Button A!')}>
                  Button A
                </button>
              )}
            </ToastConsumer>
    

    但我想在单击处理程序上添加一些额外的逻辑,并像这样移动OpenToast消费者函数:

     upVote = () => {
        if (!this.state.hasVoted) {
          this.setState({
            hasVoted: true,
            rating: this.state.rating + 1,
          });
    
          this.vote(this.state.rating + 1);
        }
    
        this.openToast // not working???
      };
    
    
          <ToastConsumer>
            {({ openToast }) => (
              <div className="vote-button">
                <span
                  className="vote-up vote-action cursor-pointer"
                  onClick={this.upVote}
                >
                  👍 +1...
    

    为上下文API提供的所有示例似乎都是一个简单的单击处理程序,我无法训练如何实现像这样更复杂的示例。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Estus Flask    6 年前

    openToast 需要提供给 upVote 作为一个论点(另一个答案已经提到了), 上票 变为高阶函数:

    upVote = openToast => () => {
      // ...
      openToast();
    }
    

    用得像:

    <span onClick={this.upVote(openToast)}>
    

    避免上下文使用者如此复杂的一种方法是在类实例中提供上下文。这可以用 contextType :

    static contextType = ToastContext;
    
    upVote = openToast => () => {
      // ...
      this.context.openToast();
    }
    

    缺点是这样会限制组件与一个上下文一起使用。

    或者可以将上下文提供给具有hoc的组件:

    const withToast = Comp => props => (
        <ToastConsumer>
          {({ openToast }) => <Comp openToast={openToast} ...props/>}
        </ToastConsumer>
    );
    

    然后连接到上下文的组件 withToast(MyComponent) 接收 旋耕机 作为道具:

    upVote = openToast => () => {
      // ...
      this.props.openToast();
    }
    
        2
  •  2
  •   Jamie Dixon    6 年前

    实现这一目标的一个方法是通过 openToast 新处理程序中的函数。您可以通过包装 onClick 在函数中,或通过 upVote 功能。

    实例:

    包装在函数中:

    upVote = (openToast) => {

    onClick={() => this.upVote(openToast)}

    咖喱 上票 :

    upVote = (openToast) => () => {
    
    onClick={this.upVote(openToast)}