vue.js移动端tab组件的封装实践实例

发布时间 - 2026-01-11 02:07:33    点击率:

这是vue.js系列文章第二遍,第一篇讲述的是如何搭建vue.js的开发环境,计划按进度做成一款完整的app,当然前提是时间允许的话。本文用到了stylus语法,至于为什么使用stylus而不去用sass,主要是因为stylus来自于Node.js社区。总之stylus是一款高效的CSS预处理器,具体使用不在本文讨论范围。好了,废话不说了,下面讲述怎么封装tababr的切换。

底部tab进行页面切换,会用到vue里面的路由,也就是vue-router

我们在安装vue-cli时选中默认安装vue-router即可。

安装完毕后,打开我的项目,我们需要在router目录的index.vue中配置路由信息,具体配置信息如下

从上面图片,我们可以看到,我们一共配置了4子页面,其中redirect为配置默认组件的路由。

路由配置完成后,我们需要封装tab组件了

因为tab组件属于基础组件,所以我们新建了文件夹tab,然后在tab文件夹下面新建了tabbar组件和tababritem组件。我们先说tababritem组件的封装

tabbaritem封装

我们知道tababritem有一张正常显示图片,选中后的图片,和图片下的文字,其中属性id用来记录当前tabbaritem的组件名,属性isRouter用来记录当前选中是否是这个tababritem。

<template>
 <a class="m-tabbar-item" :class="{'is-active':isActive}" @click="goToRouter">
  <div class="m-tabbar-item-icon" v-show="!isActive"><slot name="icon-normal"></slot></div>
  <div class="m-tabbar-item-icon" v-show="isActive"><slot name="icon-active"></slot></div>
  <div class="m-tabbar-item-text"><slot></slot></div>
 </a>
</template>

<script type="text/ecmascript-6">

 export default{
  props: {
   id: {
    type: String
   },
   isRouter: {
    type: Boolean,
    default: false
   }
  },
  computed: {
   isActive () {
    return this.isRouter
   }
  },
  methods: {
   goToRouter () {
    this.$parent.$emit('tabbarActionEvent', this.id)
    // 判断是否为路由跳转
    this.$router.push(this.id)
   }
  }
 }
</script>

<style scoped lang="stylus" rel="stylesheet/stylus">

 .m-tabbar-item
  flex: 1
  text-align: center
  .m-tabbar-item-icon
   padding-top: 5px
   padding-bottom 1px
   img
    width: 24px
    height: 24px
  .m-tabbar-item-text
   font-size: 8px
   color:#949494
  &.is-active
   .m-tabbar-item-text
    color: #fa3e25

</style>

接下来,我们要封装tababr,tabbar里面需要包含tabbaritem,主要设置了下tabbar的样式,具体代码如下

tabbar的封装

<template>
 <div class="m-tabbar">
  <slot></slot>
 </div>
</template>

<script type="text/ecmascript-6">
 export default {}
</script>

<style scoped lang="stylus" rel="stylesheet/stylus">

 .m-tabbar
  display: flex
  flex-direction: row
  position: fixed
  bottom: 0
  left: 0
  right: 0
  width: 100%
  overflow: hidden
  height: 50px
  background: #fff
  border-top: 1px solid #e4e4e4

</style>

最后在我们的app.vue里面引用tabbar组件,监听子类tabbaritem的点击方法,来控制当前哪个item的选中颜色文字的改变

app.vue代码

<template>
 <div id="app">
  <router-view></router-view>
  <m-tabbar @tabbarActionEvent='changeSelectedValue'>
   <m-tabbar-item id='Home' :isRouter="isHome">
    ![](./assets/tabbar-home-normal@2x.png)
    ![](./assets/tabbar-home-selected@2x.png)
    首页
   </m-tabbar-item>
   <m-tabbar-item id='Position' :isRouter="isPosition">
    ![](./assets/tabbar-position-normal@2x.png)
    ![](./assets/tabbar-position-selected@2x.png)
    职位
   </m-tabbar-item>
   <m-tabbar-item id='Message' :isRouter="isMessage">
    ![](./assets/tabbar-message-normal@2x.png)
    ![](./assets/tabbar-message-selected@2x.png)
    消息
   </m-tabbar-item>
   <m-tabbar-item id='Me' :isRouter="isMe">
    ![](./assets/tabbar-me-normal@2x.png)
    ![](./assets/tabbar-me-selected@2x.png)
    我
   </m-tabbar-item>
  </m-tabbar>
 </div>
</template>

<script>
 import mTabbar from 'common/tab/tab.vue'
 import mTabbarItem from 'common/tab/tabbar-item'

 export default {
  name: 'app',
  components: {
   mTabbar,
   mTabbarItem
  },
  data () {
   return {
    isHome: true,
    isPosition: false,
    isMessage: false,
    isMe: false
   }
  },
  methods: {
   changeSelectedValue: function (elValue) {
    if (elValue === 'Home') {
     this.isHome = true
    } else {
     this.isHome = false
    }
    if (elValue === 'Position') {
     this.isPosition = true
    } else {
     this.isPosition = false
    }
    if (elValue === 'Message') {
     this.isMessage = true
    } else {
     this.isMessage = false
    }
    if (elValue === 'Me') {
     this.isMe = true
    } else {
     this.isMe = false
    }
   }
  }
 }
</script>

自此tababr已经封装完毕了,其中用到的tabbaritem图片,大家可以自己替换掉,下一篇,会提到导航部分的封装

最终运行效果如下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vue.js  # tab组件  # tab切换  # tab动态组件  # vue封装TabBar组件的完整步骤记录  # vue实现tab路由切换组件的方法实例  # vue组件tabbar使用方法详解  # Vue封装一个Tabbar组件 带组件路由跳转方式  # 的是  # 这是  # 是因为  # 好了  # 子类  # 不去  # 可以看到  # 来自于  # 跳转  # 下一篇  # 首页  # 先说  # 第一篇  # 大家多多  # 正常显示  # 判断是否  # 是一款  # 完成后  # 在我们的  # 完毕后 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  java ZXing生成二维码及条码实例分享  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  香港网站服务器数量如何影响SEO优化效果?  Firefox Developer Edition开发者版本入口  昵图网官方站入口 昵图网素材图库官网入口  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Python文件操作最佳实践_稳定性说明【指导】  想要更高端的建设网站,这些原则一定要坚持!  公司门户网站制作流程,华为官网怎么做?  网站建设整体流程解析,建站其实很容易!  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何在阿里云服务器自主搭建网站?  如何快速生成可下载的建站源码工具?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  如何在橙子建站上传落地页?操作指南详解  如何快速搭建高效香港服务器网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何快速搭建安全的FTP站点?  如何在阿里云部署织梦网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何在不使用负向后查找的情况下匹配特定条件前的换行符  iOS发送验证码倒计时应用  网站建设保证美观性,需要考虑的几点问题!  高性能网站服务器配置指南:安全稳定与高效建站核心方案  JS中对数组元素进行增删改移的方法总结  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  中山网站推广排名,中山信息港登录入口?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  高端网站建设与定制开发一站式解决方案 中企动力  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  焦点电影公司作品,电影焦点结局是什么?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  独立制作一个网站多少钱,建立网站需要花多少钱?  b2c电商网站制作流程,b2c水平综合的电商平台?  javascript中对象的定义、使用以及对象和原型链操作小结  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  MySQL查询结果复制到新表的方法(更新、插入)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  济南网站建设制作公司,室内设计网站一般都有哪些功能?