中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

uniapp怎么自定義tabbar

發布時間:2023-04-11 16:56:47 來源:億速云 閱讀:402 作者:iii 欄目:開發技術

這篇文章主要講解了“uniapp怎么自定義tabbar”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“uniapp怎么自定義tabbar”吧!

思路

實現思路就是通過通過自定義view來實現我們這個tabbar功能,然后頁面通過組件來展示。通過點擊不同的tab來顯示不同的組件來達到模擬原生tabbar切換效果。那有些人要問了,你咋知道我項目中有多少個tab,這些tab叫什么名字了?那這里就可以利用uniapp提供的組件easycom模式來解決這些問題,只要我們設置好組件的限制個數和提前占位名稱,這些問題就迎刃而解。

實現

1、我們現在components(沒有就新建一個components目錄)目錄下新建一個文件夾(我這里叫ctab),然后分別新建一個vue組件和一個js文件。組件可以讓我們在其他地方引用,js文件主要是做配置。

uniapp怎么自定義tabbar

2、新建tab組件,我們組件最多限制5個tab組件,然后需要通過easycom占位來實現,所以你需要幾個tab組件就在components目錄下建幾個組件命名為ctabx。如下所示,我這里要展示三個tab:

uniapp怎么自定義tabbar

特別注意這里的tab組件命名一定要符合easycom規范,不然可能會引起組件引用錯誤。

這里示例一個ctab1寫法:

<template>
	<view >
		首頁
	</view>
</template>
<script>
	export default {
		name: "ctab1",
		data() {
			return {};
		},
		mounted() {},
		methods: {}
	}
</script>
<style>
</style>

3、tabbar組件ctab.vue實現,這里就直接上代碼了,直接copy就能使用,關鍵地方已加上注釋

<template>
	<view>
		<!--中間按鈕凸起模式-->
		<block v-if="midBtn && midBtn.show">
			<!--凸起模式最多展示四個-->
			<block v-if="tabs.length < 4">
				<ctab1 v-show="sindex == 0"></ctab1>
				<ctab2 v-show="sindex == 2"></ctab2>
			</block>
			<block v-else="tabs.length >= 4">
				<ctab1 v-show="sindex == 0"></ctab1>
				<ctab2 v-show="sindex == 1"></ctab2>
				<ctab3 v-show="sindex == 3"></ctab3>
				<ctab4 v-show="sindex == 4"></ctab4>
			</block>
			<view class="tabbar">
				<!--中間按鈕凸起模式tab為3個或者5個-->
				<view class="tab-item"
					  v-for="(item,index) in (tabs.length < 4 ? 3 : 5)"
					  :key="item"
					  @click="handleTabClick(index)">
					  <!--中間按鈕凸起顯示圖片和文字-->
					<block v-if="index == floor">
						<view :
								class="mid-btn">
							<image :src="midBtn.icon"
								   :
								   @click="handleMidBtn"/>
						</view>
						<text class="mid-text"
							  :
							  v-show="midBtn.showtext">{{midBtn.text}}</text>
					</block>
					<!--普通tab這里需要注意index選擇-->
					<block v-else>
						<view class="c-tab-item">
							<text :class="'tab-iconfont iconfont '+(tabs[index < floor ? index : index-1].iconfont)"
								  :
								  v-if="tabs[index < floor ? index : index-1].iconfont"/>
							<image :src="sindex == index ? tabs[index < floor ? index : index-1].iconSelect : tabs[index < floor ? index : index-1].icon"
								   class="tab-icon"
								   v-else/>
							<text class="tab-text"
								  :>{{tabs[index < floor ? index : index-1].text}}</text>
							<view class="corner"
								  v-show="tabs[index < floor ? index : index-1].mark > 0">{{tabs[index < floor ? index : index-1].mark > 99 ? '99+' : tabs[index < floor ? index : index-1].mark}}</view>
						</view>
					</block>
				</view>
			</view>
		</block>
		<!--普通模式-->
		<block v-else>
			<block v-if="tabs.length == 1">
				<ctab1 v-show="sindex == 0 && tabs[0].show"></ctab1>
			</block>
			<block v-else-if="tabs.length == 2">
				<ctab1 v-show="sindex == 0 && tabs[0].show"></ctab1>
				<ctab2 v-show="sindex == 1 && tabs[1].show"></ctab2>
			</block>
			<block v-else-if="tabs.length == 3">
				<ctab1 v-show="sindex == 0 && tabs[0].show"></ctab1>
				<ctab2 v-show="sindex == 1 && tabs[1].show"></ctab2>
				<ctab3 v-show="sindex == 2 && tabs[2].show"></ctab3>
			</block>
			<block v-else-if="tabs.length == 4">
				<ctab1 v-show="sindex == 0 && tabs[0].show"></ctab1>
				<ctab2 v-show="sindex == 1 && tabs[1].show"></ctab2>
				<ctab3 v-show="sindex == 2 && tabs[2].show"></ctab3>
				<ctab4 v-show="sindex == 3 && tabs[3].show"></ctab4>
			</block>
			<block v-else-if="tabs.length >= 5">
				<ctab1 v-show="sindex == 0 && tabs[0].show"></ctab1>
				<ctab2 v-show="sindex == 1 && tabs[1].show"></ctab2>
				<ctab3 v-show="sindex == 2 && tabs[2].show"></ctab3>
				<ctab4 v-show="sindex == 3 && tabs[3].show"></ctab4>
				<ctab5 v-show="sindex == 4 && tabs[4].show"></ctab5>
			</block>
			<view class="tabbar">
				<view class="tab-item"
					  v-for="(item,index) in tabs"
					  :key="item.text"
					  v-show="item.show"
					  @click="handleTabClick(index)">
					<view class="c-tab-item">
						<text :class="'tab-iconfont iconfont '+(item.iconfont)"
							  :
							  v-if="item.iconfont"/>
						<image :src="sindex == index ? item.iconSelect : item.icon"
							   class="tab-icon"
							   v-else/>
						<text class="tab-text"
							  :>{{item.text}}</text>
						<view class="corner"
							  v-show="item.mark > 0">{{item.mark > 99 ? '99+' : item.mark}}</view>
					</view>
				</view>
			</view>
		</block>
	</view>
