一、 stack路由結構的一些效果
(1)橫向過渡動畫
(2)整個選項卡樣式修飾
最終實現效果:動態圖
以上兩個功能實現都很簡單,我測試時,關注了一個問題,navigation 丟失。stackNavigator除了直接組件會自動擁有navigation屬性,其余的都沒有,那么解決的辦法就是使用withNavigation導出要使用navigation的組件。該屬性具體的包在
import {withNavigation} from '@react-navigation/compat'
功能3:准確叫出每個部位的專業名字(不然每次搜索都不知道叫啥,悲催)
我將 https://reactnavigation.org/docs/stack-navigator 對導航欄、后退按鈕、屏幕標題的處理總結在下面代碼中
<Stack.Screen name="Chat" component={Chat} options={{
//1.導航欄的設置 headerMode: 'screen', headerShown: true, //導航欄是否顯示 headerStyle:{ //導航欄的樣式 shadowOffset: {width: 0, height: 0}, shadowColor: '#1a505050', shadowRadius: 2, //陰影模糊半徑 shadowOpacity: 1, // 陰影不透明度 elevation: 1, //讓安卓擁有灰色陰影 --- 必須 },
//2. 設置導航標題的“名字”和“位置”(同時給多個屏幕設置標題?) headerTitle: "聊天", headerTitleAlign:'center',
//3. 在headerLeft中可以完全覆蓋,后退按鈕,也可以使用headerBackImage headerLeft:()=><Image style={{width:9,height:16,marginHorizontal:25}} source={require('./img/return_icon.png')}/>
}} />
功能4:stack路由切換時,橫向過渡動畫
import {TransitionPresets} from '@react-navigation/stack'; <NavigationContainer>
<Stack.Navigator screenOptions={{ //這三個點是,解構賦值Es6的新寫法
...TransitionPresets.SlideFromRightIOS }} >
<Stack.Screen name="Login" component={Login} options={{headerShown:false}}/>
<Stack.Screen name="TabCollection" component={TabCollection} />
<Stack.Screen name="Chat" component={Chat}/>
</Stack.Navigator>
</NavigationContainer>
具體看官網解釋: https://reactnavigation.org/docs/stack-navigator/#transitionpresets
二、createMaterialTopTabNavigator導航的樣式修飾(方便下次直接使用)
1. indicator指示器設置固定寬度,居中
2. 修改選項卡底部樣式
效果圖如下
import React,{Component} from 'react'; import {View,Text,StyleSheet} from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; //這個只有首頁需要 import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs'; // 誰看過我 class HomeScreen extends React.Component{ render(){ return ( <View style={styles.box}> <Text>A看過我</Text> <Text>B看過我</Text> </View> ) } } // 我看過誰 class SettingsScreen extends React.Component{ render(){ return ( <View style={styles.box}> <Text>我看過 《斗羅大陸》</Text> <Text>我看過 《狐妖小紅娘》</Text> </View> ) } } // 構建tab路由 let MyTab = createMaterialTopTabNavigator(); function App() { return ( <NavigationContainer> <MyTab.Navigator tabBarOptions={{ activeTintColor: "#345484", //選中狀態標簽顏色 inactiveTintColor: "#232325",//未選中狀態標簽顏色 labelStyle:{ //標簽文字大小 fontSize: 16 }, indicatorStyle:{//底部指示器樣式對象,設置固定寬度居中 width:32, left:"25%", marginLeft: -16, height: 2, backgroundColor:"#345484", }, style:{ shadowOffset: {width: 0, height: 0}, shadowColor: '#1a505050', shadowRadius: 2, //陰影模糊半徑 shadowOpacity: 1, // 陰影不透明度 elevation: 1, } }} > <MyTab.Screen name="Home" options={{title:"誰看過我"}} component={HomeScreen} /> <MyTab.Screen name="Settings" options={{title:"我看過誰"}} component={SettingsScreen} /> </MyTab.Navigator> </NavigationContainer> ); } let styles = StyleSheet.create({ box:{ flex:1,backgroundColor:'#fff',justifyContent:'center',alignItems:'center' } }); export default App;
這里還有一些關於react-navigation 5.x我所遇到的問題
https://www.cnblogs.com/tengyuxin/p/13394646.html