TabBar中显示的内容由外界决定,可以传入图片文字等。
我们想制作这个东西,首先我们新建了一个tabbar的脚手架项目。
然后我们删除掉helloworld相关的内容,之后我们先写个大概试试:
asserts下面设置两个文件夹,用来装css样式和img图片。
body{ padding: 0; margin: 0; }
随便写个样式然后如何使用这个样式呢?当然是在App.vue的style标签中。
@import "./assets/css/base.css";
先把目标图片中的四个类别用div造出来:
<template> <div id="app"> <div id="tab-bar"> <div class="tab-bar-item">首页</div> <div class="tab-bar-item">分类</div> <div class="tab-bar-item">购物车</div> <div class="tab-bar-item">我的</div> </div> </div> </template>
然后我们加上一些样式让它看起来像个人做的。
.tab-bar-item{ flex:1; //等间隔 text-align:center; //四个模块内容居中 height:49px; //手机端适配高度默认49 }
然后制作一下分割的线和tabbar背景色:
#tab-bar{ display: flex; //内容横着铺 background-color:#f6f6f6; #背景颜色 position:fixed; #位置 left:0; right:0; bottom:0; box-shadow: 0px -3px 1px rgba(100,100,100,.3); #分割线颜色 }
效果:
感觉还可以哈。但是这样写代码以后肯定会很复杂很乱,我们需要封装然后放在各种文件夹里管理。
我们在components中设置一个tabbar文件夹,里面加入一个TabBar.vue文件,然后我们加入以下代码:
<template> <div id="tab-bar"> <div class="tab-bar-item"> <img src="../../assets/img/tabbar/detec.png" > <div>警察信息</div> </div> <div class="tab-bar-item"> <img src="~@/assets/img/tabbar/gun.svg" > <div>武器分类</div> </div> <div class="tab-bar-item"> <img src="~@/assets/img/tabbar/letter.svg" > <div>绑架信箱</div> </div> <div class="tab-bar-item"> <img src="~@/assets/img/tabbar/money.svg" > <div>抢钱总计</div> </div> </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: 0px -3px 1px rgba(100,100,100,.3); } .tab-bar-item{ flex:1; text-align:center; height:49px; } .tab-bar-item img{ width:24px; height:24px; } </style>
说白了就是把代码转移到这里来了,把这个TabBar当作一个组件。然后我们注册这个组件:
下面是App.vue的部分内容
<template> <div id="app"> <tab-bar></tab-bar> </div> </template> <script> import TabBar from ‘./components/tabbar/TabBar‘ export default { name: ‘App‘, components: { TabBar } } </script>
这里我们加入一个tab-bar到template中,这个组件我们import后在components中注册。
这样我们实现了效果:
但是这样写代码可拓展性还是不好,我们应该用插槽的方法来对代码进行重构。也就是把TabBarItem单独提取出来,新建这个TabBarItem.vue文件:
<template> <div class="tab-bar-item"> <slot name="item-icon"></slot> <slot name="item-text"></slot> </div> </template> <script> export default { name: ‘TabBarItem‘, } </script> <style> .tab-bar-item{ flex:1; text-align:center; height:49px; margin-top:3px; vertical-align: middle; } .tab-bar-item img{ width:24px; height:24px; } </style>
下面都是样式,上面我们可以看到这个tabbaritem实际上由一个icon插槽和一个text插槽构成。那么tabbar呢?
<template> <div id="tab-bar"> <slot></slot> </div> </template>
样式代码省略了,tabbar则由一个插槽构成,当然这个插槽实际就是值tabbaritem了。
那么界面呢?
<template> <div id="app"> <tab-bar> <tab-bar-item> <img slot="item-icon" src="./assets/img/tabbar/cop.svg" > <div slot="item-text">警察信息</div> </tab-bar-item> <tab-bar-item> <img slot="item-icon" src="./assets/img/tabbar/gun.svg" > <div slot="item-text">武器分类</div> </tab-bar-item> <tab-bar-item> <img slot="item-icon" src="./assets/img/tabbar/letter.svg" > <div slot="item-text">绑架信箱</div> </tab-bar-item> <tab-bar-item> <img slot="item-icon" src="./assets/img/tabbar/money.svg" > <div slot="item-text">抢钱总计</div> </tab-bar-item> </tab-bar> </div> </template>
当然是嵌套着把插槽都实现了,这样新添加也非常的方便,别忘记要在components也注册一下tabbarItem才可以。
import TabBar from ‘./components/tabbar/TabBar‘ import TabBarItem from ‘./components/tabbar/TabBarItem‘ export default { name: ‘App‘, components: { TabBar, TabBarItem } }
这样就可以了。
原文:https://www.cnblogs.com/snailbuster/p/12797888.html