React-Native ListView renderRow发出传递道具。正确的方式或错误的方式

时间:2016-03-10 10:01:37

标签: android ios reactjs react-native redux

在React-Native中使用ListView,我看到不一样,将道具移动到列表项,

  1. 仅使用引用将函数作为props传递,并调用子组件中的参数,或

  2. 将函数作为带有参数定义的props传递,并调用子函数中没有参数的函数

  3. 没有一个解决方案有效。

    调用的函数是Redux的Actions创建者,并被调度。这是Redux还是React-Native(可能是ReactJS)的问题

    这是一个片段,市场为//错误的代码行无法正常工作

    class App extends Component {
    
      // On props 
      // data: an Array
      // doThis: an action creator of Redux
      // doThat: idem
    
      constructor(){
        super();
        this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
      }
    
      render () {
        const dataSource = this.ds.cloneWithRows(this.props.data);
    
        return (
          <View>
            <ListView style={{flex:1}}
                dataSource={dataSource}
                renderRow={(rowData, sectionID, rowID) =>
                  <Item  rowData={rowData}
                  //ERROR
                  //onPress={this.props.doThis}
                  //onLongPress={this..props.doThat}
                  //RIGHT NO ERROR TOO
                  onPress={() => this.props.doThis(rowData)}
                  onLongPress={() => this.props.doThat(rowData)}
                  />
                }
              />
          </View>
        )
      }
    }
    
    class Item extends Component {
      render() {
        return (
          <View>
            <TouchableHighlight
              //ERROR 
              //onPress={() => { this.props.onPress( this.props.rowData ) }}
              //onLongPress={() => { this.props.onLongPress( this.props.rowData ) }}
              //WRONG TOO
              onPress={this.props.onPress}
              onLongPress={this.props.onLongPress}
              >
              <Text>
                {rowData}
              </Text>
            </TouchableHighlight>
          </View>
        );
      }
    }
    

    这里有一个有这个问题的回购https://github.com/srlopez/test 提前致谢

2 个答案:

答案 0 :(得分:4)

如果你的高级回调接受一个参数,你需要确保你的匿名函数也接受一个参数(注意:使用箭头语法创建匿名函数会自动将我们的函数绑定到this的值{目前的情况)。我认为您目睹了一系列问题,其中您的回调被绑定到不正确的上下文(窗口),或者您不接受传递的参数:

class App extends Component {

  // On props 
  // data: an Array
  // doThis: an action creator of Redux
  // doThat: idem

  constructor(){
    super();
    this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
  }

  render () {
    const dataSource = this.ds.cloneWithRows(this.props.data);

    return (
      <View>
        <ListView style={{flex:1}}
            dataSource={dataSource}
            renderRow={(rowData, sectionID, rowID) => 
              <Item rowData={rowData}
                  onPress={(data) => this.props.doThis(data)}
                  onLongPress={(data) => this.props.doThat(data)} />
            }/>
      </View>
    )
  }
}

class Item extends Component {
  render() {
    return (
      <View>
        <TouchableHighlight
          onPress={() => this.props.onPress(this.rowData)}
          onLongPress={() => this.props.onLongPress(this.rowData)}>
          <Text>
            {rowData}
          </Text>
        </TouchableHighlight>
      </View>
    );
  }
}

答案 1 :(得分:0)

你的this关闭时没有设置好可能是个问题。

尝试以这种方式绑定它:

class Item extends Component {
  render() {
    return (
      <View>
        <TouchableHighlight
          onPress={this.props.onPress.bind(this, this.props.rowData)}
          onLongPress={this.props.onLongPress.bind(this, this.props.rowData)}
          >
          <Text>
            {rowData}
          </Text>
        </TouchableHighlight>
      </View>
    );
  }
}