![](/img/trans.png)
[英]How to use react native navigation to navigate from a FlatList component to a expanded component
[英]How to add clickable FlatList item and navigate to Detail component in React Native
我有一个 FlatList 显示在主屏幕上,单击一个 FlatList 项目我想导航到 Detail 组件并将相关数据传递给 detail 组件。由于我是新手,但我已经实现了本机反应,但我正在努力实现此功能主屏幕上的 FlatList。FlatList 已在list.js
组件下实现,我想从这个组件导航到details.js
组件。
下面是我的代码:
应用程序.js
import React from 'react';
import {StatusBar, StyleSheet} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import List from './components/list';
import Detail from './components/details';
const Stack = createStackNavigator();
const App = () => {
return (
<NavigationContainer>
<StatusBar barStyle="dark-content" backgroundColor="#8E24AA"/>
<Stack.Navigator>
<Stack.Screen
name="Home"
component={List}
options={{
headerStyle: {
backgroundColor: '#AB47BC',
},
headerTintColor: '#fff' }} />
<Stack.Screen
name="Detail"
component={Detail}
options={{
headerStyle: {
backgroundColor: '#AB47BC',
},
headerTintColor: '#fff' }} />
</Stack.Navigator>
</NavigationContainer>
)
}
export default App;
列表.js
import React, {useEffect,useState} from 'react';
import {View,Text,StyleSheet,ActivityIndicator,FlatList} from 'react-native';
const List = () => {
const[post,setPost] = useState([]);
const[isLoading,setLoading] = useState(true);
useEffect(() => {
const url = 'http://api.duckduckgo.com/?q=simpsons+characters&format=json';
fetch(url).then((res) => res.json())
.then((resp) => {
setPost(resp.RelatedTopics);
setLoading(false);
}).catch((err) => alert(err));
},[]);
const FlatListItemSeparator = () => {
return (
<View
style={{
height: 0.7,
width: "100%",
backgroundColor: "#adadad"
}}
/>
);
}
return(
<View style={{flex:1,justifyContent:'center'}}>
{ isLoading ? <ActivityIndicator color="#8E24AA" size="large"/> : <FlatList
data = {post}
keyExtractor = {(item) => item.FirstURL}
renderItem = {({item}) => <Text style={styles.my}>{item.Text}</Text>}
ItemSeparatorComponent = { FlatListItemSeparator }/> }
</View>
);
};
const styles = StyleSheet.create({
my:{
marginBottom: 15,
marginTop: 15,
marginLeft: 15
}
});
export default List;
细节.js
import React from 'react';
import {View,Text} from 'react-native';
const Detail = () => {
return(
<View>
<Text>Hello there</Text>
</View>
);
};
export default Detail;
有人让我知道如何实现所需的功能。
您可以添加一个 TouchableOpacity,将您的 Text 组件包装在 renderItem 中。 将 function 添加到 onPress 然后获取导航道具并导航到详细信息屏幕,传递项目。 您可以通过 Detail 屏幕中的 route 属性访问这些数据。
const handlePress = (item) => {
navigation.navigate('Detail', item);
}
<TouchableOpacity onPress={() => {
handlePress(item);
}>
<Text style={styles.my}>{item.Text}</Text>
</TouchableOpacity>
In Detail, add the following code.
const Detail = ({navigation, route}) => {
const {Text} = route.params
return (
<View>
<Text>{Text}</Text>
</View>
);
};
Navigator 中定义的每个屏幕都会收到一个名为navigation
的道具,该道具具有链接到其他屏幕的各种方法。
List
组件定义以使用道具navigation
const List = ({navigation}) => {
...
//Add an onPress event handler
renderItem={({item}) => (
<Text onPress={navigateToDetails} style={styles.my}>
{item.Text}
</Text>
)}
使用在Stack.Navigator
中定义的带有屏幕名称的navigation.navigate
(即Detail
)导航到 Detail 屏幕。
const navigateToDetails = () => {
navigation.navigate('Detail');
};
navigation.navigate('RouteName', { /* params go here */ })
更新 onPress Function 以通过项目
renderItem={({item}) => (
<Text onPress={() => navigateToDetails(item)} style={styles.my}>
{item.Text}
</Text>
)}
// Update function definition to
const navigateToDetails = item => {
navigation.navigate('Detail', item);
};
Detail
屏幕中的参数,请阅读屏幕组件中的参数: route.params
const Detail = ({navigation, route}) => {
return (
<View>
<Text>Hello there {route.params.Text}</Text>
</View>
);
};
有关导航的更多详细信息: 这里
首先,您需要在列表组件上获取navigation prop
const List = ({navigation}) => { //<====
然后您可以使用navigation
并像这样传递数据
renderItem = {({item}) => <Text onPress={()=>navigation.navigate("Detail",{item})} style={styles.my}>{item.Text}</Text>}
并像这样在Detail
屏幕上获取您的数据
import React from 'react';
import {View,Text} from 'react-native';
const Detail = ({route}) => {
const {item}=route.params
console.log("data is =>",item)
return(
<View>
<Text>Hello there</Text>
</View>
);
};
export default Detail;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.