</template>

<script>
	//讀取配置
	import ctabbar from './ctab-config.js'
	export default {
		name: "ctab",
		data() {
			return {
				tabs: [],
				color: '',
				scolor: '',
				midBtn: {},
				sindex: 0,
				floor: -1,//midButton開啟時使用
			}
		},
		mounted() {
			let tabbar = ctabbar.tabbar
			this.color = tabbar.color
			this.scolor = tabbar.selectcolor
			if(tabbar.midButton && tabbar.midButton.show && tabbar.tabs.length < 2){
				throw new Error('midButton模式開啟,配置tab選項不能少于2個')
			}
			if(tabbar.midButton && tabbar.midButton.show){
				let mlength = tabbar.tabs.length < 4 ? 3 : 5
				this.floor = Math.floor(mlength/2)
			}
			//普通模式,設置選中的tab項
			let tablen = tabbar.tabs.length
			if(!tabbar.midButton.show){
				if(!tabbar.tabs[0].show){
					this.sindex ++
					if(tablen >= 2 && !tabbar.tabs[1].show){
						this.sindex ++
						if(tablen >= 3 && !tabbar.tabs[2].show){
							this.sindex ++
							if(tablen >= 4 && !tabbar.tabs[3].show){
								this.sindex ++
								if(tablen >= 5 && !tabbar.tabs[4].show){
									throw new Error('tab不能全部隱藏')
								}
							}
						}
					}
				}
			}
			if(tabbar.tabs.length <= 5){
				this.tabs = tabbar.tabs
			}else {
				this.tabs = tabbar.tabs.slice(0,5)
			}
			this.midBtn = tabbar.midButton
		},
		methods: {
			setTheme(color){
				this.scolor = color
				this.midBtn.background = color
			},
			//設置tab隱藏和顯示,midButton模式失效
			setTabVisible(index,visible){
				if(this.tabs[index]){
					this.tabs[index].show = visible
				}
			},
			//設置角標
			setCorner(index,num){
				if(this.tabs[index]){
					this.tabs[index].mark = num
				}
			},
			handleTabClick(tab){
				if(this.midBtn && this.midBtn.show){
					if(tab == this.floor){
						return
					}
				}
				this.sindex = tab
				let rindex = tab
				if(this.midBtn && this.midBtn.show){
					if(tab > this.floor){
						rindex --
					}
				}
				this.$emit('tabClick',rindex)
			},
			handleMidBtn(){
				this.$emit('midClick')
			}
		}
	}
</script>

