一个小demo -- tabbar

在淘宝这样的移动端app,我们在其主页一般都会看到类似的底部导航
在这里插入图片描述
这个就是tabbar

我以后准备写的第一个项目也要用到它,所以准备现在就来封装这样一个tabbar


效果图

在这里插入图片描述
算是为以后的项目搭了个简单的框架,点击tabbar中的每一项,可跳转到具体的页面。

大致思路

  1. 既然是做tabbar,那肯定要有TabBar这样一个组件,TabBar里面的每一项肯定又是个组件TabBarItem
  2. TabBar肯定不是写死的,它里面有几个TabBarItem是由用这个组件的人决定的,所以TabBar模板里面肯定要写个插槽
  3. 我们发现TabBarItem里面有两个部分,一个是图片和图片下的字。这两个东西肯定不是写死的,所以肯定要使用两个具名插槽。而且图片的样式随着点击会改变,所以应该是两个图片,使用v-if,v-else切换,字体样式呢就用绑定的class属性切换。总的来说,TabBarItem要使用三个具名插槽。
  4. 我们还要实现点击每个item会跳转到其对应的页面,那肯定要用路由了。将路由中路径和组件的映射写好,实现路由跳转不想用网页返回的话可以用this.$router.replace(),而且replace中要写的路径肯定也不是写死的,是要通过props传入的。
  5. 页面跳转写好了,别忘了,还有点击的item的图片改变和字的样式的改变。以前我们是会直接操作dom,现在可以用路由了。处于活跃状态的路由肯定样式和其他不活跃的是不一样的,所以可以将 this.$route.path 和 通过props拿到的 this.path 作比较,就可实现活跃的路由样式改变了
computed: {
  isActive() {
    return this.$route.path !== this.path
  }
}
  1. 还有一个问题,还记得我们的item中文字的样式是写死的吗?当开发人员更换图片时,文字的颜色当然就不能写死了。所以要从组件外接收一个activeColor,绑定文字的style属性
<div :style="activeStyle"><slot name="item-text"></slot></div>

用一个计算属性activeStyle来控制颜色

activeStyle() {
  return this.isActive ? {} : {color: this.activeColor}
}
  1. 我们这个组件要实现的功能已经实现完了,但是当别人用这个组件的时候,为组件自定义内容的时候写的东西全写到App.vue中了。但我们的App.vue以后还要写其他东西的,除了tabbar的东西当然还要写页面的东西啊等等,所以我们要把和tabbar相关的东西都抽到MainTabBar这个组件中,App.vue引用这个组件即可。(不过别忘了修改MainTabBar中几个图片的路径、引用TabBar的路径和引用TabBarItem的路径)

需要注意的点

  • 用v-if和v-else时,v-if一定在前面
<!-- v-if一定要放在v-else前面 -->
<div v-if="isActive"><slot name="item-img"></slot></div>
<div v-else><slot name="item-img-active"></slot></div>
  • 懒加载的箭头函数不能加大括号
// 懒加载
const Home = () => import('../views/home/Home')
const Category = () => import('../views/category/Category')
const Shopcart = () => import('../views/shopcart/Shopcart')
const Profile = () => import('../views/profile/Profile')
  • 一定要有组件化思想,是这个组件的东西就全写在这个组件里面。不是这个组件的东西,不管是它的父级、还是它的子级,都放在它们自己的组件里面。
所以目前这个组件可以说封装好了,使用者可根据自己的需要在MainTabBar中写入自己想自定义的东西(不活跃图片、活跃图片、文字、文字颜色)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值