国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[快速上手RN] 3. React native 制作底部導(dǎo)航欄 Bottom Tab Bar

這篇具有很好參考價(jià)值的文章主要介紹了[快速上手RN] 3. React native 制作底部導(dǎo)航欄 Bottom Tab Bar。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

系列教程

[快速上手RN] 0.React Native 快速啟動(dòng)項(xiàng)目
[快速上手RN] 1. React native 項(xiàng)目集成UI Kitten
[快速上手RN] 2. React native 項(xiàng)目色彩主題色編輯及使用
[快速上手RN] 3. React native 制作底部導(dǎo)航欄 Bottom Tab Bar
[快速上手RN] 4. React native 集成redux

1.最終效果

首先我們確認(rèn)目標(biāo)

  1. 在APP底部新增一個(gè)導(dǎo)航欄
  2. 導(dǎo)航欄點(diǎn)擊tab時(shí)會(huì)切換頁(yè)面內(nèi)容
  3. tab包含Icon、名稱,并且切換時(shí)會(huì)顏色變更
    如下圖
    [快速上手RN] 3. React native 制作底部導(dǎo)航欄 Bottom Tab Bar

1. 安裝依賴

我們所需要的依賴如下

  1. react-navigation
  2. @react-navigation/native
  3. @react-navigation/native-stack
  4. @react-navigation/bottom-tabs
    以上4個(gè)主要是用于做頁(yè)面棧的路由功能,用于更好的定義每個(gè)頁(yè)面的狀態(tài),以及跳轉(zhuǎn)方式,還有頭部的表現(xiàn)形式等等,如果想不僅限于用,還想知道react-navigation的工作方式或深入了解使用方式,請(qǐng)查閱相關(guān)文檔~
    地址:https://reactnavigation.org
  5. UI Kitten
    我們需要使用它的組件來(lái)快速構(gòu)建我們的底部導(dǎo)航欄
  6. react-native-safe-area-context
    我們需要考慮到ios界面時(shí)存在Home Indicator (底部的白色小橫線)時(shí),與我們的頁(yè)面沖突的情況,所以需要該插件來(lái)幫助我們界定一個(gè)安全區(qū)域
  7. Expo
    Expo是一個(gè)非常好用的工具,這次我們將使用他的Icon組件,如果自己有自己的Icon,那么本次可以不使用它

1.1 安裝react-navigation相關(guān)依賴

安裝命令如下,如果覺(jué)得麻煩可以復(fù)制粘貼~

  • 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

具體請(qǐng)查看博文
[快速上手RN] 1. React native 項(xiàng)目集成UI Kitten
這里暫不贅述

1.3 使用Expo

如果你的項(xiàng)目是通過(guò)Expo啟動(dòng)的,那么直接使用即可,否則也可以使用自己的Icon庫(kù)或者試試好用的Expo來(lái)開(kāi)發(fā)~
參考博文
[快速上手RN] 0.React Native 快速啟動(dòng)項(xiàng)目

2.創(chuàng)建文件

  1. 在你的項(xiàng)目目錄下的src文件夾中創(chuàng)建導(dǎo)航欄文件夾navigator
  2. src/navigator/下創(chuàng)建2個(gè)文件
    1.AppNavigator.jsx用于export項(xiàng)目的整個(gè)導(dǎo)航
    2.TabNavigation.jsx用于編寫(xiě)底部導(dǎo)航欄的相關(guān)代碼

3.AppNavigator.jsx

以下為該文件代碼,根據(jù)react-navigation的文檔,我們需要做一個(gè)container包住navigator,并導(dǎo)出以便App.js使用
需要import TabNavigation

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


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

4.TabNavigation.jsx

打開(kāi)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 創(chuàng)建Home頁(yè)面

我們需要?jiǎng)?chuàng)建頁(yè)面組件,“首頁(yè)”和“我的”,如果你已經(jīng)有自己的頁(yè)面了,那么直接使用!

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

4.3 創(chuàng)建Home頁(yè)面棧

Tips:

  1. screenOptions用于設(shè)置頁(yè)面的一些屬性狀態(tài),headerShown表示是否顯示頭部,可以改為true試一試,默認(rèn)是true
  2. initialRouteName表示設(shè)置該頁(yè)面棧的默認(rèn)路由
  3. 這個(gè)頁(yè)面棧內(nèi)可以有一個(gè)或多個(gè)Screen,也就是多屏頁(yè)面,你可以放多個(gè)頁(yè)面在里面,并且HomeStack內(nèi)的頁(yè)面可以一次跳轉(zhuǎn),類似ios上的側(cè)滑打開(kāi),并支持橫向滑動(dòng)返回上一頁(yè)
  4. 我們需要createNativeStackNavigator后再使用
  5. return的是一個(gè)組件
