将来のプロジェクトで簡単に使用できるように、下部のナビゲーションバー用に別のコンポーネントを作成します
作成とパッケージングの2つのステップに分かれています
要件:独立、アイコンの変更、名前の変更、フレックスレイアウト
①分析:最初はTabBarです
TabBarは、ナビゲーションバー全体をラップするナビゲーションバーのメインフレームです。
タブバーを作成-> Tabbar.vue
<template>
<div id="tab-bar">
// 这里啥都没有
</div>
</template>
<script>
export default {
name: "Tabbar"
}
</script>
<style scoped>
#tab-bar {
display: flex; /
background-color: #f6f6f6;
position: fixed;
left: 0;
right: 0;
bottom: 0;
box-shadow: 0 -3px 10px rgba(100, 100, 100, .2);
}
</style>
メインナビゲーションバー領域MainTabBar.vueを作成します。これは、実際にはナビゲーションバー領域Tabbar.vueを独立したコンポーネントに作成します。ナビゲーションバー領域でのTabBarItemの後続の実装により、すべてが抽出されたため、MainTabBarに表示されます。分離と独立。
MainTabBar.vue
<template>
<tab-bar></tab-bar>
</template>
<script>
import TabBar from "./tabbar/Tabbar";
export default {
name: "MainTabBar",
components:{
TabBar
}
}
</script>
<style scoped>
</style>
次に、App.vueでMainTabBarコンポーネントを参照します
<template>
<div id="app">
<main-tab-bar></main-tab-bar>
</div>
</template>
<script>
import MainTabBar from '../components/MainTabBar.vue'
export default {
name:'App',
components: {
MainTabBar
}
}
</script>
これまで、下部のナビゲーションバー領域が作成されましたが、内部にコンテンツがないため、Tabbar.vueの高さは0であり、効果は見られません。Tabbar.vueのスタイルに少し高さを追加するだけです。 。ナビゲーションバー領域がどのように表示されるかはわかっています。このハードコードされた高さは後で削除され、ナビゲーションバーはTabBarItemのコンテンツによってサポートされます。
height: 50px;
②次に、各オプションであるTabBarItemを作成します
これらのオプションはTabbar.vueに挿入されるため、Tabbar.vueは、各アイテムを追加できるようにスロットを設定する必要があります。
<slot></slot>
tabbar-> TabbarItem.vue
Display:flexはナビゲーションバーに設定されています;ここではアイテムはflex:1に設定されています;アイテムの高さは通常のナビゲーションバーの高さである49pxに与えられます。高さがある場合はナビゲーションバーを開くことができ、アイテムのアイコンのスタイルを設定する必要があります。
<template>
<div class="tab-bar-item" @click="itemClick">
</div>
</template>
<script>
export default {
name: "TabbarItem",
data(){
return{
},
methods:{
itemClick(){
}
}
}
</script>
<style scoped>
.tab-bar-item {
flex: 1;
text-align: center;
height: 49px;
font-size: 14px;
}
.tab-bar-item img {
margin-top: 3px;
width: 24px;
height: 24px;
vertical-align: middle;
margin-bottom: 2px;
}
</style>
アイテムにアイコンとテキストを挿入するために使用されます
アイテムアイコンの設定
<div class="tab-bar-item" @click="itemClick">
<div v-if="!isActive" slot="item-icon">
<slot name="item-icon"></slot>
</div>
<div v-else slot="item-icon-active">
<slot name="item-icon-active"></slot>
</div>
</div>
アイテムのテキスト設定
<div slot="item-text" :style="activeStyle">
<slot name="item-text"></slot>
</div>
画像とテキストに名前付きスロットを使用する理由は、TabBarItemも分離された別個のコンポーネントであるためです。最終的に、TabBar.vueとTabBarItem.vueが参照され、MainTabBarに表示されます。
<template>
<tab-bar>
<tab-bar-item path="/home" activeColor="blue">
<img slot="item-icon" src="@assets/img/tabbar/home.svg" alt="">
<img slot="item-icon-active" src="@assets/img/tabbar/home_active.svg" alt="">
<div slot="item-text">首页</div>
</tab-bar-item>
<tab-bar-item path="/category" activeColor="green">
<img slot="item-icon" src="@assets/img/tabbar/category.svg" alt="">
<img slot="item-icon-active" src="@assets/img/tabbar/category_active.svg" alt="">
<div slot="item-text">分类</div>
</tab-bar-item>
</tab-bar>
</template>
<script>
import TabBar from "./tabbar/Tabbar";
import TabBarItem from "./tabbar/TabbarItem";
export default {
name: "MainTabBar",
components:{
TabBar,
TabBarItem
}
}
</script>
<style scoped>
</style>
階層関係は次のとおりです。
img、text->tab-bar-item≈tab-bar-> main-tab-bar->アプリ
これらの2つのコンポーネントは、MainTabBar.vueで参照および使用され、パラメーターはサブレイヤーに渡されるため、propsを使用してサブレイヤーで受け取ります。
これはTabBarItemの論理処理です
<script>
export default {
name: "TabbarItem",
props:{
path: String,
activeColor:{
type:String,
default : 'red'
}
},
data(){
return{
}
},
computed : {
isActive() {
return this.$route.path.indexOf(this.path) !== -1
},
activeStyle() {
return this.isActive ? {
color : this.activeColor} : {
}
}
},
methods:{
itemClick(){
this.$router.replace(this.path)
}
}
}
</script>
コンポーネントの最終的な実現には、ナビゲーションバーに対応する各アイコンと対応する表示ページが必要です。
アイコンのパスはMainTabBar.vueで自分で変更します。対応する表示ページが必要な場合は、vue-routerをインストールして構成する必要があります。
これは、遅延読み込みと、対応する2つのページ「ホーム」と「カテゴリ」の単純な構成の組み合わせです。
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const Home = () => import('../views/home/Home');
const Category = () => import("../views/category/Category");
const routes = [
{
path: '',
redirect : '/home'
},
{
path: '/home',
component : Home
},
{
path: '/category',
component : Category
}
]
const router = new VueRouter({
mode : 'history',
routes
})
export default router
ついに実現