[快速上手RN] 3. React native 制作底部导航栏 Bottom Tab Bar

这篇具有很好参考价值的文章主要介绍了[快速上手RN] 3. React native 制作底部导航栏 Bottom Tab Bar。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列教程

[快速上手RN] 0.React Native 快速启动项目
[快速上手RN] 1. React native 项目集成UI Kitten
[快速上手RN] 2. React native 项目色彩主题色编辑及使用
[快速上手RN] 3. React native 制作底部导航栏 Bottom Tab Bar
[快速上手RN] 4. React native 集成redux

1.最终效果

首先我们确认目标

  1. 在APP底部新增一个导航栏
  2. 导航栏点击tab时会切换页面内容
  3. tab包含Icon、名称,并且切换时会颜色变更
    如下图
    [快速上手RN] 3. React native 制作底部导航栏 Bottom Tab Bar

1. 安装依赖

我们所需要的依赖如下

  1. react-navigation
  2. @react-navigation/native
  3. @react-navigation/native-stack
  4. @react-navigation/bottom-tabs
    以上4个主要是用于做页面栈的路由功能,用于更好的定义每个页面的状态,以及跳转方式,还有头部的表现形式等等,如果想不仅限于用,还想知道react-navigation的工作方式或深入了解使用方式,请查阅相关文档~
    地址:https://reactnavigation.org
  5. UI Kitten
    我们需要使用它的组件来快速构建我们的底部导航栏
  6. react-native-safe-area-context
    我们需要考虑到ios界面时存在Home Indicator (底部的白色小横线)时,与我们的页面冲突的情况,所以需要该插件来帮助我们界定一个安全区域
  7. Expo
    Expo是一个非常好用的工具,这次我们将使用他的Icon组件,如果自己有自己的Icon,那么本次可以不使用它

1.1 安装react-navigation相关依赖

安装命令如下,如果觉得麻烦可以复制粘贴~

  • react-navigation
npm install react-navigation @react-navigation/native @react-navigation/native-stack @react-navigation/bottom-tabs --save
  • react-native-safe-area-context
npm install react-native-safe-area-context --save

1.2 安装UI Kitten

具体请查看博文
[快速上手RN] 1. React native 项目集成UI Kitten
这里暂不赘述

1.3 使用Expo

如果你的项目是通过Expo启动的,那么直接使用即可,否则也可以使用自己的Icon库或者试试好用的Expo来开发~
参考博文
[快速上手RN] 0.React Native 快速启动项目

2.创建文件

  1. 在你的项目目录下的src文件夹中创建导航栏文件夹navigator
  2. src/navigator/下创建2个文件
    1.AppNavigator.jsx用于export项目的整个导航
    2.TabNavigation.jsx用于编写底部导航栏的相关代码

3.AppNavigator.jsx

以下为该文件代码,根据react-navigation的文档,我们需要做一个container包住navigator,并导出以便App.js使用
需要import TabNavigation

import { NavigationContainer } from "@react-navigation/native";
import TabNavigatorScreen from "./TabNavigation";


export default function () {
  return (
    <NavigationContainer>
      <TabNavigatorScreen />
    </NavigationContainer>
  );
}

4.TabNavigation.jsx

打开TabNavigation.jsx

4.1 引入依赖

import React from "react";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import {
  BottomNavigation,
  BottomNavigationTab,
  Layout,
  Text,
} from "@ui-kitten/components"; // UI Kitten的组件
import { MaterialIcons } from "@expo/vector-icons"; // 用于Icon

4.2 创建Home页面

我们需要创建页面组件,“首页”和“我的”,如果你已经有自己的页面了,那么直接使用!

const HomeScreen = (props) => {
  return (
	<Layout style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Home Screen</Text>
    </Layout>
  );
};

4.3 创建Home页面栈

Tips:

  1. screenOptions用于设置页面的一些属性状态,headerShown表示是否显示头部,可以改为true试一试,默认是true
  2. initialRouteName表示设置该页面栈的默认路由
  3. 这个页面栈内可以有一个或多个Screen,也就是多屏页面,你可以放多个页面在里面,并且HomeStack内的页面可以一次跳转,类似ios上的侧滑打开,并支持横向滑动返回上一页
  4. 我们需要createNativeStackNavigator后再使用
  5. return的是一个组件
const HomeStack = createNativeStackNavigator();

const HomeStackScreen = () => {
  return (
    <HomeStack.Navigator
      initialRouteName="Home"
      screenOptions={{
        headerShown: false,
      }}
    >
      <HomeStack.Screen name="Home" component={HomeScreen} />
    </HomeStack.Navigator>
  );
};

4.4 Repeat,我们再创建一个“我的”页面以及对应的Stack

Code

const AccountScreen = (props) => {
  return (
	<Layout style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Account Screen</Text>
    </Layout>
  );
};

const AccountStack = createNativeStackNavigator();

