【问题标题】:how to bind the function in parent component?如何绑定父组件中的函数?
【发布时间】:2018-04-05 04:20:59
【问题描述】:

import * as React from 'react';

export default class Parent extends React.Component {
  loadData() {
    return {
      valueA: this.props.intl.formatMessage({id: 'app.placeHolder'}),
      valueB: this.getTheValue
    };
  }
  getTheValue(value) {
    return this.props.intl.formatMessage({id: 'app.placeHolder'}, {price: value});
  }

  render() {
    return <Child data={this.loadData()} />;
  }
}

class Child extends React.Component {
  render() {
    return <div>{this.props.data.valueB(1000)}</div>;
  }
}

我有上面的代码,我想在子组件中使用getTheValue函数。这里我需要在父组件中绑定getTheValue函数。我使用以下2种方式绑定

1)  getTheValue = (value) => {
return this.props.someFunc('placeHolder', value);
}

2) valueB: () => this.getTheValue()

主要问题是,这两种方式出现以下错误。

[ 'Warning: Cannot update during an existing state transition (such as within `render` or another component\'s constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to `componentWillMount`.' ]

我想知道这个错误是否与绑定有关?我绑定正确吗? 代码可以通过其中一种方式正常工作,但是当我运行测试但通过测试没有任何问题时出现错误。但我想删除错误。

【问题讨论】:

  • 您拥有的箭头功能应该正确绑定。该错误意味着您以某种方式在渲染函数中调用状态更新

标签: javascript reactjs ecmascript-6 redux jestjs


【解决方案1】:

this.props.someFunc('placeHolder', value) 是什么?它是在改变状态吗?

【讨论】:

  • 其实就是this.props.intl.formatMessage({id: 'app.placeHolder'}, {price: value});使用 reactIntl​​ formatmessage 函数
  • 代码可以通过这些方式正常工作,但是当我运行测试但通过测试没有任何问题时出现错误。但我想删除错误。
【解决方案2】:

在父级中,您正在调用 loadData(),它作为子级渲染操作的一部分被执行,并且 loadData 正在通过调用 someFunc 来创建对象 - 所以在渲染 Child 时,道具会发生变化。

试试这样的:

  render() {
    let data = this.loadData();
    return <Child data={data} />;
  }

【讨论】:

  • 我想我们可能需要更多地了解“someFunc”
  • 这里是实际的 someFunc -> this.props.intl.formatMessage({id: 'app.placeHolder'}, {price: value});
  • 这会一直在父树上。很抱歉我没能提供帮助,但我认为这有一些基本问题——我认为孩子不应该递归地爬上渲染树的这么高来取回它的道具。您可能希望查看 Redux 之类的东西,以便将 intl 保存在全球商店或类似的东西中。
【解决方案3】:

你的绑定没问题

parent 中,您正在通过调用this.loadData() 来更新渲染函数中的状态

您可能希望重新构建在组件中加载数据的方式。也许是这样的:

export default class Parent extends React.Component {
  componentDidMount() {
    someService.loadData().then(data => {
      this.setState(data)
    });
  }

  dataIsLoaded() {
    //... check this.state to see if data is loaded
  }

  render() {
    return this.dataIsLoaded
      ? <Child data={this.state.data}
      : <p>Loading</p>
  }
}

【讨论】:

  • 我猜也一样,但如何绑定它。我遵循了两种方法,但仍然遇到同样的问题
猜你喜欢
  • 2018-07-09
  • 2020-06-28
  • 2012-12-25
  • 1970-01-01
  • 2018-07-03
  • 2018-05-01
  • 1970-01-01
  • 2017-03-21
  • 2020-08-13
相关资源
最近更新 更多