【发布时间】:2018-09-03 18:19:51
【问题描述】:
这里我使用react-navigation 作为我的导航库。
如何更改特定屏幕的back 按钮(由react-navigation 自动添加)功能?
我的意思是,与其在屏幕堆栈中前进一步,我希望它在堆栈中后退 2 步,或者通过提供屏幕名称手动执行(同样仅在一个组件上)。
【问题讨论】:
标签: reactjs react-native react-navigation
这里我使用react-navigation 作为我的导航库。
如何更改特定屏幕的back 按钮(由react-navigation 自动添加)功能?
我的意思是,与其在屏幕堆栈中前进一步,我希望它在堆栈中后退 2 步,或者通过提供屏幕名称手动执行(同样仅在一个组件上)。
【问题讨论】:
标签: reactjs react-native react-navigation
您可以使用该屏幕的navigationOptions 覆盖特定屏幕的后退按钮。您可以在react-navigation docs 中阅读有关覆盖后退按钮的更多信息
来自文档的示例
class HomeScreen extends React.Component {
static navigationOptions = {
headerTitle: <LogoTitle />,
headerRight: (
<Button
onPress={() => alert('This is a button!')}
title="Info"
color="#fff"
/>
),
};
}
覆盖后退按钮
后退按钮将自动呈现在
StackNavigator只要用户有可能从当前返回 screen — 换句话说,后退按钮将在任何时候呈现 堆栈中有多个屏幕。通常,这就是您想要的。但有可能在某些 您比您更想自定义后退按钮的情况 可以通过上面提到的选项,这种情况下可以指定
headerLeft,就像我们对headerRight所做的那样,并且完全 覆盖后退按钮。
【讨论】:
onPress() 函数?我想保留最初的背景图片
onPress 道具。 import { HeaderBackButton } from 'react-navigation'
HeaderBackButton 的小例子来编辑我的答案,那将是完美的。
考虑一下,您分别有 3 个屏幕 A、B、C。 因此,StackNavigator 中后退按钮的默认功能是:- 如果您在屏幕 C 上按返回按钮,它将带您到上一个屏幕,即屏幕 B。 要覆盖它,您可以在屏幕 C 上执行以下操作:-
import { HeaderBackButton } from 'react-navigation';
static navigationOptions = ({navigation}) => {
return{
headerLeft:(<HeaderBackButton onPress={()=>{navigation.navigate('A')}}/>)
}
}
【讨论】:
labelVisible={false}和tintColor={'#FFF'}进行更多自定义,here中的所有道具
您也可以在创建堆栈导航器时执行此操作。从 react-navigation v4 开始更新。
import { createStackNavigator, HeaderBackButton } from "react-navigation-stack";
const yourStackNavigator = createStackNavigator({
SomeRoute: SomeScreen,
SpecificRoute: {
screen: SpecificScreen,
navigationOptions: ({ navigation }) => ({
headerLeft: (<HeaderBackButton onPress={_ => navigation.navigate("Somewhere")}/>)
})
},
});
【讨论】:
如果您使用的是版本 5,并且正在处理功能组件,则可以使用布局效果挂钩来完成此操作 (example from the docs reference):
function ProfileScreen({ navigation, route }) {
const [value, onChangeText] = React.useState(route.params.title);
React.useLayoutEffect(() => {
navigation.setOptions({
title: value === '' ? 'No title' : value,
});
}, [navigation, value]);
请注意,如果您要更改 headerLeft,您可能需要将函数传递给它 (GH issue reference)。
【讨论】:
默认情况下,使用 HeaderBackButton 组件。您可以实现它并使用它来覆盖后退按钮样式,按下道具,例如: 链接到docs
import { HeaderBackButton } from '@react-navigation/stack';
const styles = StyleSheet.create({
custom: {
// Custom styles here
}
});
<Screen
name="Home"
component={HomeScreen}
options={{
headerLeft: (props) => (
<HeaderBackButton
{...props}
style={styles.custom}
onPress={() => {
// Do something
}}
/>
),
}}
/>;
如果你想要完全控制,你可以使用你自定义的后退按钮组件,例如:
import { CustomBackButton } from 'path/to/custom/component';
<Screen
name="Home"
component={HomeScreen}
options={{
headerLeft: (props) => (
<CustomBackButton {...props} />
),
}}
/>;
【讨论】: