ReactNative——导航器createBottomTabNavigator(底部标签导航器篇)
创始人
2025-05-29 08:47:10
0

上一篇有讲到堆栈式导航器的写法,点这里->堆栈式导航器

标签导航器官网链接

先安装依赖包

yarn add @react-navigation/bottom-tabs

接着在src/navigator文件夹下新建BottomTabs.tsx文件,写法跟堆栈式导航器类似的~

import React from 'react';
import { NavigationContainer } from '@/react-navigation/native';
import { createBottomTabNavigator } from '@/react-navigation/bottom-tabs'
import Home from '@/pages/Home';
import Listen from '@/pages/Listen';
import Found from '@/pages/Found';
import Account from '@/pages/Account';export type BottomTabParamList = {Home:undefined;Listen:undefined;Found:undefined;Account:undefined;
}const Tab = createBottomTabNavigator()class BottomTabs extends React.Component {render() {return ()}    
}export default BottomTabs;

然后在src/index.tsx使用该导航器

import Navigator from '@/navigator/BottomTabs';export default Navigator;

如何更改为自定义的标签名字?

在options属性里修改

{tabBarLabel:'首页'}}/>{tabBarLabel:'我听'}}/>{tabBarLabel:'发现'}}/>{tabBarLabel:'我的'}}/>

【改动后效果如下图】

如何更改标签选中的颜色?

使用tabBarOptions属性

{activeTintColor:'#f86442',}}>{tabBarLabel:'首页'}}/>{tabBarLabel:'我听'}}/>{tabBarLabel:'发现'}}/>{tabBarLabel:'我的'}}/>

如果要实现在首页里点击某处跳转到详情页要怎么实现呢?这涉及到导肮嵌套

将堆栈式导航器嵌套到标签导航器

在首页里嵌套堆栈式导航器BottomTabs.tsx

import React from 'react';
import { NavigationContainer } from '@/react-navigation/native';
import { createBottomTabNavigator } from '@/react-navigation/bottom-tabs'
import Test from './index'; // 注意这里引入的是堆栈式导航器组件
import Listen from '@/pages/Listen';
import Found from '@/pages/Found';
import Account from '@/pages/Account';export type BottomTabParamList = {Test:undefined; // 这里改一下Listen:undefined;Found:undefined;Account:undefined;
}const Tab = createBottomTabNavigator()class BottomTabs extends React.Component {render() {return ()}    
}export default BottomTabs;

修改堆栈式导航器index.tsx(去掉NavigationContainer)

import React from 'react';
import {NavigationContainer} from '@react-navigation/native'
import {createStackNavigator} from '@react-navigation/stack'
import Home from '@/pages/Home';
import Detail from '@/pages/Detail';
import {createStackNavigator,StackNavigationProp,
} from '@react-navigation/stack'; // 自动引入type RootStackPareamList = {Home: undefined; // 这里改一下Detail:undefined;
}export type RootStackNavigation = StackNavigationPropconst Stack = createStackNavigator();
/*{Navigator, // 导航器Screen // 路由,也就是页面
}
*/class Navigator extends React.Component {render(){return ({headerTitleAlign:'center',}}>{ headerTitleAlign:'left, headerTitle:'首页'}} name="Home" component={Home}/>);}
}export default Navigator;

此时当在首页点击跳转详情页的时候,就能实现跳转了,下面的标签栏是不会消失的,如果想在跳转的时候底部导航器消失要怎么做呢?

将标签导航器嵌套到堆栈式导航器

修改标签导航器的代码问以下,去掉NavigationContainer

import React from 'react';
import { NavigationContainer } from '@/react-navigation/native';
import { createBottomTabNavigator } from '@/react-navigation/bottom-tabs'
import Home from '@/pages/Home'; // 注意这里改回为Home组件
import Listen from '@/pages/Listen';
import Found from '@/pages/Found';
import Account from '@/pages/Account';export type BottomTabParamList = {Home:undefined;Listen:undefined;Found:undefined;Account:undefined;
}const Tab = createBottomTabNavigator()class BottomTabs extends React.Component {render() {return ()}    
}export default BottomTabs;

将堆栈式导航器组件index.tsx还原到上一篇中的写法(即不要去掉NavigationContainer)

然后引入标签导航器

import React from 'react';
import {NavigationContainer} from '@react-navigation/native'
import {createStackNavigator} from '@react-navigation/stack'
// import Home from '@/pages/Home'; // 注意这里改成引入标签导航器了
import BottomTabs from './BottomTabs'; // 引入标签导航器
import Detail from '@/pages/Detail';
import {createStackNavigator,StackNavigationProp,
} from '@react-navigation/stack'; // 自动引入type RootStackPareamList = {BottomTabs: undefined; // 这里改一下Detail:undefined;
}export type RootStackNavigation = StackNavigationPropconst Stack = createStackNavigator();
/*{Navigator, // 导航器Screen // 路由,也就是页面
}
*/class Navigator extends React.Component {render(){return ({headerTitleAlign:'center',}}>{ headerTitleAlign:'left, headerTitle:'首页'}} name="BottomTabs" component={BottomTabs}/>);}
}export default Navigator;

然后在src/index.tsx中修改为使用堆栈式导航器(因为是往堆栈式里嵌套了标签导航器,所以本质上其实是使用了堆栈式导航器为主体)

import Navigator from '@/navigator/index';export default Navigator;

现在为止,就能实现跳转到详情页的时候,底部标签导航器消失了,

但是会有一个问题,当点击底部导航栏跳转的时候,标题总是显示首页,如下图所示

如何动态修改标题栏?

在BottomTabs.tsx中增加以下代码

import React from 'react';
import { NavigationContainer } from '@/react-navigation/native';
import { createBottomTabNavigator } from '@/react-navigation/bottom-tabs'
import Home from '@/pages/Home';
import Listen from '@/pages/Listen';
import Found from '@/pages/Found';
import Account from '@/pages/Account';export type BottomTabParamList = {Home:undefined;Listen:undefined;Found:undefined;Account:undefined;
}const Tab = createBottomTabNavigator() // 这里
type Route = RouteProp&state?:TabNavigationState;
}// 这里
interface IProps {     navigation: RootStackNavigation;route:RouteProp;
}// 增加一个获取标题名称的方法
function getHeaderTitle(route: Route) {const roureName = route.state? route.state.routes[route.state.index].name: route.params?.screen || 'Home';switch(routeName) {case 'Home':return '首页';case 'Listen':return '我听';case 'Found':return '发现';case 'Account':return '账户';default:return '首页'}
}class BottomTabs extends React.Component{// props发生变化就会执行生命周期componentDidUpdate() {const {navigation,route} = this.props;navigation.setOptions({headerTitle:getHeaderTitle(route),});}render() {return ()}    
}export default BottomTabs;

在index.tsx(堆栈式导航器)中增加以下代码

import React from 'react';
import {NavigationContainer} from '@react-navigation/native'
import {createStackNavigator} from '@react-navigation/stack'
import BottomTabs from './BottomTabs';
import Detail from '@/pages/Detail';
import {createStackNavigator,StackNavigationProp,
} from '@react-navigation/stack'; // 自动引入type RootStackPareamList = {BottomTabs: { // 这里改一下screen?: string;    }; Detail:undefined;
}export type RootStackNavigation = StackNavigationPropconst Stack = createStackNavigator();class Navigator extends React.Component {render(){return ({headerTitleAlign:'center',}}>{headerTitle:'首页'}} 删掉这个属性,因为需要动态修改name="BottomTabs" component={BottomTabs}/>);}
}export default Navigator;

