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


Posted in Javascript onJune 30, 2017

这是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中配置路由信息,具体配置信息如下

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

从上面图片,我们可以看到,我们一共配置了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组件的封装实践实例

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

Javascript 相关文章推荐
location.search在客户端获取Url参数的方法
Jun 08 Javascript
jQuery实现类似淘宝购物车全选状态示例
Jun 26 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
Google Dart编程语法和基本类型学习教程
Nov 27 Javascript
JQuery Mobile实现导航栏和页脚
Mar 09 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
深入理解 Koa 框架中间件原理
Oct 18 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
Apr 04 Javascript
解析vue、angular深度作用选择器
Sep 11 Javascript
JavaScript实现背景自动切换小案例
Sep 27 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
Vue3为什么这么快
Sep 23 Javascript
jQuery表单设置值的方法
Jun 30 #jQuery
JavaScript注册时密码强度校验代码
Jun 30 #Javascript
Bootstrap Table从零开始
Jun 30 #Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 #Javascript
常见的浏览器Hack技巧整理
Jun 29 #Javascript
详解webpack+gulp实现自动构建部署
Jun 29 #Javascript
bootstrapvalidator之API学习教程
Jun 29 #Javascript
You might like
php mysql索引问题
2008/06/07 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
php插入mysql数据返回id的方法
2018/05/31 PHP
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
python基础教程之匿名函数lambda
2017/01/17 Python
python实现感知器算法(批处理)
2019/01/18 Python
python如何调用字典的key
2020/05/25 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
前处理组长岗位职责
2014/03/01 职场文书
初一学生期末评语
2014/04/24 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
个人作风建设自查报告
2014/10/22 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技