一,不確定有幾個tabbar ,可能有三個,可能有四個,或者更多...
二,圖片,文字點擊高亮
三,跳轉頁面
四, 配置路由
雖然這個功能很多ui框架都有,但是封裝也是一個學習的過程。
界面效果
父組件
<template> <div id="app"> <router-view></router-view> <tab></tab> </div> </template> <script> import Tab from "./components/Tab"; export default { name: "App", components: { Tab, }, data() { return {}; }, methods: {}, }; </script> <style lang="less"> // #115FFB #909090 @import "./assets/css/common.css"; </style>
子組件我用了三層,一層嵌套一層,耐心看喲,最主要學習插槽,父子組件傳值
第一個子組件 (定義放置tabbar的大容器)
<template> <div class="tabbar"> <slot></slot> </div> </template> <script> export default { name: "TabBar", }; </script> <style lang="less"> .tabbar { position: fixed; bottom: 0; left: 0; right: 0; background-color: #fff; width: 100%; height: 45px; display: flex; flex-direction: row; justify-content: center; align-items: center; text-align: center; } </style>
第二個子組件(tabbar 中的圖片,文字的動態顯示)
<template> <!-- 這里就相當於 每一個 --> <div class="tabbar-item" @click="getPath"> <!-- 未選中圖片 --> <div class="tabbar_icon" v-show="!isShow"> <slot name="icon"> </slot> </div> <!-- 選中圖片 --> <div class="tabbar_icon_active" v-show="isShow"> <slot name="iconactive"></slot> </div> <!-- 文字 --> <div class="tabbar_title" :style="active"> <slot name="title"></slot> </div> </div> </template> <script> export default { name: "TabBarItem", // 父向子傳 props: { // 跳轉路徑 path: { type: String, }, // 高亮文字顏色 activecolor: { tyep: String, }, }, // 計算屬性 computed: { // 如果要檢索的字符串值沒有出現,則該方法返回 -1。 不等於-1表示出現 isShow() { return this.$route.path.indexOf(this.path) != -1; }, active() { return this.isShow ? { color: this.activecolor } : ""; }, }, methods: { getPath() { this.$router.push(this.path); // 跳轉頁面 //console.log(this.path); 父向子傳值 //console.log(this.$route.path); vue 獲取路徑 }, }, }; </script> <style lang="less"> .tabbar-item { flex: 1; height: 100%; } .tabbar_title { font-size: 14px; color: #909090; } </style>
第三個子組件(組合tabbar,可以任意放置三個,四個,或更多)
<template> <div class="tab"> <tab-bar> <tab-bar-item path="/home" activecolor="#115FFB"> <img slot="icon" src="../assets/img/home.png" alt="" /> <img slot="iconactive" src="../assets/img/home_active.png" alt="" /> <span slot="title"> 首頁 </span> </tab-bar-item> <tab-bar-item path="/subject" activecolor="#115FFB"> <img slot="icon" src="../assets/img/subject.png" alt="" /> <img slot="iconactive" src="../assets/img/subject_active.png" alt="" /> <span slot="title"> 視頻 </span> </tab-bar-item> <tab-bar-item path="/profile" activecolor="#115FFB"> <img slot="icon" src="../assets/img/profile.png" alt="" /> <img slot="iconactive" src="../assets/img/profile_active.png" alt="" /> <span slot="title"> 我 </span> </tab-bar-item> </tab-bar> </div> </template> <script> import TabBar from "../components/TabBar"; import TabBarItem from "../components/TabBarItem"; export default { name: "Tab", components: { TabBar, TabBarItem, }, data() { return {}; }, created() {}, methods: {}, }; </script> <style lang="less"></style>
配置router
const routes = [ { path: "/home", name: "home", component: home, }, { path: "/subject", name: "subject", component: () => import("../views/subject.vue"), }, { path: "/profile", name: "profile", component: () => import("../views/profile.vue"), }, ];