效果如下

相关内容

热门资讯

English Learnin... English Learning - L2 第 7 次小组纠音 辅音 [p] [b] [t] [d]...
Opencv+Python学习... 一,色彩空间分类1.GRAY色彩空间GRAY(灰度图像)通...
【SSM】MyBatis(三.... 文章目录1.environment2.transactionManager3. dataSource...
甘南七日全景精华游攻略:预算拆... 甘南,这片被《孤独星球》评为“亚洲最佳旅行地”的秘境,集藏地信仰、高原风光、草原牧歌于一体。2025...
Cursor太强了,从零开始写... Cursor太强了,从零开始写ChatGLM大模型的微调代码初次体验对话实录问...
LeetCode题解 19(7... 文章目录子集(78)代码解答目标和(494)代码解答 子集(78) 这道题要求我们返回指定数组的所...
在家也能做!广东叉烧包的美味秘... 在广东点心那琳琅满目的世界里,叉烧包宛如一颗熠熠生辉的甜蜜明珠,以其松软绵密的包子皮和香甜多汁的叉烧...
嬴氏酒以「文化传承」为核心,酱... 嬴氏酒以差异化高品质酱香白酒突围,融合中华文化精髓与古法工艺,精准定位、适配商业模型、把握市场痛点,...
江西小炒烟火气秘诀!爆炒 3 ... 在江西的街头巷尾,总能看到这样的场景:简易的灶台支在店门口,猛火灶呼呼作响,厨师手持铁锅上下翻飞,油...
原创 从... 5月29日,台湾旺旺集团总经理蔡旺庭的发言,直接把人整破防了!他坦诚,旺旺从中国台湾起步,在大陆这片...
从“吸引年轻人”到“成为年轻人... 据后浪研究所发布的《2024年年轻人喝酒报告》显示,00后最爱的网红酒里,汾酒作为唯一上榜的白酒品牌...
亚朵酒店养生早餐获好评,以中式... 近年来,随着健康理念的普及与生活节奏的加快,早餐这一日常场景被重新置于大众视野。而在差旅频繁的客群中...
【XKA六周年特别企划】品牌背... 在大健康的赛道上,愿与XKA合作,开发更多更好的主粮产品,守护家人健康。 2019年通过展会结识XK...
原创 人... 从餐厅搬到火车车厢,自助餐的“边界”正在不断延伸。 据多家媒体报道,近日,从沈阳、大连、长春等地...
黄酒文化发源地:一坛酒,千年香 提起中国酒文化,很多人会立刻想到浓香四溢的白酒,或风情万种的葡萄酒,但却容易忽略了黄酒,这种承载着中...
pikachu——xss 反射性(get)都提示get了,肯定跟url栏有关拿到题目...
传统为体,现代为用:劲牌以古法... 长江吐故纳新,不断拥抱新生,才能涤荡初心,砥砺前行,最终拥抱大海。 “长江第一湾”所在的宜宾美酒也一...
红浪翻滚舌尖舞:口味虾的火辣江... 在湘菜的璀璨版图中,口味虾犹如一簇跃动的红色火焰,以其浓烈奔放的香辣滋味,点燃了无数食客的味蕾。这道...
酒厂老板快看!禁酒令下,中小酒... 嘿,各位酒友、酿酒的小伙伴们,我是酒皇叔王杰老师。最近这禁酒令一出,可把不少中小型酒厂、酒坊的老板们...
嫩滑姜撞奶,一场味蕾的甜蜜之旅... 在广东那五彩斑斓的甜品宇宙里,姜撞奶以一场别开生面的甜蜜邂逅,撩拨着食客们的味蕾,带来令人沉醉的惊喜...