【问题标题】:React Native navigation shared header elementReact Native 导航共享标题元素
【发布时间】:2021-07-09 14:04:46
【问题描述】:

我正在使用 react native 和 react-navigation 我想完成以下操作:

我有一个组件个人详细信息,我从 API 接收一些数据:头像、许可证、城市

在该组件中,我有 2 个按钮可以转到单独的页面。

但我有一个名为 的组件在所有 3 个组件之间共享

所以当我在第一个组件 PersonDetails 中接收到在这些组件之间共享的数据时。

我在第一个组件人员详细信息中收到的那些道具我希望它们在 PersonExtendedPersonLocation 之间共享,但不将它们作为道具传递, 因为头像是base64的,可以很大。

那么有没有其他方法可以做到这一点?

人员详情:

export const PersonDetails = ({navigation, route}) => {


  /** Get user ID From parameters **/
  const {userId} = route.params;

  /** Redux selectors **/
  const {person = null, loading = true} = useSelector(state => state.vehicles);


  const dispatch = useDispatch();

  // const insets = useSafeAreaInsets();




  /**
   * Mounted hook, loads vehicle info
   */
  useEffect(() => {
    dispatch(userActions.getUser({userId}));
  }, []);


  /**
   * Handle navigaton between card
   * @param {string} routeName
   */
  const handleNavigation = (routeName) => {
        navigation.navigate(routeName, {userId, 
        userInfo:
            {
              carAvatar: person.avatar,
              licencePlate: person.licencePlate,
              city: person.city
            }
        });
  };

  /**
   * Handle Click on X button in right corner
   */
  const handleBackNavigation = () => {
    navigation.goBack();
  };

  if (loading) {
    return <AnimatedLoader />;
  }
  return (
    <View style={{flex: 1, paddingBottom: insets.bottom}}>
      {/* Top header  */}
      <PersonInfo
        carAvatar={person.avatar}
        licencePlate={person.licencePlate}
      />
      {/* Top header  */}
      <ScrollView>
        <View style={styles.container}>
          <Button
            title={'extended info'} leftIcon="information-outline"
            onPress={() => handleNavigation('PersonExtendedDetails')} />
           <Button
            title={'location'} leftIcon="information-outline"
            onPress={() => handleNavigation('PersonLocation')} />
        </View>
      </ScrollView>
    </View>
  );
};


export default PersonDetails;

人物扩展:

export const PersonExtended = ({navigation, route}) => {


  /** Get user ID From parameters **/
  const {userId} = route.params;

  /** Redux selectors **/
  const {personExtended = null, loading = true} = useSelector(state => state.personExtended);


  const dispatch = useDispatch();





  /**
   * Mounted hook, loads vehicle info
   */
  useEffect(() => {
    dispatch(userActions.getUserExended({userId}));
  }, []);
  

  /**
   * Handle Click on X button in right corner
   */
  const handleBackNavigation = () => {
    navigation.goBack();
  };

  if (loading) {
    return <AnimatedLoader />;
  }
  return (
    <View style={{flex: 1}}>
      {/* Top header  */}
      <PersonInfo
        carAvatar={person.avatar}
        licencePlate={person.licencePlate}
      />
      {/* Top header  */}
     <View>
       <Text> USER Location { personLocation.locationName } </Text>
     </View>
    </View>
  );
};


export default PersonExtended;

人员位置:

export const UserLocation = ({navigation, route}) => {


  /** Get user ID From parameters **/
  const {userId} = route.params;

  /** Redux selectors **/
  const {personLocation = null, loading = true} = useSelector(state => state.location);


  const dispatch = useDispatch();





  /**
   * Mounted hook, loads vehicle info
   */
  useEffect(() => {
    dispatch(userActions.getUserLocation({userId}));
  }, []);
  

  /**
   * Handle Click on X button in right corner
   */
  const handleBackNavigation = () => {
    navigation.goBack();
  };

  if (loading) {
    return <AnimatedLoader />;
  }
  return (
    <View style={{flex: 1}}>
      {/* Top header  */}
      <PersonInfo
        carAvatar={person.avatar}
        licencePlate={person.licencePlate}
      />
      {/* Top header  */}
     <View>
       <Text> USER Location { personLocation.locationName } </Text>
     </View>
    </View>
  );
};


export default UserLocation;

【问题讨论】:

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


    【解决方案1】:

    您可以使用 redux 状态在其他两个屏幕中访问存储的用户信息,例如头像等,就像您在第一个屏幕上显示它一样。

    例如

    人物扩展:

    const {person} = useSelector(state => state.vehicles);
    

    人员位置:

    const {person} = useSelector(state => state.vehicles);
    

    --------------

    创建文件并导出默认类如下:

    导出默认类 Person { 静态图像数据 = ''; // 在这里存储图片base64数据.. }

    现在只需在您要获取用户数据的屏幕中导入类,并将 base64 图像数据分配给 imageData 静态变量。

    喜欢:

    import Person from './Person';
    Person.imageData = 'image/base64&...'
    

    用法

    import Person from './Person';
    <Image source={{uri: Person.imageData }} />
    

    【讨论】:

    • 这行得通,但我试图不使用商店:/
    • 然后你必须创建一个静态类并将头像图像分配给静态类变量,这样你就可以在任何地方轻松访问它们
    • 我该怎么做,你能和我分享一下简短的例子吗:)
    • @Loki,我已经更新了答案,请看一下。
    猜你喜欢
    • 2022-06-25
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多