在React-Native中使用ListView,我看到不一样,将道具移动到列表项,
仅使用引用将函数作为props传递,并调用子组件中的参数,或
将函数作为带有参数定义的props传递,并调用子函数中没有参数的函数
没有一个解决方案有效。
调用的函数是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 提前致谢
答案 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>
);
}
}