在手機端項目開發時,不少場景下標籤欄TabBar和導航欄NavBar功能必不可少。因爲Nuxt項目中須要用到相似鹹魚底部凸起導航效果,只能本身動手造一個自定義導航組件。
如上圖:在項目中實例效果vue
ok,下面就詳細講解下實現方法。segmentfault
首先,須要在components目錄下新建 headerBar.vue 和 tabBar.vue 頁面。flex
緊接着,在 plugins 目錄下新建 componentsInstall.js 文件並引入便可。this
<template> <div class="header-bar" :class="{'fixed': fixed, 'transparent fixed': transparent}"> <div class="header-bar__wrap flexbox flex-alignc" :style="{'background': bgcolor, 'color': color, 'z-index': zIndex}"> <!-- >>返回 --> <div class="action hdbar-action__left isback" v-if="back && back!='false'" @click="$router.go(-1)"> <slot name="backIco" /><slot name="backText" /> </div> <!-- >>標題 --> <div class="hdbar-title" :class="{'center': center}"> <slot name="title" /> </div> <!-- >>搜索框 --> <div class="action hdbar-action__search"> <slot name="search" /> </div> <!-- >>右側 --> <div class="action hdbar-action__right"> <slot name="right" /> </div> </div> </div> </template> <script> /** * @Desc Vue自定義導航條headerBar * @Time andy by 2020-10-06 * @About Q:282310962 wx:xy190310 */ export default { props: { // 是否返回 back: { type: [Boolean, String], default: true }, // 標題 title: { type: String, default: '' }, // 標題顏色 color: { type: String, default: '#fff' }, // 背景顏色 bgcolor: { type: String, default: '#22d59c' }, // 標題是否居中 center: { type: [Boolean, String], default: false }, // 搜索框 search: { type: [Boolean, String], default: false }, // 是否固定 fixed: { type: [Boolean, String], default: false }, // 背景透明 transparent: { type: [Boolean, String], default: false }, // 設置層級 zIndex: { type: [Number, String], default: '2021' }, }, data() { return {} }, methods: {}, } </script>
<header-bar :back="true" :bgcolor="linear-gradient(to right, #f726ff, #2acfff)" color="#ff0" center transparent> <template #backIco><i class="iconfont icon-close"></i></template> <div slot="title"> <img src="~/assets/img/logo.png" height="14" /> <em>Nuxt</em> </div> <div slot="right" class="ml-20" @click="$toast('搜索~~')"><i class="iconfont icon-search"></i></div> <div slot="right" class="ml-20"><i class="iconfont icon-choose"></i></div> <div slot="right" class="ml-20"><van-button type="primary" size="mini" @click="saveData">保存</van-button></div> </header-bar>
<header-bar :back="true" bgcolor="linear-gradient(to right, #6126ff, #ff21ee)" color="#ff0" center> <div slot="backIco"><i class="iconfont icon-close"></i></div> <div slot="search" class="flex-c flex1"> <input class="ipt flex1" placeholder="搜索關鍵字..." /> </div> <div slot="right" class="ml-30"> <i class="iconfont icon-shoucang"></i></div> <div slot="right" class="ml-30"> <i class="iconfont icon-female"></i></div> </header-bar>
<template> <div class="tab-bar" :class="{'fixed': fixed}"> <div class="tab-bar__wrap flexbox flex-alignc" :style="{'background': bgcolor}"> <div v-for="(item,index) in tabs" :key="index" class="navigator" :class="currentTabIndex == index ? 'on' : ''" @click="switchTabs(index, item)"> <div class="ico" :class="{'dock': item.dock}"> <i v-if="item.dock" class="dock-bg" :style="{'background': item.dockBg ? item.dockBg : activeColor}"></i> <i v-if="item.icon" class="iconfont" :class="item.icon" :style="{'color': (currentTabIndex == index && !item.dock ? activeColor : color), 'font-size': item.iconSize}"></i> <img v-if="item.iconImg" class="iconimg" :src="currentTabIndex == index && !item.dock ? item.selectedIconImg : item.iconImg" :style="{'font-size': item.iconSize}" /> <em v-if="item.badge" class="nuxt__badge">{{item.badge}}</em> <em v-if="item.dot" class="nuxt__badge-dot"></em> </div> <div class="txt" :style="{'color': (currentTabIndex == index ? activeColor : color)}">{{item.text}}</div> </div> </div> </div> </template>
<script> export default { props: { current: { type: [Number, String], default: 0 }, // 背景顏色 bgcolor: { type: String, default: '#fff' }, // 顏色 color: { type: String, default: '#999' }, // 點擊後顏色 activeColor: { type: String, default: '#22d59c' }, // 是否固定 fixed: { type: [Boolean, String], default: false }, // tab選項 tabs: { type: Array, default: () => null } }, data() { return { currentTabIndex: this.current } }, created() { const _pagePath = this.$route.path this.tabs.map((val, index) => { if(val.pagePath == _pagePath) { this.currentTabIndex = index } }) }, methods: { switchTabs(index, item) { this.currentTabIndex = index this.$emit('click', index) if(item.pagePath) { this.$router.push(item.pagePath) } } }, } </script>
<tab-bar bgcolor="#b6ffff" @click="handleTabbar" :tabs="[ { icon: 'icon-tianjia', text: 'Home', }, { icon: 'icon-shezhi', text: 'Manage', badge: 1 }, { icon: 'icon-male', text: 'Ucenter', dot: true }, ]" />
// tabbar點擊事件 handleTabbar(index) { this.$toast('tabbar索引值:' + index); },
另外還支持鹹魚凸起效果,只需配置 dock: true
屬性便可。根據項目須要支持自定義多個tab選項。flexbox
<tab-bar bgcolor="#7fa1ff" color="#fff" activeColor="#fb4e30" :tabs="[ { icon: 'icon-face', text: 'Face', dot: true, iconSize: '24px', }, { //icon: 'icon-tianjia', iconImg: 'https://gw.alicdn.com/tfs/TB1CoEwVrvpK1RjSZFqXXcXUVXa-185-144.png?getAvatar=1', text: '鹹魚', dock: true, dockBg: '#fb4e30', iconSize: '.64rem', }, { icon: 'icon-search', text: '搜索', }, ]" />
okey,基於Nuxt自定義仿鹹魚導航組件就分享到這裏。但願對你們有所幫助!!✍✍spa
最後附上一個基於Nuxt/Vue自定義彈框組件
http://www.javashuo.com/article/p-prpdhkbe-nu.htmlnuxt