【React Native】布局文件-底部TabBar

布局文件-底部tabBar

內容配置

export default function Layout() {return (<Tabs />);
}

默認會將布局文件是將與它在同一個目錄的所有文件,包括下級目錄的文件,全都配置成Tab了。:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

這樣做顯然不對,正確的做法是

  • app目錄里新建一個(tabs)文件夾,注意了,名字上有一對小括號。
  • 里面新建一個_layout.js布局文件,這里就專門放TabBar配置。
  • 然后將index.js,挪動到(tabs)里面。
  • (tabs)里,再新建一個videos.jsusers.js文件。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

app/_layout.js

import { Stack } from 'expo-router';export default function Layout() {return (<StackscreenOptions={{title: '',                      // 默認標題為空headerTitleAlign: 'center',     // 安卓標題欄居中animation: 'slide_from_right',  // 安卓使用左右切屏headerTintColor: '#1f99b0',     // 導航欄中文字、按鈕、圖標的顏色headerTitleStyle: {             // 標題組件的樣式fontWeight: '400',color: '#2A2929',fontSize: 16,},headerBackButtonDisplayMode: 'minimal', // 設置返回按鈕只顯示箭頭,不顯示文字}}>{/* Tabs */}<Stack.Screen name="(tabs)" options={{ headerShown: false }} />{/* Cards */}<Stack.Screen name="articles/index" options={{ title: '通知' }} /><Stack.Screen name="settings/index" options={{ title: '設置' }} /><Stack.Screen name="courses/[id]" options={{ title: '課程詳情' }} /><Stack.Screen name="search/index" options={{ title: '搜索' }} /></Stack>);
}
  • TabBar的配置:

    • 注意這里有個headerShown,這是因為TabBar也會自帶一個導航欄。
    • 如果不隱藏,它會和Stack的導航欄同時出現,這就會出來兩個導航欄了。
  • 底下給各個頁面都添加上了title

  • Stack里頁面是有兩種形式的:

    • 這種頁面左右滑動跳轉的就叫Cards
    • 另一種頁面從屏幕底部彈出的,叫做模態(Modal)

app/(tabs)/_layout.js

import { Link, Tabs } from 'expo-router'
import { Image } from 'expo-image'
import { SimpleLineIcons } from '@expo/vector-icons'
import { StyleSheet, TouchableOpacity } from 'react-native'/*** 導航欄 Logo 組件*/
function LogoTitle() {return <Image style={style.logo} contentFit="contain" source={require('../../assets/logo-light.png')}/>
}/*** 導航欄按鈕組件* @param props*/
function HeaderButton({ href, ...rest }) {return (<Link href={href} asChild><TouchableOpacity><SimpleLineIcons size={20} color="#1f99b0" {...rest} /></TouchableOpacity></Link>)
}export default function TabsLayout() {return (<TabsscreenOptions={{headerTitleAlign: 'center',       // 安卓標題欄居中headerTitle: props => <LogoTitle {...props} />,headerLeft: () => <HeaderButton name="bell" href="/articles" style={style.headerLeft} />,headerRight: () => (<><HeaderButton name="magnifier" href="/search" style={style.headerRight} /><HeaderButton name="options" href="/settings" style={style.headerRight} /></>),}}><Tabs.Screenname="index"options={{ title: '首頁' }}/><Tabs.Screenname="videos"options={{ title: '視頻課程' }}/><Tabs.Screenname="users"options={{ title: '我的' }}/></Tabs>);
}const style = StyleSheet.create({logo: {width: 130,height: 30,},headerLeft: {marginLeft: 15,},headerRight: {marginRight: 15,},
});

(tabs)目錄,專門用來放各個Tab頁。名字上的這個小括號,叫做路由分組

  • 利用它,將一些相關的文件,放在一起。

  • 這種帶小括號的目錄名,在URL里不計算路徑!

    • index.jsURL,依然還是/index,就像還在app目錄里一樣,它依然還是首頁
    • videos.js文件的URL,其實是/videos,而不是/(tabs)/videos,同理。
  • 底下的和剛才不同,剛才的布局文件里使用的是StackStack.Screen。這里要用TabsTabs.Screen

  • 然后將頂部的按鈕,配置到了最外層的screenOptions里,這樣所有的Tab頁在導航欄上,都會有Logo和按鈕。

  • Tab頁,是可以隨意跳轉到非Tab頁的。從哪里都能跳過去,它就屬于共享路由。

  • 一個項目里,也可以有多個布局文件,布局文件只對和它同級或下級文件生效。

圖標和樣式

在上面的基礎上增加圖標和樣式:

    /*** TabBar 圖標組件* @param props*/function TabBarIcon(props) {return <SimpleLineIcons size={25} {...props} />;}<Tabs . Screenname="users"options={{title: "我的",tabBarIcon: ({ color }) => <TabBarIcon name="user" color={color} />,}}/><TabsscreenOptions={{headerTitleAlign: "center", // 安卓標題欄居中headerTitle: (props) => <LogoTitle {...props} />,headerLeft: () => (<HeaderButton name="bell" href="/articles" style={style.headerLeft} />),headerRight: () => (<><HeaderButtonname="magnifier"href="/search"style={style.headerRight}/><HeaderButtonname="options"href="/settings"style={style.headerRight}/></>),tabBarActiveTintColor: "#1f99b0", // 設置 TabBar 選中項的顏色tabBarStyle: {height: 80, // 設置 TabBar 的高度},tabBarLabelStyle: {marginTop: 4, // 設置 TabBar 文字與圖標之間的間距},}}>

完整代碼:

import { Link, Tabs } from "expo-router";
import { Image } from "expo-image";
import { SimpleLineIcons } from "@expo/vector-icons";
import { StyleSheet, TouchableOpacity } from "react-native";/*** 導航欄 Logo 組件*/
function LogoTitle() {return (<Imagestyle={style.logo}contentFit="contain"source={require("../../assets/logo-light.png")}/>);
}/*** TabBar 圖標組件* @param props*/
function TabBarIcon(props) {return <SimpleLineIcons size={25} {...props} />;
}/*** 導航欄按鈕組件* @param props*/
function HeaderButton({ href, ...rest }) {return (<Link href={href} asChild><TouchableOpacity><SimpleLineIcons size={20} color="#1f99b0" {...rest} /></TouchableOpacity></Link>);
}export default function TabsLayout() {return (<TabsscreenOptions={{headerTitleAlign: "center", // 安卓標題欄居中headerTitle: (props) => <LogoTitle {...props} />,headerLeft: () => (<HeaderButton name="bell" href="/articles" style={style.headerLeft} />),headerRight: () => (<><HeaderButtonname="magnifier"href="/search"style={style.headerRight}/><HeaderButtonname="options"href="/settings"style={style.headerRight}/></>),tabBarActiveTintColor: "#1f99b0", // 設置 TabBar 選中項的顏色tabBarStyle: {height: 80, // 設置 TabBar 的高度},tabBarLabelStyle: {marginTop: 4, // 設置 TabBar 文字與圖標之間的間距},}}><Tabs.Screenname="index"options={{title: "發現",tabBarIcon: ({ color }) => (<TabBarIcon name="compass" color={color} />),}}/><Tabs.Screenname="videos"options={{title: "視頻課程",tabBarIcon: ({ color }) => (<TabBarIcon name="camrecorder" color={color} />),}}/><Tabs.Screenname="users"options={{title: "我的",tabBarIcon: ({ color }) => <TabBarIcon name="user" color={color} />,}}/></Tabs>);
}const style = StyleSheet.create({logo: {width: 130,height: 30,},headerLeft: {marginLeft: 15,},headerRight: {marginRight: 15,},
});

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89179.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CompareFace使用

CompareFace 使用 CompareFace 有三種服務&#xff0c;分別是人臉識別&#xff08;RECOGNITION&#xff09;、人臉驗證&#xff08;VERIFICATION&#xff09;、人臉檢測&#xff08;DETECTION&#xff09;。 人臉識別其實就是人臉身份識別(每張照片只有一個人臉)&#xff0c;…

APP測試之Monkey壓力測試

&#xff08;一&#xff09;Monkey簡介 Monkey意指猴子&#xff0c;頑皮淘氣。所以Monkey測試&#xff0c;顧名思義也就像猴子一樣在軟件上亂敲按鍵&#xff0c;猴子什么都不懂&#xff0c;就愛搗亂。 Monkey 是 Android SDK 自帶的命令行工具&#xff0c;它通過向系統發送偽…

時序大模型為時序數據庫帶來的變革與機遇

時序數據&#xff08;Time Series Data&#xff09;作為記錄系統狀態隨時間變化的重要數據類型&#xff0c;在物聯網、金融交易、工業監控等領域呈爆炸式增長。傳統時序數據庫專注于高效存儲和查詢時序數據&#xff0c;而時序大模型&#xff08;Time Series Foundation Models&…

深入核心:理解Spring Boot的三大基石:起步依賴、自動配置與內嵌容器

深入核心&#xff1a;理解Spring Boot的三大基石&#xff1a;起步依賴、自動配置與內嵌容器 摘要&#xff1a;在上一章&#xff0c;我們領略了Spring Boot帶來的革命性開發體驗。但魔法的背后&#xff0c;必有其科學的支撐。本章將帶你深入Spring Boot的內核&#xff0c;系統性…

達夢數據庫配置兼容MySQL

前言 作為一名數據庫管理員或開發者&#xff0c;當項目需要從MySQL遷移到達夢數據庫時&#xff0c;最關心的莫過于兼容性問題。達夢作為國產數據庫的佼佼者&#xff0c;提供了良好的MySQL兼容模式&#xff0c;今天我就來分享一下如何配置達夢數據庫以實現對MySQL的兼容。 一、為…

js與vue基礎學習

vue創建項目 安裝node安裝node、npm、cnpm node -v npm -v #npm服務器位置處于國外&#xff0c;下載包的速度會比較緩慢。阿里為國內用戶提供的cnpm&#xff0c;他是npm的鏡像&#xff0c;下載第三方包時&#xff0c;們完全可以使用cnpm來替代npm。 cnpm -v在node中執行JavaScr…

【開源.NET】一個 .NET 開源美觀、靈活易用、功能強大的圖表庫

文章目錄一、項目介紹二、適用場景三、功能模塊四、功能特點五、效果展示六、開源地址一、項目介紹 LiveCharts2 是一個開源、簡單、靈活、交互式且功能強大的 .NET 圖表庫。LiveCharts2 現在幾乎可以在任何地方運行&#xff1a;Maui、Uno Platform、Blazor-wasm、WPF、WinFor…

使用Whistle自定義接口返回內容:Mock流式JSON數據全解析

一.mock接口返回數據流程 定位目標接口 在Whistle的Network面板中找到需要Mock的接口&#xff0c;右鍵點擊請求信息&#xff0c;選擇COPY -> URL復制完整URL&#xff0c;確保URL路徑精確到具體接口。準備Mock數據 點擊對應接口&#xff0c;在右側面板切換到response標簽頁&a…

【前端】富文本編輯器插件 wangEditor 5 基本使用(Vue2)

https://www.wangeditor.com/v5 一、安裝 首先安裝editor yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save安裝Vue2組件 yarn add wangeditor/editor-for-vue # 或者 npm install wangeditor/editor-for-vue --save或者Vue3 yarn add wangeditor/…

自適應哈希索引 和 日志緩沖區

目錄 1. 自適應哈希索引在內存中的位置 2. 自適應哈希索引的作用 3. 為什么要創建自適應哈希索引 4. 適應哈希索引的Key -Value如何設置&#xff1f; 5. 日志緩沖區在內存中的位置 6. 日志緩沖區的作用 7. 日志不通過LogBuffer直接寫入磁盤不行嗎&#xff1f; 1. 自適應哈…

中國旅行社協會在京召開“文旅人工智能應用研討會”,助力文旅創新發展

7月15日&#xff0c;由中國旅行社協會數字經濟專業委員會和在線旅行服務商分會聯合主辦的“人工智能技術在文旅產業中的應用”研討會在北京舉行。中國旅行社協會副會長、秘書長孫桂珍出席并致辭&#xff0c;中國工程院外籍院士、具身智能機器人專家張建偉、北京第二外國語學院旅…

Linux之Zabbix分布式監控篇(一)

一、概念和特點概念Zabbix是一款開源、免費的監控軟件 主要用于7*24*365實時監控網絡設置&#xff0c;操作系統&#xff0c;應用程序&#xff0c;網絡帶寬等資源的運行狀態&#xff0c;并且一旦發生異常能夠第一時間個SA管理員發送報警信息特點Zabbix是c/s結構&#xff0c;有c…

ZYNQ千兆光通信實戰:Tri Mode Ethernet MAC深度解析

—— 從硬件設計到Linux驅動的光通信創新實踐** 當ZYNQ遇上光通信 在工業控制、醫療成像和航空航天等領域,抗干擾、長距離傳輸的光通信技術至關重要。Xilinx ZYNQ-7000系列憑借ARM+FPGA的架構,結合Tri Mode Ethernet MAC (TEMAC) 核心,為千兆光通信提供了完美解決方案。本文…

求不重疊區間總和最大值

例題鏈接&#xff1a;1051-習題-數學考試_2021秋季算法入門班第一章習題&#xff1a;模擬、枚舉、貪心 來源&#xff1a;牛客網 時間限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他語言2秒 空間限制&#xff1a;C/C/Rust/Pascal 32 M&#xff0c;其他語言64 M 64bit …

【Golang】GORM - GEN工具 快速開始

文章目錄建項目建庫建表main.gouser.gocompany.go生成效果&#xff08;更進一步&#xff09;自定義dynamic SQL實踐官方地址&#xff1a;https://gorm.io/zh_CN/gen/index.html 以mysql為例 建項目 go mod init 項目名稱 go mod tidy建庫建表 建數據庫demo&#xff0c;正常…

飛書 “打破” AI 與協同辦公的「黑箱」

文 | 智能相對論作者 | 陳泊丞在協同辦公領域&#xff0c;自從有了AI&#xff0c;微軟、釘釘、Google Workspace、Salesforce、企業微信、飛書等廠商都試圖通過深度整合AI技術&#xff0c;從智能會議、內容創作、數據管理等場景重構辦公范式。微軟通過Microsoft 365 Copilot將A…

leetcode:674. 最長連續遞增序列[動歸]

學習要點 練習動歸注意不要馬虎 題目鏈接 674. 最長連續遞增序列 - 力扣&#xff08;LeetCode&#xff09; 題目描述 解法&#xff1a;動歸 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();if(nums.size() < 1) …

【html常見頁面布局】

考拉商城界面效果htmlcss效果 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

摩爾線程MUSA架構深度調優指南:從CUDA到MUSA的顯存訪問模式重構原則

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 當國產GPU面臨生態壁壘&#xff0c;顯存訪問效率成為性能突破的關鍵戰場。本文將深入揭示摩爾…

2025江蘇省信息安全管理與評估賽項二三階段任務書

任務 3 網絡安全事件響應、數字取證調查、網絡安全滲透任務3.1&#xff1a;網絡安全事件響應&#xff08;100分&#xff09;X集團的一臺存儲關鍵信息的服務器遭受到了黑客的攻擊&#xff0c;現在需要你對該服務器進行應急排查&#xff0c;該服務器的系統目錄被上傳惡意文件&…