const HomeStack = createNativeStackNavigator();

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

4.4 Repeat,我們?cè)賱?chuàng)建一個(gè)“我的”頁(yè)面以及對(duì)應(yīng)的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 編寫(xiě)B(tài)ottomTabBar樣式組件

Tips

  1. 這里使用的是UI Kitten的組件,props的來(lái)源是React-navigation
  2. props中的navigation和state,在其他頁(yè)面內(nèi)也會(huì)存在
    1. navigation.navigate(傳入路由名稱)可以用于切換頁(yè)面,navigation.push(傳入路由名稱)可以插入頁(yè)面到頁(yè)面棧
    2. 其他的還請(qǐng)查閱Navigation prop reference
    3. state內(nèi)的index表明當(dāng)前選中的是第幾個(gè)tab
  3. MaterialIcons組件是Icon組件,可以替換為你的Icon組件,記得需要函數(shù)形式,因?yàn)槲覀冃枰猵rops中的顏色來(lái)保證Icon的顏色是正確的狀態(tài)
  4. 如果使用expo的icon,可以前往這里找到你需要的icon https://icons.expo.fyi
  5. appearance="noIndicator"指定不需要指示線,更多api請(qǐng)查閱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 編寫(xiě)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"; // 導(dǎo)航
import { default as theme } from "./src/color/custom-theme.json"; // 如果沒(méi)制作主題文件,可參考上一篇博文,或刪除該段代碼以及下方的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;

完成!如有幫助請(qǐng)關(guān)注點(diǎn)贊~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-448872.html

