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 相关文章推荐
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
jquery 无限级联菜单案例分享
Mar 26 Javascript
jQuery层次选择器选择元素使用介绍
Apr 18 Javascript
iframe里的页面禁止右键事件的方法
Jun 10 Javascript
js clearInterval()方法的定义和用法
Nov 11 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
微信小程序 Template详解及简单实例
Jan 05 Javascript
requirejs + vue 项目搭建详解
Jun 16 Javascript
vue.js动画中的js钩子函数的实现
Jul 06 Javascript
简单了解node npm cnpm的具体使用方法
Feb 27 Javascript
微信小程序点击保存图片到本机功能
Dec 13 Javascript
javascript前端和后台进行数据交互方法示例
Aug 07 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处理整数函数的详解
2013/06/09 PHP
php cli配置文件问题分析
2015/10/15 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
学习ExtJS accordion布局
2009/10/08 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
js微信分享API
2020/10/11 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
python实现用户登录系统
2016/05/21 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
文秘自荐信
2014/06/28 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
国防教育标语
2014/10/08 职场文书
检察院起诉书
2015/05/20 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Nginx配置根据url参数重定向
2022/04/11 Servers