const AccountStackScreen = () => {
  return (
    <AccountStack.Navigator
      initialRouteName="Account"
      screenOptions={{
        headerShown: false,
      }}
    >
      <AccountStack.Group>
        <AccountStack.Screen name="Account" component={AccountScreen} />
      </AccountStack.Group>
    </AccountStack.Navigator>
  );
};

4.5 编写BottomTabBar样式组件

Tips

  1. 这里使用的是UI Kitten的组件,props的来源是React-navigation
  2. props中的navigation和state,在其他页面内也会存在
    1. navigation.navigate(传入路由名称)可以用于切换页面,navigation.push(传入路由名称)可以插入页面到页面栈
    2. 其他的还请查阅Navigation prop reference
    3. state内的index表明当前选中的是第几个tab
  3. MaterialIcons组件是Icon组件,可以替换为你的Icon组件,记得需要函数形式,因为我们需要props中的颜色来保证Icon的颜色是正确的状态
  4. 如果使用expo的icon,可以前往这里找到你需要的icon https://icons.expo.fyi
  5. appearance="noIndicator"指定不需要指示线,更多api请查阅UI Kitten的bottom-tabs api

Code

const BottomTabBar = ({ navigation, state }) => (
  <BottomNavigation
    selectedIndex={state.index}
    appearance="noIndicator"
    onSelect={(index) => navigation.navigate(state.routeNames[index])}
  >
    <BottomNavigationTab
      title="Home"
      icon={(props) => (
        <MaterialIcons
          name="home"
          size={24}
          color={props.style.tintColor}
        />
      )}
    />
    <BottomNavigationTab
      title="Account"
      icon={(props) => (
        <MaterialIcons
          name="account-circle"
          size={24}
          color={props.style.tintColor}
        />
      )}
    />
  </BottomNavigation>
);

4.6 编写TabNavigation交互组件并export

Code

const TabNavigator = createBottomTabNavigator();
const TabNavigatorScreen = () => {
  return (
    <TabNavigator.Navigator tabBar={(props) => <BottomTabBar {...props} />}>
      <TabNavigator.Screen name="HomeStackScreen" component={HomeStackScreen} />
      <TabNavigator.Screen
        name="AccountStackScreen"
        component={AccountStackScreen}
      />
    </TabNavigator.Navigator>
  );
};

export default TabNavigatorScreen;

4.7 该文件完整代码

import React from "react";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
  import {
    BottomNavigation,
    BottomNavigationTab,
    Layout,
    Text,
  } from "@ui-kitten/components";
import { MaterialIcons } from "@expo/vector-icons";

// screens
// import AccountScreen from "../screens/Account";

const HomeScreen = (props) => {
  return (
    <Layout style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Home Screen</Text>
    </Layout>
  );
};

const HomeStack = createNativeStackNavigator();

const HomeStackScreen = () => {
  return (
    <HomeStack.Navigator
      initialRouteName="Home"
      screenOptions={{
        headerShown: false,
      }}
    >
      <HomeStack.Screen name="Home" component={HomeScreen} />
    </HomeStack.Navigator>
  );
};

const AccountScreen = (props) => {
  return (
    <Layout style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Account Screen</Text>
    </Layout>
  );
};

const AccountStack = createNativeStackNavigator();

const AccountStackScreen = () => {
  return (
    <AccountStack.Navigator
      initialRouteName="Account"
      screenOptions={{
        headerShown: false,
      }}
    >
      <AccountStack.Group>
        <AccountStack.Screen name="Account" component={AccountScreen} />
      </AccountStack.Group>
    </AccountStack.Navigator>
  );
};

const BottomTabBar = ({ navigation, state }) => (
  <BottomNavigation
    selectedIndex={state.index}
    appearance="noIndicator"
    onSelect={(index) => navigation.navigate(state.routeNames[index])}
  >
    <BottomNavigationTab
      title="Home"
      icon={(props) => (
        <MaterialIcons
          name="home"
          size={24}
          color={props.style.tintColor}
        />
      )}
    />
    <BottomNavigationTab
      title="Account"
      icon={(props) => (
        <MaterialIcons
          name="account-circle"
          size={24}
          color={props.style.tintColor}
        />
      )}
    />
  </BottomNavigation>
);

const TabNavigator = createBottomTabNavigator();
const TabNavigatorScreen = () => {
  return (
    <TabNavigator.Navigator tabBar={(props) => <BottomTabBar {...props} />}>
      <TabNavigator.Screen name="HomeStackScreen" component={HomeStackScreen} />
      <TabNavigator.Screen
        name="AccountStackScreen"
        component={AccountStackScreen}
      />
    </TabNavigator.Navigator>
  );
};

export default TabNavigatorScreen;

5.最后一步,在App.js中使用它

