如何重用具有不同 route.params React-Navigation 的 Screen?
How to reuse Screen with different route.params React-Navigation?
我正在尝试通过不同的查询重用我的主屏幕,以下是我的代码。但是 route.params
未定义。
//screen I want to reuse
const Home = () => {
const [products, setProducts] = useState([]);
const route = useRoute();
const navigation = useNavigation();
console.log(route);
useEffect(() => {
if (route.params?.data) {
console.log(route.params?.data);
// Post updated, do something with `route.params.post`
// For example, send the post to the server
}
const fetchProducts = async () => {
const results = await DataStore.query(Product);
setProducts(results);
};
fetchProducts();
}, [route.params?.data]);
return (
<View>
<FlatList
data={products}
renderItem={({item}) => <Post post={item} />}
showsVerticalScrollIndicator={false}
snapToInterval={Dimensions.get('window').height - 70}
snapToAlignment={'start'}
decelerationRate={'fast'}
removeClippedSubviews={true}
/>
</View>
);
};
const ProfileScreen = () => {
const [user, setUser] = useState([]);
const [product, setProduct] = useState([]);
const route = useRoute();
const navigation = useNavigation();
const userid = route.params.data;
//const picture = await DataStore.query(Post, "123");
useEffect(() => {
DataStore.query(User, userid).then(setUser);
const fetchProducts = async () => {
const userProduct = (await DataStore.query(Product)).filter(
c => c.user.id === userid,
);
//console.log('products', userProduct);
setProduct(userProduct);
};
fetchProducts();
}, []);
const thumbPress = post => {
navigation.navigate('HomeScreen', {data: post});
console.log(post);
};
//console.log(product);
return (
<ScrollView>
<View style={styles.container}>
<View style={styles.profile}>
<Image source={{uri: user.imageUri}} style={styles.profilePicture} />
<Text>{user.username}</Text>
</View>
{product.map((post, index) => (
<View style={[styles.box]} key={index}>
<TouchableOpacity onPress={thumbPress.bind(this, post)}>
<Image source={{uri: post.images[0]}} style={styles.thumbnail} />
</TouchableOpacity>
</View>
))}
</View>
</ScrollView>
);
};
export default ProfileScreen;
const Stack = createStackNavigator();
const RootNavigation = () => {
return (
<NavigationContainer>
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
headerShown: false,
}}>
<Stack.Screen name="Home" component={HomeBottomTabNavigator} />
<Stack.Screen
options={{
headerShown: false,
title: 'AuthScreen',
}}
name="AuthScreen"
component={AuthScreen}
/>
<Stack.Screen
options={{
headerShown: true,
title: 'Post',
}}
name="CreatePost"
component={CreatePost}
/>
<Stack.Screen
options={{
headerShown: true,
title: 'Profile',
}}
name="ProfileScreen"
component={ProfileScreen}
/>
<Stack.Screen
options={{
headerShown: false,
title: 'Camera',
}}
name="Camera"
component={Camera}
/>
<Stack.Screen
options={{
headerShown: true,
title: 'Upload Options',
}}
name="UploadScreen"
component={UploadScreen}
/>
<Stack.Screen
options={{
headerShown: false,
title: 'ProductScreen',
}}
name="ProductScreen"
component={ProductScreen}
/>
</Stack.Navigator>
</NavigationContainer>
);
};
export default RootNavigation;
const Tab = createBottomTabNavigator();
const HomeBottomTabNavigator = () => {
return (
<Tab.Navigator
tabBarOptions={{
tabStyle: {
borderStartColor: 'red',
},
activeTintColor: 'white',
}}>
<Tab.Screen
name={'Home'}
component={Home}
options={{
tabBarIcon: ({color}) => <Entypo name={'home'} size={24} />,
}}
/>
<Tab.Screen
name={'Upload'}
component={UploadScreen}
options={{
tabBarIcon: ({color}) => (
<Ionicons name={'person-outline'} size={24} />
),
}}
/>
<Tab.Screen
name={'Search'}
component={Home}
options={{
tabBarIcon: ({color}) => <AntDesign name={'search1'} size={24} />,
}}
/>
<Tab.Screen
name={'Profile'}
component={ProfileScreen}
options={{
tabBarIcon: ({color}) => (
<Ionicons name={'person-outline'} size={24} />
),
}}
/>
</Tab.Navigator>
);
};
我是 React Native 和导航库的新手。谢谢。
在 ProfileScreen 中,您正在立即调用您的 thumbPress 函数并且您也绑定到它,但它不是 class 组件。你应该这样做;
<TouchableOpacity onPress={() => thumbPress(post)}>
<Image source={{uri: post.images[0]}} style={styles.thumbnail} />
</TouchableOpacity>
您的主屏幕名称也是“Home”,您正在路由到“HomeScreen”。
我正在尝试通过不同的查询重用我的主屏幕,以下是我的代码。但是 route.params
未定义。
//screen I want to reuse
const Home = () => {
const [products, setProducts] = useState([]);
const route = useRoute();
const navigation = useNavigation();
console.log(route);
useEffect(() => {
if (route.params?.data) {
console.log(route.params?.data);
// Post updated, do something with `route.params.post`
// For example, send the post to the server
}
const fetchProducts = async () => {
const results = await DataStore.query(Product);
setProducts(results);
};
fetchProducts();
}, [route.params?.data]);
return (
<View>
<FlatList
data={products}
renderItem={({item}) => <Post post={item} />}
showsVerticalScrollIndicator={false}
snapToInterval={Dimensions.get('window').height - 70}
snapToAlignment={'start'}
decelerationRate={'fast'}
removeClippedSubviews={true}
/>
</View>
);
};
const ProfileScreen = () => {
const [user, setUser] = useState([]);
const [product, setProduct] = useState([]);
const route = useRoute();
const navigation = useNavigation();
const userid = route.params.data;
//const picture = await DataStore.query(Post, "123");
useEffect(() => {
DataStore.query(User, userid).then(setUser);
const fetchProducts = async () => {
const userProduct = (await DataStore.query(Product)).filter(
c => c.user.id === userid,
);
//console.log('products', userProduct);
setProduct(userProduct);
};
fetchProducts();
}, []);
const thumbPress = post => {
navigation.navigate('HomeScreen', {data: post});
console.log(post);
};
//console.log(product);
return (
<ScrollView>
<View style={styles.container}>
<View style={styles.profile}>
<Image source={{uri: user.imageUri}} style={styles.profilePicture} />
<Text>{user.username}</Text>
</View>
{product.map((post, index) => (
<View style={[styles.box]} key={index}>
<TouchableOpacity onPress={thumbPress.bind(this, post)}>
<Image source={{uri: post.images[0]}} style={styles.thumbnail} />
</TouchableOpacity>
</View>
))}
</View>
</ScrollView>
);
};
export default ProfileScreen;
const Stack = createStackNavigator();
const RootNavigation = () => {
return (
<NavigationContainer>
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
headerShown: false,
}}>
<Stack.Screen name="Home" component={HomeBottomTabNavigator} />
<Stack.Screen
options={{
headerShown: false,
title: 'AuthScreen',
}}
name="AuthScreen"
component={AuthScreen}
/>
<Stack.Screen
options={{
headerShown: true,
title: 'Post',
}}
name="CreatePost"
component={CreatePost}
/>
<Stack.Screen
options={{
headerShown: true,
title: 'Profile',
}}
name="ProfileScreen"
component={ProfileScreen}
/>
<Stack.Screen
options={{
headerShown: false,
title: 'Camera',
}}
name="Camera"
component={Camera}
/>
<Stack.Screen
options={{
headerShown: true,
title: 'Upload Options',
}}
name="UploadScreen"
component={UploadScreen}
/>
<Stack.Screen
options={{
headerShown: false,
title: 'ProductScreen',
}}
name="ProductScreen"
component={ProductScreen}
/>
</Stack.Navigator>
</NavigationContainer>
);
};
export default RootNavigation;
const Tab = createBottomTabNavigator();
const HomeBottomTabNavigator = () => {
return (
<Tab.Navigator
tabBarOptions={{
tabStyle: {
borderStartColor: 'red',
},
activeTintColor: 'white',
}}>
<Tab.Screen
name={'Home'}
component={Home}
options={{
tabBarIcon: ({color}) => <Entypo name={'home'} size={24} />,
}}
/>
<Tab.Screen
name={'Upload'}
component={UploadScreen}
options={{
tabBarIcon: ({color}) => (
<Ionicons name={'person-outline'} size={24} />
),
}}
/>
<Tab.Screen
name={'Search'}
component={Home}
options={{
tabBarIcon: ({color}) => <AntDesign name={'search1'} size={24} />,
}}
/>
<Tab.Screen
name={'Profile'}
component={ProfileScreen}
options={{
tabBarIcon: ({color}) => (
<Ionicons name={'person-outline'} size={24} />
),
}}
/>
</Tab.Navigator>
);
};
我是 React Native 和导航库的新手。谢谢。
在 ProfileScreen 中,您正在立即调用您的 thumbPress 函数并且您也绑定到它,但它不是 class 组件。你应该这样做;
<TouchableOpacity onPress={() => thumbPress(post)}>
<Image source={{uri: post.images[0]}} style={styles.thumbnail} />
</TouchableOpacity>
您的主屏幕名称也是“Home”,您正在路由到“HomeScreen”。