如何从本机列表视图项目打开其他屏幕
How to open other screen from react-native listview item
当我在 listview
的任何项目上执行 onPress
时,我试图打开另一个屏幕。
<TouchableHighlight underlayColor={AppColors.black}
onPress={Actions.SubCategoryList(item.guid)}>
<View>
<Item style={{flexDirection: 'row', height: 50, borderBottomWidth: borderWidth}}>
<Text style={{
fontFamily: AppStyles.fontFamily,
fontSize: 17,
flex: 5,
color: AppColors.black
}}>{item.category_name}</Text>
<Item style={{flex: 1, borderBottomWidth: 0, flexDirection: 'row', justifyContent: 'flex-end'}}>
<Text style={{
color: AppColors.grey,
fontFamily: AppStyles.fontFamily,
fontSize: 17,
marginRight: 15
}}>{item.active_tournaments}</Text>
<Image resizeMode="contain" source={require('../../assets/images/right.png')}
style={{width: 15, height: 15, marginTop: 3}}/>
</Item>
</Item>
</View>
</TouchableHighlight>
但是每当我进入当前屏幕时,它会直接进入子类别屏幕而无需单击。
我想知道如何在另一个屏幕上捕获从当前屏幕发送的数据。
我试过使用列表视图点击登录,查看示例代码
constructor() {
super();
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
dataSource: ds.cloneWithRows(['row 1', 'row 2']),
};
}
<View>
<ListView
dataSource={this.state.dataSource}
renderRow={(rowData) =>
<TouchableHighlight onPress={()=>{console.log("clicked-- data-->>",rowData)}}>
<Text>{rowData}</Text>
</TouchableHighlight>}
/>
</View>
您可以轻松使用 StackNavigator,它允许您浏览屏幕、传递参数,即:您可以像这样使用某物的列表项:
class HomeScreen extends React.Component {
static navigationOptions = {
title: 'Welcome',
};
render() {
const { navigate } = this.props.navigation;
return (
<Button
title="Go to Jane's profile"
onPress={() =>
navigate('Profile', { name: 'Jane' }) // Sth. you want to pass to next view/screen
}
/>
);
}
}
然后在所需的屏幕中,您可以从道具中获取您想要的项目:ex.
initialRoute={{
component: MyScene,
title: 'My Initial Scene',
passProps: {myProp: 'foo'},
}}
另一个很好的参考:
React Navigation
ComdeMentor
问题是您实际上是立即调用 onPress
而不是将其设置为回调。您可以在以下代码中看到这一点:
onPress={Actions.SubCategoryList(item.guid)}
您有两种选择来解决这个问题。您的第一个选择是像这样在其中添加一个函数调用:
onPress={() => Actions.SubCategoryList(item.guid)}
您的第二个选择是将 Actions.SubCategoryList
函数更改为 return 回调,如下所示:
export function SubCategoryList(guid){
return () => { // this gets called by onPress
/* contents of function go here */
}
}
理想情况下,为了提高性能,您还可以保留根据 GUID 创建的回调的缓存,并 return 缓存副本而不是创建新副本。这称为记忆化,看起来像这样:
let cache = {};
export function SubCategoryList(guid){
return cache[guid] || (cache[guid] = () => {
/* contents of function go here */
})
}
当我在 listview
的任何项目上执行 onPress
时,我试图打开另一个屏幕。
<TouchableHighlight underlayColor={AppColors.black}
onPress={Actions.SubCategoryList(item.guid)}>
<View>
<Item style={{flexDirection: 'row', height: 50, borderBottomWidth: borderWidth}}>
<Text style={{
fontFamily: AppStyles.fontFamily,
fontSize: 17,
flex: 5,
color: AppColors.black
}}>{item.category_name}</Text>
<Item style={{flex: 1, borderBottomWidth: 0, flexDirection: 'row', justifyContent: 'flex-end'}}>
<Text style={{
color: AppColors.grey,
fontFamily: AppStyles.fontFamily,
fontSize: 17,
marginRight: 15
}}>{item.active_tournaments}</Text>
<Image resizeMode="contain" source={require('../../assets/images/right.png')}
style={{width: 15, height: 15, marginTop: 3}}/>
</Item>
</Item>
</View>
</TouchableHighlight>
但是每当我进入当前屏幕时,它会直接进入子类别屏幕而无需单击。
我想知道如何在另一个屏幕上捕获从当前屏幕发送的数据。
我试过使用列表视图点击登录,查看示例代码
constructor() {
super();
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
dataSource: ds.cloneWithRows(['row 1', 'row 2']),
};
}
<View>
<ListView
dataSource={this.state.dataSource}
renderRow={(rowData) =>
<TouchableHighlight onPress={()=>{console.log("clicked-- data-->>",rowData)}}>
<Text>{rowData}</Text>
</TouchableHighlight>}
/>
</View>
您可以轻松使用 StackNavigator,它允许您浏览屏幕、传递参数,即:您可以像这样使用某物的列表项:
class HomeScreen extends React.Component {
static navigationOptions = {
title: 'Welcome',
};
render() {
const { navigate } = this.props.navigation;
return (
<Button
title="Go to Jane's profile"
onPress={() =>
navigate('Profile', { name: 'Jane' }) // Sth. you want to pass to next view/screen
}
/>
);
}
}
然后在所需的屏幕中,您可以从道具中获取您想要的项目:ex.
initialRoute={{
component: MyScene,
title: 'My Initial Scene',
passProps: {myProp: 'foo'},
}}
另一个很好的参考: React Navigation ComdeMentor
问题是您实际上是立即调用 onPress
而不是将其设置为回调。您可以在以下代码中看到这一点:
onPress={Actions.SubCategoryList(item.guid)}
您有两种选择来解决这个问题。您的第一个选择是像这样在其中添加一个函数调用:
onPress={() => Actions.SubCategoryList(item.guid)}
您的第二个选择是将 Actions.SubCategoryList
函数更改为 return 回调,如下所示:
export function SubCategoryList(guid){
return () => { // this gets called by onPress
/* contents of function go here */
}
}
理想情况下,为了提高性能,您还可以保留根据 GUID 创建的回调的缓存,并 return 缓存副本而不是创建新副本。这称为记忆化,看起来像这样:
let cache = {};
export function SubCategoryList(guid){
return cache[guid] || (cache[guid] = () => {
/* contents of function go here */
})
}