import React from "react";
import * as eva from "@eva-design/eva";
import { ApplicationProvider } from "@ui-kitten/components"; // Provider 
import AppNavigator from "./src/navigator/AppNavigator"; // 导航
import { default as theme } from "./src/color/custom-theme.json"; // 如果没制作主题文件,可参考上一篇博文,或删除该段代码以及下方的theme变量使用
import { SafeAreaView } from "react-native-safe-area-context"; // 安全边界

const App = () => {
  return (
      <ApplicationProvider {...eva} theme={{ ...eva.light, ...theme }}>
        <SafeAreaView style={{ flex: 1 }}>
          <AppNavigator />
        </SafeAreaView>
      </ApplicationProvider>
  );
};

export default App;

完成!如有帮助请关注点赞~文章来源地址https://www.toymoban.com/news/detail-448872.html

到了这里,关于[快速上手RN] 3. React native 制作底部导航栏 Bottom Tab Bar的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 求助帖:React Native failed installing Ruby Gems(rn 下载 Runby Gems 失败)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 react native当前版本0.72.4,官方文档也是最新的, macos:13.3。 最近要用RN做一个项目,参照官方文档链接: link 已经完成了前期的配置工作,直到最后一步创建AsomeProject示例项目时候,RN下载依赖卡在Inst

    2024年02月07日
    浏览(33)
  • RN 使用react-navigation写可以滚动的横向导航条(expo项目)

      装包:             参考链接: https://chat.xutongbao.top/ https://www.cnblogs.com/tengyuxin/p/13263143.html https://reactnavigation.org/docs/material-top-tab-navigator/ 

    2024年02月13日
    浏览(42)
  • uniapp制作app与小程序前端——底部导航栏

    app 用uniapp制作一个app 功能板块:xxx,xxx,xxx,xxx,xxx 板块的需求: 1.导航栏——包括5大分区 2.呈现内容——待定~ 导航栏 1.创建新项目, 注:pages——页面文件存放处 static——静态内容存放处(图片) pages.json——全局配置区 manifest.json——打包配置区 2.打开uniapp官网,点

    2024年02月05日
    浏览(34)
  • React学习——快速上手

    https://php.cn/faq/400956.html 1、可以手动使用npm来安装各种插件,来从头到尾自己搭建环境。 如: 2、脚手架 create-react-app https://react.dev/learn/tutorial-tic-tac-toe 官方文档的井字游戏案例 1、分解组件 2、构建静态版本 可以“自上而下”地构建组件,从层次结构中较高的组件开始构建,

    2024年02月22日
    浏览(27)
  • React Router 6 快速上手

    React Router 以三个不同的包发布到 npm 上,它们分别为: react-router: 路由的核心库,提供了很多的:组件、钩子。 react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM 的组件,例如 BrowserRouter 等 。 react-router-native: 包括react-router所有内容,并添加一些专门用于ReactNa

    2024年02月11日
    浏览(22)
  • 从Vue快速上手React

    还没使用过React 的 vue同学可以通过这篇博客快速上手React。 Vue 数据读写: React 数据读写: Vue提供了 watch 帮忙监听数据变化 React提供了 useEffect 帮忙监听数据变化,但请注意,useEffect还有其他用途,并不局限于此 注意:vue中的数据监听watch可以直接获取新旧值,而react中数据

    2024年02月13日
    浏览(26)
  • 【RN】学习使用 Reactive Native内置UI组件

    当把导航处理好后,就可以学习使用ui组件了(两者没有先后关系,个人习惯)。 在 Android 和 iOS 开发中,一个视图是 UI 的基本组成部分:屏幕上的一个小矩形元素、可用于显示文本、图像或响应用户输入。甚至应用程序最小的视觉元素(例如一行文本或一个按钮)也都是各

    2024年02月22日
    浏览(32)
  • 快速上手React:从概述到组件与事件处理

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 「推荐专栏」 : ★ java一站式服务 ★ ★ React从入门到精通 ★ ★ 前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升 ★ ★ 从0到英雄,vue成神之路 ★ ★ 解决算法,一个专栏就够了 ★ ★

    2024年02月13日
    浏览(28)
  • React-Router 5.0 制作导航栏+页面参数传递

    使用 React 构建 SPA 应用(单页面应用),要想实现页面间的跳转,首先想到的就是使用路由。在 React 中,常用的有两个包可以实现这个需求,那就是 react-router 和 react-router-dom 。本文主要针对 react-router-dom 进行说明。 众所周知, JS 由 DOM BOM ECMAScript 组成, React-Router-Dom 使用 BOM 提供

    2024年02月08日
    浏览(29)
  • env(safe-area-inset-bottom)解决ios底部小黑线遮挡问题

    最近在做微信小程序,有一个功能是提交按钮放在屏幕底部,使用了position:absolute定位,bottom设置为0,正常显示应该是这样的 : 但是自测的时候发现如果在部分ios机型,比如iPhoneX、iPhone12/13的时候,按钮会被ios底部的小黑线所遮挡一部分: 这样显示明显不太友好,因此研

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包