iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >超详细教程实现Vue底部导航栏TabBar
  • 814
分享到

超详细教程实现Vue底部导航栏TabBar

2024-04-02 19:04:59 814人浏览 安东尼
摘要

目录项目介绍:项目目录:TabBar效果预览:TabBar实现思路一、如果在下方有一个单独的TabBar组件,如何封装二、TabBar中现实的内容由外界决定。三、自定义TabBarI

项目介绍:

需求:要求tabbar中的文字可动态更改,文字对应的图片动态更改动态增加,文字颜色对应更改,TabBarItem的图片动态更改和增加,整个项目灵活化,利用插槽,路由,父子组件的值传递,利用$router实现点击item就会显示对应的页面。综合性极强,项目开发中遇到类似项目,只需复制其中主要代码即可搭建项目的大体框架

项目目录:

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

TabBar效果预览:

vueTabBar组件封装

TabBar实现思路

一、如果在下方有一个单独的TabBar组件,如何封装

  1. 自定义tabbar组件,在APP中使用。
  2. 让TabBar处于底部,并且设置相关的样式。

二、TabBar中现实的内容由外界决定。

  1. 定义插槽。
  2. flex布局评分TabBar。

三、自定义TabBarItem,可以传入图片和文字

  1. 自定义tabbarItem,并且定义两个插槽:图片,文字。
  2. 给两个插槽外层包装div,用于设置样式。
  3. 填充插槽,实现底部TabBar的效果。

方法可行,动手实现,首先介绍一下目录

项目文件目录建立

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

文件目录介绍

我建立一个views文件夹,里面建立五个文件,五个文件里面包含了五个vue文件,分别对应着导航栏下的每个按钮。

Vue实现TabBar底部导航栏组件

在assets下建立css和img文件夹,放置tabbar按钮所需的图片和基础类

Vue实现TabBar底部导航栏组件

在component文件夹中建立一个MainTabBar.vue文件和tabbar文件夹,tabbar文件夹里放置MainTabBar的子组件和各种插槽关联文件。

Vue实现TabBar底部导航栏组件

router文件夹下的index文件配置路由文件

Vue实现TabBar底部导航栏组件

main.js是项目的入口文件,项目中所有的页面都会加载main.js,所以main.js,主要有三个作用:

  • 实例化VUE
  • 放置项目中经常会用到的插件和CSS样式,例如网络请求axiOS和vue-resource,图片懒加载模块:vue-;azyload
  • 存储全局变量例如基本信息等

各个文件夹中的代码实现

第一步、文件很多,引用会常常带来404错误,这里开始先建立文件别名,vue建立文件别名详解

找到resolve对象,在alias中写入各个文件的别名:

Vue实现TabBar底部导航栏组件

文件起别名代码

代码:


resolve: {
    extensions: ['.js', '.vue', '.JSON'],
    alias: {
      '@': resolve('src'),
      'assets': resolve('src/assets'),      
      'components': resolve('src/components'),
      'views': resolve('src/views'),
    }
  },

App.vue代码

App.vue中引用MainTabBar组件和各个tabbaritem对应的文件:


<template>
  <div id="app">
    <router-view></router-view>
    <main-tab-bar></main-tab-bar>
  </div>
</template>
<script type="module">
import MainTabBar from 'components/MainTabBar'
export default {
  name: 'App',
  components:{
    MainTabBar
  }
}
</script>
 
<style>
  @import "assets/css/base";
</style>

MainTabBar.vue代码

MainTabBar组件代码:要求组件满足可修改TabBarItem的个数,颜色,文字,等都是动态的。需要创建各类插槽。