到了這里,關(guān)于[快速上手RN] 3. React native 制作底部導(dǎo)航欄 Bottom Tab Bar的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

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

    求助帖:React Native failed installing Ruby Gems(rn 下載 Runby Gems 失敗)

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 react native當(dāng)前版本0.72.4,官方文檔也是最新的, macos:13.3。 最近要用RN做一個(gè)項(xiàng)目,參照官方文檔鏈接: link 已經(jīng)完成了前期的配置工作,直到最后一步創(chuàng)建AsomeProject示例項(xiàng)目時(shí)候,RN下載依賴卡在Inst

    2024年02月07日
    瀏覽(25)
  • RN 使用react-navigation寫(xiě)可以滾動(dòng)的橫向?qū)Ш綏l(expo項(xiàng)目)

    RN 使用react-navigation寫(xiě)可以滾動(dòng)的橫向?qū)Ш綏l(expo項(xiàng)目)

    ? 裝包: ? ? ? ? ? ? 參考鏈接: https://chat.xutongbao.top/ https://www.cnblogs.com/tengyuxin/p/13263143.html https://reactnavigation.org/docs/material-top-tab-navigator/?

    2024年02月13日
    瀏覽(25)
  • uniapp制作app與小程序前端——底部導(dǎo)航欄

    uniapp制作app與小程序前端——底部導(dǎo)航欄

    app 用uniapp制作一個(gè)app 功能板塊:xxx,xxx,xxx,xxx,xxx 板塊的需求: 1.導(dǎo)航欄——包括5大分區(qū) 2.呈現(xiàn)內(nèi)容——待定~ 導(dǎo)航欄 1.創(chuàng)建新項(xiàng)目, 注:pages——頁(yè)面文件存放處 static——靜態(tài)內(nèi)容存放處(圖片) pages.json——全局配置區(qū) manifest.json——打包配置區(qū) 2.打開(kāi)uniapp官網(wǎng),點(diǎn)

    2024年02月05日
    瀏覽(23)
  • React學(xué)習(xí)——快速上手

    React學(xué)習(xí)——快速上手

    https://php.cn/faq/400956.html 1、可以手動(dòng)使用npm來(lái)安裝各種插件,來(lái)從頭到尾自己搭建環(huán)境。 如: 2、腳手架 create-react-app https://react.dev/learn/tutorial-tic-tac-toe 官方文檔的井字游戲案例 1、分解組件 2、構(gòu)建靜態(tài)版本 可以“自上而下”地構(gòu)建組件,從層次結(jié)構(gòu)中較高的組件開(kāi)始構(gòu)建,

    2024年02月22日
    瀏覽(17)
  • 從Vue快速上手React

    還沒(méi)使用過(guò)React 的 vue同學(xué)可以通過(guò)這篇博客快速上手React。 Vue 數(shù)據(jù)讀寫(xiě): React 數(shù)據(jù)讀寫(xiě): Vue提供了 watch 幫忙監(jiān)聽(tīng)數(shù)據(jù)變化 React提供了 useEffect 幫忙監(jiān)聽(tīng)數(shù)據(jù)變化,但請(qǐng)注意,useEffect還有其他用途,并不局限于此 注意:vue中的數(shù)據(jù)監(jiān)聽(tīng)watch可以直接獲取新舊值,而react中數(shù)據(jù)

    2024年02月13日
    瀏覽(24)
  • React Router 6 快速上手

    React Router 以三個(gè)不同的包發(fā)布到 npm 上,它們分別為: react-router: 路由的核心庫(kù),提供了很多的:組件、鉤子。 react-router-dom: 包含react-router所有內(nèi)容,并添加一些專門(mén)用于 DOM 的組件,例如 BrowserRouter 等 。 react-router-native: 包括react-router所有內(nèi)容,并添加一些專門(mén)用于ReactNa

    2024年02月11日
    瀏覽(13)
  • 【RN】學(xué)習(xí)使用 Reactive Native內(nèi)置UI組件

    【RN】學(xué)習(xí)使用 Reactive Native內(nèi)置UI組件

    當(dāng)把導(dǎo)航處理好后,就可以學(xué)習(xí)使用ui組件了(兩者沒(méi)有先后關(guān)系,個(gè)人習(xí)慣)。 在 Android 和 iOS 開(kāi)發(fā)中,一個(gè)視圖是 UI 的基本組成部分:屏幕上的一個(gè)小矩形元素、可用于顯示文本、圖像或響應(yīng)用戶輸入。甚至應(yīng)用程序最小的視覺(jué)元素(例如一行文本或一個(gè)按鈕)也都是各

    2024年02月22日
    瀏覽(24)
  • 快速上手React:從概述到組件與事件處理

    快速上手React:從概述到組件與事件處理

    「作者主頁(yè)」 :雪碧有白泡泡 「?jìng)€(gè)人網(wǎng)站」 :雪碧的個(gè)人網(wǎng)站 「推薦專欄」 : ★ java一站式服務(wù) ★ ★ React從入門(mén)到精通 ★ ★ 前端炫酷代碼分享 ★ ★ 從0到英雄,vue成神之路★ ★ uniapp-從構(gòu)建到提升 ★ ★ 從0到英雄,vue成神之路 ★ ★ 解決算法,一個(gè)專欄就夠了 ★ ★

    2024年02月13日
    瀏覽(23)
  • React-Router 5.0 制作導(dǎo)航欄+頁(yè)面參數(shù)傳遞

    React-Router 5.0 制作導(dǎo)航欄+頁(yè)面參數(shù)傳遞

    使用 React 構(gòu)建 SPA 應(yīng)用(單頁(yè)面應(yīng)用),要想實(shí)現(xiàn)頁(yè)面間的跳轉(zhuǎn),首先想到的就是使用路由。在 React 中,常用的有兩個(gè)包可以實(shí)現(xiàn)這個(gè)需求,那就是 react-router 和 react-router-dom 。本文主要針對(duì) react-router-dom 進(jìn)行說(shuō)明。 眾所周知, JS 由 DOM BOM ECMAScript 組成, React-Router-Dom 使用 BOM 提供

    2024年02月08日
    瀏覽(18)
  • env(safe-area-inset-bottom)解決ios底部小黑線遮擋問(wèn)題

    env(safe-area-inset-bottom)解決ios底部小黑線遮擋問(wèn)題

    最近在做微信小程序,有一個(gè)功能是提交按鈕放在屏幕底部,使用了position:absolute定位,bottom設(shè)置為0,正常顯示應(yīng)該是這樣的 : 但是自測(cè)的時(shí)候發(fā)現(xiàn)如果在部分ios機(jī)型,比如iPhoneX、iPhone12/13的時(shí)候,按鈕會(huì)被ios底部的小黑線所遮擋一部分: 這樣顯示明顯不太友好,因此研

    2024年02月16日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包