【问题标题】:How to reuse Screen with different route.params React-Navigation?如何使用不同的 route.params React-Navigation 重用 Screen?
【发布时间】:2021-08-10 04:13:24
【问题描述】:

我正在尝试通过不同的查询重复使用我的主屏幕,以下是我的代码。但是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>
  );
};

我是反应原生和导航库的新手。谢谢。

【问题讨论】:

  • 这段代码有什么问题?
  • 你把路由解构为道具了吗?
  • 那应该可以了。也许用完整的组件更新问题
  • snack.expo.io/awDkoU34- 你能检查一下这个工作示例吗?
  • 你用prettier吗?如果是这样,那么在 Text 组件之外可能还有 {' '} 这种符号。

标签: reactjs react-native react-navigation react-navigation-v5


【解决方案1】:

在 ProfileScreen 中,您正在立即调用 thumbPress 函数,并且您正在绑定到 this,但它不是类组件。你应该这样做;

 <TouchableOpacity onPress={() => thumbPress(post)}>
          <Image source={{uri: post.images[0]}} style={styles.thumbnail} />
   </TouchableOpacity>

您的主屏幕名称也是“Home”,您正在路由到“HomeScreen”。

【讨论】:

  • 我修复了那个部分。但是当我在主屏幕上记录参数时,它仍然显示未定义。当我在 thumbPress 中使用 console.log 时,我可以看到数据,但在主屏幕上看不到。
  • @VipulSanjay 好的,你也可以添加堆栈导航器吗?
  • 当然,刚刚做了。
  • @VipulSanjay 您的主屏幕名称是“Home”,您正在路由到“HomeScreen”,这可能是错误的吗?
  • @VipulSanjay 您也可以将此标记为答案吗?谢谢
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2021-09-16
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多