【发布时间】:2021-01-09 14:39:13
【问题描述】:
我正在尝试导航到 ProductDetailsScreen.js 并查看独特产品的详细信息,目前我正在使用渲染方法中的参数 id 转到独特产品。 但不幸的是,我收到错误:TypeError: Cannot read property 'params' of undefined。谁能告诉我如何正确地做到这一点,或者如果有人有正确的方法,我将不胜感激。下面是我想要做的事情:
AppNavigator.js:
import * as React from "react";
import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import HomeScreen from "../screens/HomeScreen";
import ProductsScreen from "../screens/ProductsScreen";
import ProductDetailsScreen from "../screens/ProductDetailsScreen";
const Stack = createStackNavigator();
function MainStackNavigator() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Products" component={ProductsScreen} />
<Stack.Screen name="Details" component={ProductDetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
export default MainStackNavigator;
productDetailScreen.js:
function ProductDetailsScreen(props) {
const [products, setProducts] = useState([]);
const id = props.match.params.id;
useEffect(() => {
axios
.get(`http://localhost:3000/api/products/id=${id}`)
.then((res) => {
setProducts(res.data.response);
})
.catch((err) => {
console.error(err);
});
}, []);
const dispatch = useDispatch();
const addItemToCart = (item) =>
dispatch({ type: ADD_TO_CART, payload: item });
return (
<View style={styles.container}>
<View style={styles.shoppingCartContainer}>
<View style={styles.shoppingCart}>
<ShoppingCartIcon />
</View>
</View>
<View>
<FlatList
data={products}
keyExtractor={(item) => item.id.toString()}
ItemSeparatorComponent={() => Separator()}
renderItem={({ item, index }) => (
<View style={styles.productItemContainer}>
<Image
source={require(`../../assets/images/${index + 1}.jpg`)}
style={styles.thumbnail}
/>
<View style={styles.productItemMetaContainer}>
<Text style={styles.row} numberOfLines={1}>
{item.id}
</Text>
<Text style={styles.row}>{item.name}</Text>
<Text style={styles.row}> {item.categories}</Text>
<Text style={styles.row}> {item.genders}</Text>
<Text style={styles.row}> {item.brands}</Text>
<Text style={styles.price}>$ {item.price}</Text>
<View style={styles.buttonContainer}>
<TouchableOpacity
onPress={() => addItemToCart(item)}
style={styles.button}
>
<Text style={styles.buttonText}>Add to Cart +</Text>
</TouchableOpacity>
</View>
</View>
</View>
)}
/>
</View>
</View>
);
}
ProductsScreen.js:
function ProductsScreen() {
const navigation = useNavigation();
const [products, setProducts] = useState([]);
useEffect(() => {
axios
.get('http://localhost:3000/product/')
.then((res) => {
setProducts(res.data.response);
})
.catch((err) => {
console.error(err);
});
}, []);
const dispatch = useDispatch();
const addItemToCart = (item) =>
dispatch({ type: ADD_TO_CART, payload: item });
return (
<View style={styles.container}>
<View style={styles.shoppingCartContainer}>
<View style={styles.shoppingCart}>
<ShoppingCartIcon />
</View>
</View>
<View>
<FlatList
data={products}
keyExtractor={(item) => item.id.toString()}
ItemSeparatorComponent={() => Separator()}
renderItem={({ item, index }) => (
<View style={styles.productItemContainer}>
<Image
source={require(`../../assets/images/${index + 11}.jpg`)}
style={styles.thumbnail}
/>
<View style={styles.productItemMetaContainer}>
<TouchableOpacity onPress={() => navigation.push("Details")}>
<Text style={styles.row} numberOfLines={1}>
{item.id}
</Text>
</TouchableOpacity>
<Text style={styles.row}>{item.name}</Text>
<Text style={styles.row}> {item.categories}</Text>
<Text style={styles.row}> {item.genders}</Text>
<Text style={styles.row}> {item.brands}</Text>
<Text style={styles.price}>$ {item.price}</Text>
<View style={styles.buttonContainer}>
<TouchableOpacity
onPress={() => addItemToCart(item)}
style={styles.button}
>
<Text style={styles.buttonText}>Add to Cart +</Text>
</TouchableOpacity>
</View>
</View>
</View>
)}
/>
</View>
</View>
);
}
【问题讨论】:
-
您的导航如何?我们可以看看你的堆栈吗?
-
嗨@Guruparan Giritharan,谢谢你的回复我刚刚更新了我的帖子,你可以看看。
标签: node.js react-native api express fetch