Vue开发之底部导航栏⼀、导航切换
封装⼀个公⽤组件Tabbar,在需要导航页的页⾯引⼊组件即可。代码如下:
<template>
<div class="tabbar">
<!-- 占位容器 -->
<div class="placegolder-container"></div>
<!-- 底部导航栏 -->
<div class="bottom-tabs">
<div class="tabs-item" v-for="(item, index) in tabsList" :key="index" @click="tabsChange(index)" >
<img class="tab-icon" :src="tabIndex==index?item.src:item.src1">
<p class="tab-text" :class="tabIndex==index?'active':''">{{}}</p>
</div>
</div>
</div>
</template>
<script>
export default {
name: "tabbar",
components: {},
data() {
return {
tabIndex: 0,
tabsList: [
{
src: require("../../assets/icon/home.png"),
src1: require("../../assets/icon/home1.png"),
text: "⾸页",
path: "/"
},
{
src: require("../../assets/icon/brand.png"),
src1: require("../../assets/icon/brand1.png"),
text: "礼品",
path: "/Gift"
},
{
src: require("../../assets/icon/find.png"),
src1: require("../../assets/icon/find1.png"),
text: "发现",
path: "/Test"
},
{
src: require("../../assets/icon/my.png"),
src1: require("../../assets/icon/my1.png"),
text: "我的",
path: "/UploadFile"
}
js导航栏下拉菜单
]
};
},
created() {
this.tabIndex = Item("tabIndex");
console.log(this.tabIndex);
},
methods: {
tabsChange(index) {
this.tabIndex = index;
this.$router.push({
path: this.tabsList[index].path
});
localStorage.setItem("tabIndex", this.tabIndex);
}
},
watch: {
$route(newVal, oldVal) {
// console.log(newVal, oldVal);
if (a.index >= 0) {
this.tabIndex = a.index;
localStorage.setItem("tabIndex", this.tabIndex);
}
}
}
};
</script>
<style scoped lang="less">
.tabbar {
position: fixed;
bottom: 0;
left: 0;
}
.placegolder-container {
height: 70px;
}
.bottom-tabs {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 5;
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
box-shadow: 0px -1px 1px #e6e6e6;
background-color: #fff;
.tabs-item {
padding: 5px 0;
flex: 1;
height: 60px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
.tab-icon {
width: 30px;
height: 30px;
border-radius: 4px;
}
.tab-text {
font-size: 14px;
margin: 0;
&.active {
color: #624980;
}
}
}
}
</style>
注意:
页⾯设置占位容器是为了抵消底部导航栏固定定位的⾼度。
tabIndex 标记当前选中的路由。
tabsChange(index) 底部导航栏路由切换。
watch 监听路由变化,保持路由选中的驻留(选中/激活)样式。
⼆、缓存使⽤
为什么要使⽤缓存?缓存哪些内容?
答:使⽤缓存是为了保存选中路由的 tabIndex ,在刷新页⾯的时候,依然可以保持(选中/激活)状态。
三、路由配置与监听
(1)配置
在配置路由的时候,我们可以添加 meta对象,⾥⾯添加你需要的属性;⽤于路由切换时获取meta的值,如:dLogin 规定进⼊路由需不需登录
{
path: '/',
name: 'Home',
meta: { index: 0, title: '⾸页',needLogin: false },
component: Home
},
{
path: '/Gift',
name: 'Gift',
meta: { index: 1, title: '礼品' },
component: Gift
},
{
path: '/Test',
name: 'Test',
meta: { index: 2, title: '发现',needLogin: true },
component: Test,
children:[
{
path: '/title1',
name: 'Title1',
component: Title1
},
{
path: '/title2',
name: 'Title2',
component: Title2
},
{
path: '/title3',
name: 'Title3',
component: Title3
}
]
},
{
path: '/UploadFile',
name: 'UploadFile',
meta: { index: 3, title: '我的' },
component: UploadFile
},
(2)监听
使⽤监听的⽬的是为了在使⽤浏览器前进后退的时候,保持路由选中的驻留(选中/激活)样式。
watch: {
$route(newVal, oldVal) {
// console.log(newVal, oldVal);
if (a.index >= 0) {
this.tabIndex = a.index;
localStorage.setItem("tabIndex", this.tabIndex);
}
}
}
四、动态修改页⾯标题以及增加路由拦截
(1)在修改页⾯标题 title 的时候,我们可以⽤配置路由的 title 属性来控制。路由拦截我们即可使⽤配置路由的 needLogin 属性控制。//main.js
import store from "./store/index";
// ⽤来做⼀些进⼊页⾯的配置与限制
router.beforeEach((to, from, next) => {
console.log({ to, from })
/*路由发⽣改变修改页⾯的title */
if (to.meta.title) {
document.title = to.meta.title
}else{
document.title = "⼩鱼蕾蕾"
}
/*判断路由是否需要权限才能进⼊,即路由拦截 */
a.needLogin){
if(store.state.person.userInfo.userId){ //从vuex⾥⾯获取userId
next()
}else{
next({path:'/login'})
}
}
next();
})
(2)在store下的modules⾥增加⼀个模块 person.js,然后使⽤vuex整⼀个userId
const state = {
userInfo: {
userId: 11,
},
};
// getters
const getters = {
userInfo: (state) => state.userInfo
};
// actions
const actions = {
UpdatePerson({ commit }, userInfo) {
commit("UpdatePerson", userInfo);
},
};
/
/ mutations
const mutations = {
UpdatePerson(state, userInfo) {
// 变更状态
state.userInfo=userInfo
},
};
export default {
state,
getters,
actions,
mutations
};
(3) 在store⽬录下新建⼀个 index.js 它通过modules 属性引⼊ person模块。import Vue from "vue";
import Vuex from "vuex";
import actions from "./actions";
import getters from "./getter";
import createPersistedState from "vuex-persistedstate";
import person from "./modules/person";
Vue.use(Vuex);
const state = {};
export default new Vuex.Store({
state,
mutations,
actions,
getters,
modules: {
person,
},
strict: debug,
plugins: [createPersistedState({ storage: window.sessionStorage })]
});
五、组件引⽤
在需要底部导航的页⾯⾥引⽤⼦组件,如下代码
import Tabbar from './common/Tabbar';//引⽤⼦组件
//注册组件
components: {
"Tabbar":Tabbar
},
//html结构底部增加
<!-- 底部菜单 -->
<Tabbar />
六、效果图

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。