从React-Native ListView行中的子组件调用父函数

时间:2016-05-11 21:44:49

标签: function listview react-native row components

我已经看到了这个问题的一些例子,但无法让任何工作,或完全理解它们如何组合在一起。我有一个名为ParentListView的组件和另一个名为ChildCell的组件(listView中的一行)我希望onPress中的ChildCell调用ParentListView中的一个函数

class ChildCell extends Component {

  pressHandler() {
    this.props.onDonePress;
  }

  render() {
    return (
        <TouchableHighlight onPress={() => this.pressHandler()} >
          <Text>Child Cell Button</Text>
        </TouchableHighlight>
    );
  }

}

ParentListView

class ParentListView extends Component {  

//...

  render() {

    return (
      <ListView
        dataSource={this.state.dataSource}
        style={styles.listView}
        renderRow={this.renderCell}
        renderSectionHeader={this.renderSectionHeader}
        />
    );
  }

  renderCell() {
    return (
      <ChildCell onDonePress={() => this.onDonePressList()} />
    )
  }

  onDonePressList() {
    console.log('Done pressed in list view')
  }

}

我认为这是所有相关的代码。我可以让媒体注册希望ChildCell,但无法在ParentListView中触发该方法。我错过了什么?

提前致谢!

更新1:

ParentListView中,如果我更改传入的道具:

<ChildCell onDonePress={this.onDonePressList.bind(this)} />

渲染单元格时,我在编译时遇到Unhandled JS Exception: null is not an object (evaluating 'this.onDonePressList')错误。

如果我直接将console.log放入:

<ChildCell onDonePress={() => console.log('Done pressed in list view')} />

它会正确记录信息。

如果我像原来一样离开它:

<ChildCell onDonePress={() => this.onDonePressList()} />

使用Unhandled JS Exception: null is not an object (evaluating '_this2.onDonePressList')

在buttonPress上崩溃

更新2:

好的,我尝试在构造函数中绑定方法,如下所示:

class ParentListView extends Component {
  constructor(props) {
    super(props);
    this.onDonePressList = this.onDonePressList.bind(this);
    this.state = {...};
}

但是它给了我这个错误:null is not an object (evaluating 'this.onDonePressList')并且不会运行。

更新3: Here is a link to a react native playground

1 个答案:

答案 0 :(得分:6)

尝试在onDonePress中调用pressHandler,如下所示:

pressHandler() {
  this.props.onDonePress()
}

另外,将this绑定到renderRowrenderSectionHeader

<ListView
    dataSource={this.state.dataSource}
    style={styles.listView}
    renderRow={this.renderCell.bind(this)}
    renderSectionHeader={this.renderSectionHeader.bind(this)}
    />

我使用上面的函数设置了一个示例here

https://rnplay.org/apps/DcdAuw