繁体   English   中英

无法通过 react-navigation 的导航道具黑白屏幕

[英]unable to pass navigation props b/w screens with react-navigation

在我的组件ContactList中,我使用 map 渲染了一些项目。 每个项目都包含一个缩略图。 当我单击缩略图时,我想导航到一个名为UserDetailsScreen的新屏幕。 在导航时,我还想将有关单击其缩略图的特定用户的数据传输到下一个屏幕。

模态无法正常工作,因为如果我在 map 中使用多个模态将打开它。 所以我正在尝试使用 react-navigation。

联系人列表.tsx:

export const ContactList: React.FunctionComponent<UserProps> = ({
  data,
  onDeleteContact,
}) => {
  const [isUserVisible, setIsUserVisible] = useState(false);
  //const [visibleUser, setVisibleUser] = useState<any>();
  const navigation = useNavigation();

  return (
    <View style={styles.users}>
      {data.users.nodes[0].userRelations.map(
        (item: { relatedUser: RelatedUser; id: number }) => {
          const numberOfFriends = item.relatedUser.userRelations.length;
          const numberPlate = 'WHV AB 123';
          return (
            <View style={styles.item} key={item.id}>
              {/* <TouchableOpacity onPress={() => setIsUserVisible(true)}> */}
              <TouchableOpacity
                onPress={() =>
                  navigation.navigate('UserDetailsScreen', {
                    firstName: item.relatedUser.firstName,
                    rating: item.relatedUser.rating,
                    numberOfFriends: numberOfFriends,
                    onDeleteContact: onDeleteContact,
                    isUserVisible: isUserVisible,
                    setIsUserVisible: setIsUserVisible,
                    numberPlate: numberPlate,
                    navigation: navigation,
                  })
                }>
                <Thumbnail
                  }}></Thumbnail>
              </TouchableOpacity>
              <View style={styles.nameNumber}>
                <Text style={styles.userName}>{userName}</Text>
              </View>
              {/* <UserDetails
                firstName={item.relatedUser.firstName}
                rating={item.relatedUser.rating}
                numberOfFriends={numberOfFriends}
                onDeleteContact={onDeleteContact}
                isUserVisible={isUserVisible}
                setIsUserVisible={setIsUserVisible}
                  numberPlate={numberPlate}>
                </UserDetails> */}
            </View>
          );
        },
      )}
    </View>
  );
};

用户详情屏幕:

type UserProps = {
  //data: UsersQueryHookResult,
  firstName: string;
  rating: number;
  numberOfFriends: number;
  numberPlate: string;
  onDeleteContact: (id: number) => void;
  navigation: any;
};

export const UserDetailsScreen: React.FunctionComponent<UserProps> = ({
  firstName,
  rating,
  numberOfFriends,
  numberPlate,
  onDeleteContact,
  navigation,
//   isUserVisible,
//   setIsUserVisible,
}) => {
//const navigation = useNavigation();
const fName = navigation.getParam('firstName')
  return (
    // <Modal visible={isUserVisible}>
      <View style={styles.container}>
        <View>
          <TouchableOpacity
            style={styles.cross}
            //onPress={() => setIsUserVisible(false)}>
              onPress={() => navigation.navigate('Whitelist')}>
            <Thumbnail></Thumbnail>
          </TouchableOpacity>
        </View>
        <View style={styles.searchLocationContainer}>
          <UserInfoContainer
            firstName={firstName}
            rating={rating}
            numberPlate={numberPlate}
            numberOfFriends={numberOfFriends}></UserInfoContainer>
        </View>
      </View>
    // </Modal>
  );
};

此外,当我从该屏幕单击缩略图时,我应该将 go 返回到我之前的屏幕,以便我现在可以单击另一个 object。

现在,我不断收到一个错误,即navigation.getParam未定义。 我怎样才能解决这个问题?

我相信我需要传递route道具,但我不确定如何使用它们以及是否应该在两个屏幕或一个屏幕中传递它们

从路线道具获取数据

喜欢

type UserProps = {
  //data: UsersQueryHookResult,
  firstName: string;
  rating: number;
  numberOfFriends: number;
  numberPlate: string;
  onDeleteContact: (id: number) => void;
  navigation: any;
  route: any;
};

export const UserDetailsScreen: React.FunctionComponent<UserProps> = ({
  firstName,
  rating,
  numberOfFriends,
  numberPlate,
  onDeleteContact,
  navigation,
  route,
//   isUserVisible,
//   setIsUserVisible,
})....
route.params.firstName

如果您可以导航到UserDetailsScreen ,那么您不需要通过任何路线。 因为导航和它的属性是用UserDetailsScreen设置的

您将参数传递给 UserDetailsScreen 的方法是正确的。

在之前版本的 react-navigation(1.x 到 4.x)中,您可以在“navigation.state.params”中获取参数。

在 react-navigation 5 他们改变了它的实现。 现在您可以在“route.params”Object 中将参数传递到您的屏幕或组件。 您可以在下面查看代码以供参考。

type UserProps = {
route: any,
navigation: any,
};

export const UserDetailsScreen: React.FunctionComponent<UserProps> = ({
route,navigation
}) => {
const {
    firstname,
    rating,
    numberOfFriends,
    numberPlate,
    onDeleteContact,
} = route.params;
return (
    <View style={styles.container}>
    <View>
        <TouchableOpacity
        style={styles.cross}
        //onPress={() => setIsUserVisible(false)}>
        onPress={() => navigation.navigate('Whitelist')}>
        <Thumbnail />
        </TouchableOpacity>
    </View>
    <View style={styles.searchLocationContainer}>
        <UserInfoContainer
        firstName={firstName}
        rating={rating}
        numberPlate={numberPlate}
        numberOfFriends={numberOfFriends}
        />
    </View>
    </View>
);
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM