Vue学习(十四)——Tabbar组件

本文介绍了一种基于前端路由实现的TabBar组件设计方案。通过自定义TabBar-item组件,利用计算属性控制图标状态,并通过绑定点击事件实现页面切换。组件支持自定义激活颜色,易于集成到现有项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整个组件的实现思路是在页面的最底部放置一个tabbar栏,点击对应的tabbar图标就获取对应的页面显示,我们切换页面的显示的操作可以使用前端路由来完成.

组件单项:

tabbar-item

<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_n"></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
      },
      activeStyle(){
         return this.isActive?{color:this.activecolor}:{}
      }
    },
    methods:{
      itemClick(){
        this.$router.replace(this.path)
      }
    }
}
</script>

<style>
.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;
}

</style>

像样式这种我就不分析了,上网一查就有轮子或者慢慢调试总会出来的,使用模板语法是为了方便将整个组件抽离,这个tabbar-item只是一个tabbar图标选项,为了使的组件高度封装分离,我们在组件的模板中使用三个插槽,分别是为了放置未被选中的图标显示,被选中的图标显示,以及跳转tabbar页面的名称,这样就会出现第一个关键点了,两个图标在选中和未被选中的时候正确显示,我们通过一个计算属性isActive解决,isActive通过调用this.$route.path来实现,这个是一个字符串,这个字符串是当前路由组件的路径,调用indexOf方法检测当前tabbar-item的组件是否被包含其中,从而使得每一个tabbar-item显示正确的图标。第二个关键点是我们点击的tabbar-item可以正确的显示页面名称样式,并且添加了一个让用户指定样式的需求,我们在这里使用的是一个动态样式,绑定了一个计算属性activeStyle,该计算属性会根据用户的指定与否选择默认的指定样式或者用户指定样式来正确的显示,获取用户的指定样式这里也有一定的难度,我们的处理是采用组件的props来接收用户传递过来的一个参数activecolor,并指定默认样式为红色。最后一个关键点是处理点击tabbar-item来切换对应的路由界面,我们给tabbar-item绑定一个事件,在props中接收一个从父组件传过来的字符串,该字符串是路由路径,再在这个事件之中使用路由切换路径。

组件外部容器

tabbar

<template>
  <div id="tab-bar">
    <slot></slot>
  </div>
</template>
<script>
export default {
  name: "Tabbar"
};
</script>
<style>
#tab-bar {
  display: flex; /** 让四个标签横向排列*/
  background-color: #f6f6f6;
  height: 49px;

  position: fixed; /** 让整个tabber组件在页面的最低端显示*/
  left: 0;
  right: 0;
  bottom: 0;

  box-shadow: 0 -1px 1px rgba(100, 100, 100, 0.1);
}

</style>

其实关键点在上面已经解决的差不多了,这个tabbar主要是处理所有tabbar-item的显示样式。还有其他的就是路由页面的创建,以及路由的创建,导出,导入等操作了。

调用文件

<template>
  <div id="app">
    <router-view></router-view>
    <Tabbar>
      <Tabbaritem path="/home">
        <img slot="item-icon" src="./assets/img/tabbar/shouye_n.png" alt="">
        <img slot="item-icon_n" src="./assets/img/tabbar/shouye_y.png" alt="">
        <div slot="item-text">首页</div>
      </Tabbaritem>
      <Tabbaritem path="/category">
        <img slot="item-icon" src="./assets/img/tabbar/fenlei_n.png" alt="">
        <img slot="item-icon_n" src="./assets/img/tabbar/fenlei_y.png" alt="">
        <div slot="item-text">分类</div>
      </Tabbaritem>
      <Tabbaritem path="profile">
        <img slot="item-icon" src="./assets/img/tabbar/gerenzhongxin_n.png" alt="">
        <img slot="item-icon_n" src="./assets/img/tabbar/gerenzhongxin_y.png" alt="">
        <div slot="item-text">个人中心</div>
      </Tabbaritem>
      <Tabbaritem path="cart">
        <img slot="item-icon" src="./assets/img/tabbar/gouwuche_n.png" alt="">
        <img slot="item-icon_n" src="./assets/img/tabbar/gouwuche_y.png" alt="">
        <div slot="item-text">购物车</div>
      </Tabbaritem>
    </Tabbar>

  </div>
</template>

<script>
import Tabbar from './components/tabber/tabber'
import Tabbaritem from './components/tabber/tabbar-item'

export default {
  name: 'App',
  components: {
     Tabbar,
     Tabbaritem
  }
}
</script>

<style>
@import './assets/css/base.css';/*在style标签中可以这样的导入样式文件*/ 
</style>

正确的调用传递参数给子组件就好,我们在style标签中可以使用 @import + ‘文件路径’来导入样式文件。

 

### 封装公共组件的方法 在 Vue.js 开发过程中,为了提高代码的重用性和维护性,通常会对一些常用的功能进行封装成公共组件。这些组件可以在多个地方被调用而无需重复编写相同的逻辑。 #### 创建基本结构 按照良好的实践习惯,在项目初始化阶段应该规划好项目的文件夹布局。对于一个典型的 Vue 项目来说,至少会有 `views`、`common` 和 `features` 这三个主要目录[^1]: - **Views**: 存储页面级别的视图组件; - **Common**: 放置那些在整个应用中都会频繁使用的通用型组件,比如头部导航栏(head) 或者页脚(foot); - **Features**: 容纳具有特定业务逻辑的功能模块,像轮播(swiper)、标签栏(tabbar)或是带有分页加载特性的列表(list). #### 编写具体实现 当着手于某个具体的公共组件时,遵循标准的单文件组件(SFC)格式是非常重要的。每一个 `.vue` 文件都应当包含 `<template>`、`<script>` 及 `<style>` 三部分[^4]: ```html <!-- common/components/Head.vue --> <template> <header class="header"> <!-- 头部内容 --> </header> </template> <script> export default { name: 'Header', props: ['title'], } </script> <style scoped> .header { /* 样式 */ } </style> ``` 在此基础上,如果涉及到更复杂的交互行为,则可以通过定义属性(`props`)来接收外部传递的数据;利用计算属性(computed properties)处理内部状态的变化;借助事件(event bus or emit)与其他兄弟姐妹甚至父辈节点通信等等[^2]. 另外值得注意的是,针对某些特殊场景下的需求——例如图表展示——还可以进一步抽象出更高层次的服务层函数或工具类库辅助完成任务。以 ECharts 的集成为例,通过预先设定一套全局适用的基础配置项(base option),再允许局部定制化调整的方式,既保证了一致性又不失灵活性[^3]. 最后提醒一点,随着应用程序规模的增长以及团队协作模式的发展变化,合理运用插槽(slot mechanism)机制赋予使用者更大的自由度去扩展原有设计将是十分必要的考虑因素之一.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值