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实现win8一样酷炫的动态磁贴效果(示例代码)
Jul 13 Javascript
javascript放大镜效果的简单实现
Dec 09 Javascript
JS根据年月获得当月天数的实现代码
Jul 03 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
Nov 17 Javascript
JS小数运算出现多为小数问题的解决方法
Jun 02 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
详解Angular CLI + Electron 开发环境搭建
Jul 20 Javascript
解决vue 更改计算属性后select选中值不更改的问题
Mar 02 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
Jul 29 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
vue中英文切换实例代码
Jan 21 Javascript
详解JavaScript 的执行机制
Sep 18 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/08/12 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
一个简单的python程序实例(通讯录)
2013/11/29 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
python读取ini配置文件过程示范
2019/12/23 Python
python selenium操作cookie的实现
2020/03/18 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
一道输出判断型Java面试题
2014/10/01 面试题
教师校本培训方案
2014/02/26 职场文书
工程安全员岗位职责
2014/03/09 职场文书
关爱老人标语
2014/06/21 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
ktv服务员岗位职责
2015/02/09 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
西柏坡观后感
2015/06/08 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
用JS创建一个录屏功能
2021/11/11 Javascript