【问题标题】:Outputting an array of react components and having access to parent's "this" using a a prop within child输出一组反应组件并使用子级中的道具访问父级的“this”
【发布时间】:2018-05-29 03:22:05
【问题描述】:

我有一个组件数组,它们都是我通过道具注入到它的父级的单独视图

const steps = 
[ <StepOne wizardContext={shippingObj.from} onAction={this.handleFrom}/>,
  <StepTwo wizardContext={shippingObj.to} onAction={this.handleFrom} />,
  <StepThree wizardContext={shippingObj.weight} onAction={this.handleFrom} />,
  <StepFour wizardContext={shippingObj.shippingOption} onAction={this.handleFrom} />,
  <Confirm wizardContext={shippingObj} onAction={this.handleFrom} />
]
<Wizard steps={steps}/>

在向导组件中,我根据实际步骤呈现每个步骤

{this.props.steps[this.state.compState]}

在向导组件中我也有一个方法

  handleFrom(val) {
    let state = val.stage,
    key = Object.keys(val)[0];
    this.setState({
      wizardContext: { ...this.state.wizardContext, [key]: val[key]}
    })
  }

然而 onAction 是未定义的,这意味着它无权访问“this”

如果我将它们中的每一个单独包含在父向导组件中,我确实可以访问它并且它可以工作

/*THIS WORKS */
switch (this.state.compState) {
      case 1:
        return <StepOne onAction={this.handleFrom} data={this.state.wizardContext.from} />
      case 2:
        return <StepTwo onAction={this.handleFrom} data={this.state.wizardContext.to} />
      case 3:
        return <StepThree onAction={this.handleFrom} data={this.state.wizardContext} />
      case 4:
        return <StepFour onAction={this.handleFrom} data={this.state.wizardContext.shippingOption} />
      case 5: 
        return <Confirm shippingLabel={this.state.wizardContext} labelkeys={this.shippingKeys} />
    }

但是我想将步骤与实际向导分离

如果子组件是一个组件数组,是否有办法从子组件访问此方法或父方法?有没有更清洁的方法来做到这一点? 组件将呈现只是无法访问道具中的“this” 任何建设性的反馈表示赞赏

【问题讨论】:

    标签: javascript arrays reactjs components


    【解决方案1】:

    问题是您在Wizard 组件之外创建steps 数组,因此this 上下文不指向Wizard(因此没有适当的handleFrom方法)。

    您可以通过在Wizardrender 方法中动态注入正确的this.handleFrom 方法作为道具来解决此问题。首先,从 steps 数组中删除 onAction 属性:

    const steps = 
    [ <StepOne wizardContext={shippingObj.from} />,
      <StepTwo wizardContext={shippingObj.to} />,
      <StepThree wizardContext={shippingObj.weight} />,
      <StepFour wizardContext={shippingObj.shippingOption} />,
      <Confirm wizardContext={shippingObj} />
    ]
    <Wizard steps={steps}/>
    

    然后,替换这一行:

    {this.props.steps[this.state.compState]}
    

    用这个:

    {
        React.cloneElement(
          this.props.steps[this.state.compState],
          {onAction: this.handleFrom}
        )
    }
    

    确保Wizard 的构造函数中有this.handleFrom = this.handleFrom.bind(this);,以便绑定适当的上下文。

    这里发生的情况是steps 数组的上下文没有this.handleFrom。因此,您将 onAction={this.handleFrom} 属性注入到 Wizard 组件中,其中适当的上下文可用。有关cloneElement 的更多信息,请参阅this question and answer

    【讨论】:

    • 感谢 jdupont 的反馈 - 我需要使用来自孩子的数据更新父状态,并且 handleFrom 方法需要在向导中我仍然无法访问“this”并且我已绑定它正确
    • 您介意显示将 handleFrom 方法绑定到 this 的代码吗?
    • 在Wizard的构造函数中
    • this.handleFrom = this.handleFrom.bind(this);
    • 啊完美!不知道你可以以这种方式使用 React.cloneElement 实际上从未使用过它 - 非常感谢 - 我会检查你的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多