<template>
   <div>
       <tab-bar>
      <tab-bar-item path="/home" activeColor="purple">
        <img slot="item-icon" src="~assets/img/tabbar/shouye.png" alt="" >
        <img slot="item-icon-active" src="~assets/img/tabbar/shouye.active.png" alt="">
        <div slot="item-text">首页</div>
      </tab-bar-item>
      <tab-bar-item path="/category" activeColor="purple">
         <img slot="item-icon" src="~assets/img/tabbar/fenlei.png" alt="">
      <img slot="item-icon-active" src="~assets/img/tabbar/fenlei.active.png" alt="">
         <div slot="item-text">分类</div>
      </tab-bar-item>
      <tab-bar-item path="/cart" activeColor="purple">
         <img slot="item-icon" src="~assets/img/tabbar/gouwuche.png" alt="">
         <img slot="item-icon-active" src="~assets/img/tabbar/gouwuche.active.png" alt="">
        <div slot="item-text">购物车</div>
      </tab-bar-item>
      <tab-bar-item path="/profile" activeColor="purple">
         <img slot="item-icon" src="~assets/img/tabbar/wode.png" alt="">
         <img slot="item-icon-active" src="~assets/img/tabbar/wode.active.png" alt="">
        <div slot="item-text">我的</div>
      </tab-bar-item>
    </tab-bar>
   </div>
</template>

<script>
import TabBar from 'components/tabbar/TabBar'
import TabBarItem from 'components/tabbar/TabBarItem'
export default {
    name:"MainTabBar",
    components:{
        TabBar,
        TabBarItem
    }
}
</script>

<style>

</style>

TabBar.vue代码

TabBar.vue文件,改文件为MainTabBar.vue中的子组件:


<template>  
    <div id="tab-bar">
      <slot></slot>
    </div>
</template>
<script>
export default {
    name:'TabBar'
}
</script>

<style>

</style>

TabBarItem.vue代码

TabBarItem.vue为MainTabBar.vue的子组件


<template>
  <div class="tab-bar-item" @click="itemClick">
     <div v-if="!isActive">
       <slot name="item-icon"></slot>
     </div>
     <div v-else>
        <slot name="item-icon-active"></slot>
     </div>
     <div :style="activeStyle"><slot name="item-text"></slot></div>
     
  </div>
</template>

<script>
export default {
    name:"TabBarItem",
    props:{
      path:String,
      activeColor:{
        type:String,
        default:'red'
      }
    },
    data(){
        return {
           // isActive:true
        }
    },
    computed:{
      isActive(){
        //判断
        //return this.$route.path.indexOf(this.path) !== -1
        //return this.$route.path === this.path
        return this.$route.path.indexOf(this.path)?false:true
      },
      activeStyle(){
        return this.isActive?{color:this.activeColor}:{}
      }
    },
    methods:{
      itemClick(){
        this.$router.replace(this.path)
      }
    }

}
</script>

<style>
     #tab-bar{
    display: flex;
    
  }
  #tab-bar{
    background-color: #f6f6f6;
    border-top: 2px #ccc;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    box-shadow:0px -1px 1px rgba(100,100,100,.2) ;
  }
  .tab-bar-item{
    flex: 1;
    text-align: center;
    height: 49px;
    font-size: 14px;
  } 
 .tab-bar-item img{
     width: 24px;
     height: 24px;
     margin-top: 3px;
     vertical-align: middle;
     margin-bottom: 3px;
 }
 .active{
     color: red;
 }
</style>

index.js路由配置代码

router文件夹下的index文件为路由的配置:


import Vue from 'vue'
import VueRouter from 'vue-router';
const Home = () => import('views/home/home')
const Category = () => import('views/category/category')
const Cart = () => import('views/cart/cart')
const Profile = () => import('../views/profile/profile')

//1.安装插件
Vue.use(VueRouter)

//2.创建路由对象
const routes = [
    {
        path:'',
        redirect:'/home'    
    },
    {
        path:'/home',
        component:Home    
    },
    {
        path:'/category',
        component:Category    
    },
    {
        path:'/cart',
        component:Cart    
    },
    {
        path:'/profile',
        component:Profile    
    }
]
const router  = new VueRouter({
    routes,
    mode:'history'
})

//3.导出router
export default router

