reactjs - React Native 导航共享标题元素
问题描述
我正在使用 react native 和 react-navigation 我想完成以下操作:
我有一个组件人员详细信息,我从 API 接收一些数据:头像、许可证、城市
在那个组件中,我有 2 个按钮可以转到单独的页面。
但我有一个名为这是他们三个人共享的
因此,当我在第一个组件PersonDetails中接收在这些组件之间共享的数据时。
我在第一个组件人物详细信息中收到的那些道具我希望它们在PersonExtended和PersonLocation之间共享,但不将它们作为道具传递,因为头像图像是 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;
解决方案
您可以使用 redux 状态在其他两个屏幕中访问存储的用户信息,例如头像等,就像您在第一个屏幕上显示它一样。
例如。
人员扩展:
const {person} = useSelector(state => state.vehicles);
人员位置:
const {person} = useSelector(state => state.vehicles);
--------或--------
创建一个文件并导出默认类,如下所示:
导出默认类 Person { static imageData = ''; // 在这里存储图片 base64 数据.. }
现在只需在您要获取用户数据的屏幕中导入类,并将 base64 图像数据分配给 imageData 静态变量。
喜欢:
import Person from './Person';
Person.imageData = 'image/base64&...'
用法
import Person from './Person';
<Image source={{uri: Person.imageData }} />
推荐阅读
- java - 为每个客户端维护与 jersey CLIENT 的 cookie 会话
- javascript - 从严格导出默认模块内的另一个本地方法中调用本地 fooBar 方法时获取“_this.fooBar 不是函数”
- vba - 如何编写 VBA 代码以转到文件路径,打开文件夹然后打开文件?
- php - 在 Laravel 中,数据的布局/模板
- r - 如何从外部软件调用 CPLEX 的目标函数?
- clojure - binding form predefined outside let expression
- django - Django 中 urls.py 中 app_name 的用途是什么?
- javascript - 隐藏父菜单并显示子菜单
- python - 有没有办法根据输入的文件类型将 psv、csv 或 excel 文件读入数据框?
- vb.net - 如何在变量中存储一个大数字