我正在react-navigation
v5.0.0中使用功能性方法,并且有一个包含以下内容的堆栈导航器:
App.js
<Stack.Screen
name="Profil"
component={Profile}
options={{
headerStyle: {
backgroundColor: '#2270b9'
},
headerTintColor: '#fff',
headerTitleStyle: {
color: 'white'
},
headerRight: () => (
<View style={{ flex: 1, flexDirection: 'row' }}>
<Ionicons
style={{ color: 'white', marginRight: 15, marginTop: 5 }}
size={32}
onPress={() => { _sendMessage(...) }} // <--- problem is here
name="ios-mail"
backgroundColor="#CCC"
/>
</View>
)
}}
/>
个人资料组件大致如下:
Profile.js
export default function Profile({ route, navigation }) {
const { profile } = route.params;
return (
<SafeAreaView style={styles.container}>
<View style={styles.container}>
<ScrollView contentContainerStyle={styles.contentContainer}>
[...]
现在的问题是,打开配置文件后,Profile
被初始化为有效负载对象(“配置文件”):
Search.js / Visitors.js
navigation.navigate('Profil', { profile });
问题是,在App.js
中添加的发送按钮需要将配置文件对象作为路由参数传递给Profile.js
,但在App.js
中不可用
如何在Profile
组件中创建标题按钮,以便可以访问配置文件对象?
答案 0 :(得分:1)
您可以尝试修改选项属性以将route作为参数,例如:
options={({ route: { params: { profile } } }) => ({
/** use profile here */
})
要将其放置在App.js的上下文中,请注意options是如何将{route}作为参数并返回options对象的函数。
<Stack.Screen
name="Profil"
component={Profile}
options={({ route: { params: { profile } } }) => ({ // <- Note that options in now a function
headerStyle: {
backgroundColor: '#2270b9'
},
headerTintColor: '#fff',
headerTitleStyle: {
color: 'white'
},
headerRight: () => (
<View style={{ flex: 1, flexDirection: 'row' }}>
<Ionicons
style={{ color: 'white', marginRight: 15, marginTop: 5 }}
size={32}
onPress={() => { _sendMessage(profile) }} // <--- you can use profile here
name="ios-mail"
backgroundColor="#CCC"
/>
</View>
)
})}
/>
答案 1 :(得分:1)
实际上,我发现可以解决此问题-可以通过在Profile.js
(对象可用的地方)而不是App.js
中添加标头来解决此问题。
因此,我刚刚在headerRight
中删除了App.js
的代码,而是将其放在Profile.js
中:
export default function Profile({ route, navigation }) {
const { profile } = route.params;
React.useLayoutEffect(() => {
navigation.setOptions({
headerRight: () => (
<View style={{ flex: 1, flexDirection: 'row' }}>
<Ionicons
style={{ color: 'white', marginRight: 15, marginTop: 5 }}
size={32}
onPress={_onSendMessage}
name="ios-mail"
backgroundColor="#CCC"
enabled={ profile && profile.core ? true : false}
/>
</View>
)
});
}, []);
这样,无论从Profile.js
的何处打开,按钮回调都可以访问处于Profile.js
'状态的当前配置文件对象。