views中的home代码,cart代码,profile代码,category代码:

home.vue代码


<template>
    <h2>首页</h2>
</template>

<script>
export default {
    name:"Home"
}
</script>

<style>

</style>

category.vue代码


<template>
    <h2>分类</h2>
</template>

<script>
export default {
    name:"Home"
}
</script>

<style>

</style>

profile.vue代码


<template>
    <h2>个人</h2>
</template>

<script>
export default {
    name:"Home"
}
</script>

<style>

</style>

cart.vue代码


<template>
    <h2>购物车</h2>
</template>

<script>
export default {
    name:"Home"
}
</script>

<style>

</style>

Base.css代码

CSS文件下的base.css内容:


body{
    padding: 0px;
    margin: 0px;
}

img图片资源

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

Vue实现TabBar底部导航栏组件

实现完成~

总结:

项目综合性很大,其中有插槽,路由,子组件父组件的值得传递,别名设置的各种知识。
项目动态内容:tabbar的文字,图片,颜色都可以动态改变,下次类似项目直接可以引用这些文件。

主要难点:

一、当点击到对应的TabBarItem上的时候改变图片颜色,文字颜色,这里是用当前的活跃路由和传过来的地址是否对应,如果对应就会变为true返货来为false:


computed:{
      isActive(){
        //判断
        return this.$route.path.indexOf(this.path)?false:true
      },
      activeStyle(){
        return this.isActive?{color:this.activeColor}:{}
      }
    },
    methods:{
      itemClick(){
        this.$router.replace(this.path)
      }
    }

上面的代码还有其他方法:


       return this.$route.path.indexOf(this.path) !== -1
       return this.$route.path === this.path

二、父组件传值问题,父组件传过来对应的文件路径,对应的字体颜色,子组件接受并使用:


