【问题标题】:How do I pass the id parameter to navigate to the details component?如何传递 id 参数以导航到详细信息组件?
【发布时间】:2021-01-09 14:39:13
【问题描述】:

我正在尝试导航到 ProductDetailsS​​creen.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


【解决方案1】:

您应该使用如下导航功能

<TouchableOpacity onPress={() => navigation.navigate("Details",{id:1})}>

你也可以这样做

<TouchableOpacity onPress={() => navigation.push("Details",{id:1})}>

不同之处在于 push 将添加新屏幕,如果屏幕已经在堆栈中,则导航将返回。

【讨论】:

  • 它仍然抱怨这一行的错误: const id = props.match.params.id; ,也许我会在那里做更多的事情。
  • 应该是props.route.params.id
  • 是的,谢谢它的工作。但是还有一个问题是我将参数的值设置为 1,当然,我单击它的任何项目都会导航到值等于 1 的项目。我希望当我单击任何项​​目时导航到该项目,任何关于如何更改 id 值的建议?谢谢。
【解决方案2】:

传递参数使用navigation.navigate("SCREEN_NAME", {YOUR_PARAM: "PARAM_VALUE"})

并在其他屏幕上接收参数使用this.props.route.params.YOUR_PARAM

【讨论】:

  • 感谢它的工作。但是还有一个问题是我将参数的值设置为 1,当然,我单击它的任何项目都会导航到值等于 1 的项目。我希望当我单击任何项​​目时导航到该项目,任何关于如何更改 id 值的建议?谢谢
  • @saygas 对不起,我不明白你的确切问题,但据我所知,导航只会将你导航到你在 `navigation.navigate('screen_name')' 中提到的屏幕
  • 问题是我已经指定了 1 作为参数的值(navigation.navigate("Details", {id: 1})) 我有 15 个产品。在这种情况下,即使单击除 1 之外的另一个产品编号,我也会再次导航到产品编号 1。我需要的是我单击的产品编号,我应该导航到该产品。这次我就不好好解释了。
  • 无论您传递什么参数都无关紧要,它会将您重定向到您在其中提到的屏幕,这里您提到了“详细信息”屏幕,因此无论您使用什么,它都会将您重定向到详细信息屏幕传入参数(1 or 2 or 3)
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
相关资源
最近更新 更多