<style>
	/*這里引入字體圖標,如果使用字體圖標的話*/
	@import '@/common/font/iconfont.css';
	.tabbar {
		position: fixed;
		z-index: 99;
		width: 100%;
		height: 100rpx;
		background-color: #ffffff;
		bottom: 0;
		left: 0;
		box-shadow: 0rpx 4rpx 8rpx 0rpx rgba(0,0,0,0.5);
		border-radius: 0px 0px 0px 0px;
		opacity: 1;
		display: flex;
		flex-direction: row;
		align-items: center;
		justify-content: center;
		padding-bottom: constant(safe-area-inset-bottom);
		padding-bottom: env(safe-area-inset-bottom);
		box-sizing: content-box;
	}
	.tab-item {
		flex: 1;
		height: 100rpx;
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
	.c-tab-item {
		height: 120rpx;
		display: flex;
		flex-direction: column;
		width: 120rpx;
		align-items: center;
		justify-content: center;
		position: relative;
	}
	.tab-icon {
		width: 45rpx;
		height: 45rpx;
	}
	.tab-iconfont {
		font-size: 45rpx;
		font-weight: bold;
	}
	.tab-text {
		font-size: 26rpx;
		color: #333333;
		margin-top: 5rpx;
	}
	.mid-btn {
		position: absolute;
		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;
		background-color: red;
		border-radius: 50%;
	}
	.mid-text {
		font-size: 25rpx;
		color: #999999;
	}
	.corner {
		text-align: center;
		width: 45rpx;
		height: 45rpx;
		position: absolute;
		background-color: red;
		border-radius: 50%;
		color: white;
		font-size: 20rpx;
		font-weight: bold;
		top: 5rpx;
		right: 0;
		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;
	}
</style>

4、配置文件如下:

var tabbar = {
	/*開啟midButton模式時取前兩個或者前四個顯示,其他忽略*/
	midButton: {
		show: true,//是否是中間凸起模式
		width: '153rpx',//不填默認150rpx 中間按鈕大小
		iconwidth: '67rpx',//不填默認150rpx 中間圖標大小
		iconheight: '60rpx',
		offset: '40rpx',//不填默認50rpx
		background: '#F7D456',//中間按鈕背景顏色
		text: '拍一拍',
		textoffset: '50rpx',//不填默認50rpx
		showtext: false,
		icon: '../../static/tabbar/camera.png'
	},
	color: '#333333',//未選中顏色
	selectcolor: '#F7D456',//選中顏色
	/*tabs最多5個,超過5個超過的部分會被忽略,show屬性用來控制tab顯示隱藏,midButton開啟時失效,iconfont優先,沒有就使用icon*/
	tabs: [{
		icon: '../../static/tabbar/main_tab_home_normal.png',
		iconSelect: '../../static/tabbar/main_tab_home_select.png',
		text: '首頁',
		iconfont: '',
		show: true,
		mark: 0//角標數量,小于等于0不顯示
	}, {
		icon: '../../static/tabbar/main_tab_task_normal.png',
		iconSelect: '../../static/tabbar/main_tab_task_select.png',
		text: '任務',
		iconfont: '',
		show: true,
		mark: 100
	}, {
		icon: '../../static/tabbar/main_tab_my_normal.png',
		iconSelect: '../../static/tabbar/main_tab_my_select.png',
		text: '我的',
		iconfont: 'icon-wode',//注意配置字體圖標會優先使用字體圖標,這里是示例
		show: true,
		mark: 9
	}]
}

module.exports = {
	tabbar
}

5、使用示例:

<template>
	<ctab @midClick='midClick'
		  @tabClick='tabClick'
		  ref="ctab"/>
</template>

<script>
	export default {
		data() {
			return {
				
			}
		},
		onLoad() {
			
		},
		methods: {
			//凸起按鈕點擊事件
			midClick(){
				console.log('midClick')
			},
			//tab切換點擊事件
			tabClick(tab){
				console.log('tabClick',tab)
			}
		}
	}
</script>

<style>
	page {
		width: 100%;
		height: 100%;
	}
	
</style>

6、到這里我們自定義tabbar就完成了,通過修改配置文件中的midButton中的show屬性來開啟是否中間按鈕凸起,接下來我們看下效果。
midButton開啟:

uniapp怎么自定義tabbar

普通模式:

uniapp怎么自定義tabbar

再普通模式下,我們可以通過配置或者動態修改tabs中tab obj中的show屬性來動態形式和隱藏某個tab,我們這里配置第一個tab為隱藏:

...
tabs: [{
		icon: '../../static/tabbar/main_tab_home_normal.png',
		iconSelect: '../../static/tabbar/main_tab_home_select.png',
		text: '首頁',
		iconfont: '',
		show: false,//隱藏第一個tab
		mark: 0//角標數量,小于等于0不顯示
	}, {
		icon: '../../static/tabbar/main_tab_task_normal.png',
		iconSelect: '../../static/tabbar/main_tab_task_select.png',
		text: '任務',
		iconfont: '',
		show: true,
		mark: 100
	}, {
		icon: '../../static/tabbar/main_tab_my_normal.png',
		iconSelect: '../../static/tabbar/main_tab_my_select.png',
		text: '我的',
		iconfont: '',
		show: true,
		mark: 9
	}]
...

效果圖如下:

uniapp怎么自定義tabbar

7、到這里我們的自定義tabbar就完成了,剩下的就是在tab組件中實現我們各個頁面的邏輯。我們通過配置文件可以輕松的使用一個套代碼實現tabbar中間按鈕凸起、數字角標、動態隱藏、自定義mask覆蓋tabbar(需要自己控制好層級),字體圖標等功能,并且全端適用。

感謝各位的閱讀,以上就是“uniapp怎么自定義tabbar”的內容了,經過本文的學習后,相信大家對uniapp怎么自定義tabbar這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

军事| 奉节县| 中卫市| 苏州市| 德格县| 邛崃市| 五指山市| 邢台市| 武强县| 逊克县| 玛多县| 凤庆县| 太和县| 大厂| 杭州市| 阿拉尔市| 化州市| 永济市| 湖北省| 三河市| 浏阳市| 洛隆县| 喀喇| 宕昌县| 桦川县| 开封县| 慈利县| 奉节县| 赤壁市| 常宁市| 清流县| 保德县| 乳源| 惠州市| 东阳市| 正蓝旗| 资讯| 湘潭市| 平罗县| 仙游县| 漾濞|