Настройка Header
Мы уже видели, как настроить title
в Header, но давайте еще раз рассмотрим это, прежде чем перейти к некоторым другим параметрам - повторение является ключом к обучению!
Настроить title
в Header
Компонент Screen
принимает опцию options
, которая является либо объектом, либо функцией, возвращающей объект, содержащий различные параметры конфигурации. В качестве заголовка мы используем title
, как показано в следующем примере.
const StackScreen = () => {
return (
<Stack.Navigator>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: 'My home' }}
/>
</Stack.Navigator>
)
}
Попробуйте этот пример на Snack
Использование параметров в заголовке
Чтобы использовать параметры в заголовке, нам нужно сделать опцию options
для экрана функцией, которая возвращает объект конфигурации. Может возникнуть соблазн попробовать использовать this.props
внутри параметров, но поскольку он определен до рендеринга компонента, это не относится к экземпляру компонента, и поэтому свойства недоступны. Вместо этого, если мы сделаем параметры функцией, тогда React Navigation вызовет ее с объектом, содержащим {navigation, route}
- в этом случае все, о чем мы заботимся, это маршрут, который является тем же объектом, который передается в свойства вашего экрана в качестве свойства маршрута. Вы можете вспомнить, что мы можем получить параметры через route.params
, и поэтому мы делаем это ниже, чтобы извлечь параметр и использовать его в качестве заголовка.
import * as React from 'react'
import { View, Text, Button } from 'react-native'
import { NavigationContainer } from '@react-navigation/native'
import { createStackNavigator } from '@react-navigation/stack'
const HomeScreen = ({ navigation }) => (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
<Button title="Go to Details" onPress={() => navigation.navigate('Detail', { name: 'Custom details header' })} />
</View>
)
const DetailScreen = ({ navigation }) => (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Profile screen</Text>
<Button title="Go back" onPress={() => navigation.goBack()} />
</View>
)
const Stack = createStackNavigator()
const App = () => (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} options={{ title: 'My home' }} />
<Stack.Screen name="Detail" component={DetailScreen} options={({ route }) => ({ title: route.params.name })} />
</Stack.Navigator>
</NavigationContainer>
)
export default App
Попробуйте этот пример на Snack
Аргумент, который передается в функцию параметров, представляет собой объект со следующими свойствами:
navigation
- prop для экранаroute
- prop маршрута для экрана
В приведенном выше примере нам нужна была только поддержка маршрута, но в некоторых случаях вы также можете использовать навигацию.
Обновление параметров с помощью setOptions
Часто бывает необходимо обновить конфигурацию опций для активного экрана из самого подключенного компонента экрана. Мы можем сделать это с помощью navigation.setOptions
/* Внутри render() или React class */
<Button
title="Update the title"
onPress={() => navigation.setOptions({ title: 'Updated!' })}
/>
Попробуйте этот пример на Snack
Настройка стилей
При настройке стиля хедера следует использовать три ключевых свойства: headerStyle
, headerTintColor
и headerTitleStyle
.
headerStyle
: объект стиля, который будет применен кView
, которое обертывает заголовок. Если вы установите для негоbackgroundColor
, это будет цвет вашего заголовка.headerTintColor
: кнопка «Назад» и заголовок используют это свойство в качестве цвета. В приведенном ниже примере мы устанавливаем белый цвет оттенка#fff
, поэтому кнопка «Назад» и заголовок заголовка будут белыми.headerTitleStyle
: если мы хотим настроитьfontFamily
,fontWeight
и другие свойства стиля текста для заголовка, мы можем использовать это для этого.
Попробуйте этот пример на Snack
Здесь следует отметить несколько моментов:
- В iOS текст строки состояния и значки черные, и это не очень хорошо смотрится на темном фоне. Мы не будем обсуждать это здесь, но вы должны обязательно настроить строку состояния в соответствии с цветами экрана, как описано в руководстве по строке состояния.
- Установленная нами конфигурация применяется только к главному экрану; когда мы переходим к экрану подробностей, стили по умолчанию возвращаются. Теперь мы рассмотрим, как разделить параметры
options
между экранами.
Совместное использование общих параметров на разных экранах
Часто возникает желание настроить заголовок аналогичным образом на многих экранах. Например, цвет бренда вашей компании может быть красным, поэтому вы хотите, чтобы цвет фона заголовка был красным, а цвет оттенка был белым. Для удобства это цвета, которые мы используем в нашем текущем примере, и вы заметите, что при переходе на экран DetailsScreen
цвета возвращаются к значениям по умолчанию. Разве не было бы ужасно, если бы нам пришлось скопировать свойства стиля заголовка параметров из HomeScreen
в DetailsScreen
и для каждого отдельного компонента экрана, который мы используем в нашем приложении? К счастью, нет. Вместо этого мы можем переместить конфигурацию в навигатор стека в разделе prop screenOptions
.
Попробуйте этот пример на Snack
Теперь любой экран, принадлежащий StackScreen
, будет иметь наши замечательные фирменные стили. Конечно, должен быть способ переопределить эти параметры, если нам нужно?
Замена заголовка на кастомный компонент
Иногда вам нужно больше контроля, чем просто изменение текста и стилей заголовка - например, вы можете захотеть отобразить изображение вместо заголовка или превратить заголовок в кнопку. В этих случаях вы можете полностью переопределить компонент, используемый для заголовка, и предоставить свой собственный.
const LogoTitle = () => {
return (
<Image
style={{ width: 50, height: 50 }}
source={require('@expo/snack-static/react-native-logo.png')}
/>
);
}
const StackScreen = () => {
return (
<Stack.Navigator>
<Stack.Screen
name="Home"
component={HomeScreen}
options=options={{ headerTitle: props => <LogoTitle /> }} /> }}
/>
</Stack.Navigator>
)
}
Попробуйте этот пример на Snack
Вам может быть интересно, почему headerTitle, когда мы предоставляем компонент, а не title
, как раньше? Причина в том, что title
- это свойство, специфичное для навигатора стека, а headerTitle
по умолчанию - это компонент Text, который отображает title
.
Дополнительная конфигурация
Вы можете прочитать полный список доступных опций для экранов внутри навигатора стека в справочнике createStackNavigator.
Done
Чтобы узнать, насколько хорошо вы усвоили этот урок, пройдите тест в мобильном приложении нашей школы по этой теме или в боте Telegram.
Links
Contributors ✨
Thanks goes to these wonderful people (emoji key):
Dmitriy Vasilev 💲 |