export default {
    name:"TabBarItem",
    props:{
      path:String,
      activeColor:{
        type:String,
        default:'red'
      }
    },
    data(){
        return {}
    },

项目完成~

到此这篇关于Vue实现TabBar底部导航栏的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 超详细教程实现Vue底部导航栏TabBar

本文链接: https://www.lsjlt.com/news/158745.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 超详细教程实现Vue底部导航栏TabBar
    目录项目介绍:项目目录:TabBar效果预览:TabBar实现思路一、如果在下方有一个单独的TabBar组件,如何封装二、TabBar中现实的内容由外界决定。三、自定义TabBarI...
    99+
    2024-04-02
  • 【uniapp小程序】配置tabbar底部导航栏
    赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏 。 文章目录 🍋前言:🍍正文Tips1、首先我们准...
    99+
    2023-08-17
    uni-app vue.js 小程序
  • flutter实现底部导航栏
    本文实例为大家分享了flutter实现底部导航栏的具体代码,供大家参考,具体内容如下 一.flutter底部导航栏常用组件BottomNavigationBar 属性介绍 Botto...
    99+
    2024-04-02
  • uniapp小程序配置tabbar底部导航栏实战指南
    目录前言:正文Tips1、首先我们准备好自己项目所需要的tab图标2、找到我们的pages.json文件进行配置3、配置一下导航栏标题内容4、来看看我们的成果(效果图)总结前言: 配...
    99+
    2024-04-02
  • Flutter实现底部导航栏创建详解
    目录添加依赖项如何使用功能属性主题预览图代码Flutter web问题:Failed to load network image我的解决办法参考资料ConvexBottomBar是一...
    99+
    2024-04-02
  • FragmentTabHost FrameLayout实现底部导航栏
    app经常用到底部导航栏,早前使用过RadioGroup+FrameLayout实现或者RadioGroup+ViewPager实现,现在基本使用FragmentTabHost+FrameLayout来实现,因为使用起来简单易用。下面写一个...
    99+
    2023-05-31
    fragmenttabhost framelayout 导航栏
  • 微信小程序如何实现tabBar底部导航
    这篇文章主要介绍微信小程序如何实现tabBar底部导航,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序tabBar底部导航中文注解api,信小程序tabBar就是app底部的...
    99+
    2024-04-02
  • Flutter实现底部和顶部导航栏
    Flutter底部和顶部导航栏的实现,供大家参考,具体内容如下 带文字图标的底部导航栏(使用BottomNavigationBar和BottomNavigationBarItem)来...
    99+
    2024-04-02
  • Android Fragment实现顶部、底部导航栏
    前言 无论是顶部还是底部导航栏,都是大多数APP的标配,网络上的相关实现教程也非常之多。最近回忆起以前写的小项目,发现对这块内容有些遗忘,不妨就再整理一遍代码逻辑,记录下来,方便日后...
    99+
    2024-04-02
  • ReactNative全面屏状态栏和底部导航栏适配教程详细讲解
    目录前言顶部状态栏底部导航栏最后说的前言 最近在写 React Native 项目,调试应用时发现顶部状态栏和底部全面屏手势指示条区域不是透明的,看起来很难受。研究了一下这个问题,现...
    99+
    2023-01-28
    React Native全面屏状态栏 React Native底部导航栏
  • JetPackCompose底部导航栏的实现方法详解
    目录1.声明导航栏数据源2.使用Scaffold搭建页面结构3.BottomNavigation的用法1.声明导航栏数据源 主要声明导航栏label和图标数组,这里使用的是本地数据,...
    99+
    2024-04-02
  • flutter实现底部导航栏切换
    本文实例为大家分享了flutter实现底部导航栏切换的具体代码,供大家参考,具体内容如下 思路:MaterialApp是提供了bottomnavigationbar的,可以使用,这个...
    99+
    2024-04-02
  • Android实现底部导航栏效果
    目前网上主流的文章都是用底部的 RadioGroup + 页面部分的 Fragment 实现导航栏切换页面效果的。 然而底部的 RadioGroup 是如此麻烦,每个按钮的图片和文字...
    99+
    2024-04-02
  • android实现简单底部导航栏
    本文实例为大家分享了android实现底部导航栏的具体代码,供大家参考,具体内容如下 常见的底部导航栏 动态效果 实现步骤 1.底部导航栏样式 我们应该在项目的res文件夹下新建...
    99+
    2024-04-02
  • Android使用RadioGroup实现底部导航栏
    RadioGroup实现底部导航栏效果,如图:: 实现可最基本的导航栏功能,不能左右滑动,只能点击内嵌的fragment的布局:<?xml version="1.0" encoding="utf-8"?>...
    99+
    2023-05-30
    radiogroup 导航栏 gr
  • flutter实现底部不规则导航栏
    本文实例为大家分享了flutter实现底部不规则导航栏的具体代码,供大家参考,具体内容如下 scafford的bottomNavigationBar参数赋值BottomAppBar可...
    99+
    2024-04-02
  • Vue中怎么实现一个底部导航栏组件
    今天就跟大家聊聊有关Vue中怎么实现一个底部导航栏组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。<template> <di...
    99+
    2024-04-02
  • Flutter如何实现底部导航栏创建
    Flutter如何实现底部导航栏创建,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。ConvexBottomBar是一个底部导航栏组件,用于展现凸起的TAB效果,...
    99+
    2023-06-26
  • Android实现底部导航栏方法(Navigation篇)
    Navigation实现底部导航栏 前言导入和基本使用导入基础使用创建nav文件编辑Nav文件添加页面(代码版)添加页面(图解版) 创建导航动作 action创建action(代码版)...
    99+
    2023-10-10
    android
  • AndroidBottomNavigationView结合ViewPager实现底部导航栏步骤详解
    ViewPager2 介绍 ViewPager2 是基于 RecyclerView 重新编写的 ViewPager,比原有的 ViewPager 具有很多优势。 关于 ViewPag...
    99+
    2023-02-07
    Android BottomNavigationView底部导航栏 Android ViewPager底部导航栏
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作