Vue学习之vue-tabbar

tabbar基本结构的搭建

1.首先创建两个子组件,子组件一是底部最外层div,组件二是小div(图片和文字)

(1)、子组件一用普通插槽

<template>
    <div class="tab-bar">
        <slot></slot>
    </div>
</template>
<script>
export default {
    name:"tabar",  
}

</script>
<style scoped>
</style>
//封装最大的组件

(2)、子组件二用具名插槽(使用props接收根组件传进来的数据,使用计算属性获取判断点击时图片转换和颜色转换,$router获取路由)

<template>
    <div class="tab-bar-item"  @click="itemclick">
        <div v-if="!itemjudge"><slot name="item-ioc-1"></slot></div>
        <div v-else><slot  name="item-ioc"></slot></div>
        <div :style="itemstype"><slot name="item-txt"></slot></div>
    </div>
</template>

<script>
export default {
    name:'tabaritem',
    props:{
        pa:String,//动态获取根组件传来的路由路径
        ba:{//动态获取根组件传来的颜色属性
            type:String,
            default:'red'
        }
    },
    data(){
        return{
            //judge:this.$route.path.indexOf(this.pa)!=-1,
        }
    },
    computed:{//计算属性
        itemjudge(){//动态判断点击按钮时图片颜色的显示
            return this.$route.path.indexOf(this.pa)!=-1
        },
        itemstype(){//动态判断点击按钮时文字颜色的显示
            return this.itemjudge?{color:this.ba}:{}
        }
    },
    methods:{
        itemclick(){//显示路由路径和路由相关内容
            this.$router.replace(this.pa)
        }
    }
}
</script>

<style>
</style>
//封装每一个小按钮组件

2、根组件中(导入两个组件和css文件,导入css文件时必须@import "./assets/css/base.css"形式,这样的话想动态加几按钮时再添加tabbaritem组件就可以了,点击时想让按钮文字变什么颜色,就变什么颜色)

<template>
  <div id="app">
    <router-view/>
    <ta-b-bar>
      <tabbaritem  pa="/home" ba="pink">//如果是动态数据的话v-bind绑定,如果是字符串的话不用v-bind,pa是路由,ba:点击时文字的颜色
        <img slot="item-ioc-1" src="./assets/img/tab/3.1.png" alt="">
        <img slot="item-ioc" src="./assets/img/tab/3.png" alt="">
        <div slot="item-txt">首页</div>
      </tabbaritem>
      <tabbaritem  pa="/category" ba="pink">
        <img slot="item-ioc-1" src="./assets/img/tab/2.1.png" alt="">
        <img slot="item-ioc" src="./assets/img/tab/2.png" alt="">
        <div slot="item-txt">分类</div>
      </tabbaritem>
      <tabbaritem pa="/cart" ba="pink">
        <img slot="item-ioc-1" src="./assets/img/tab/1.1.png" alt="">
        <img slot="item-ioc" src="./assets/img/tab/1.png" alt="">
        <div slot="item-txt">购物车</div>
      </tabbaritem>
      <tabbaritem pa="/profile" ba="pink">
        <img slot="item-ioc-1" src="./assets/img/tab/4.1.png" alt="">
        <img slot="item-ioc" src="./assets/img/tab/4.png" alt="">
        <div slot="item-txt">我的</div>
      </tabbaritem>
    </ta-b-bar>
  </div>
</template>

<script>
import TaBBar from './components/tab/tabar.vue'
import tabbaritem from './components/tab/tabaritem.vue'

export default {
  name: 'App',
  components: {
    TaBBar,
    tabbaritem
  }
}
</script>

<style>
@import "./assets/css/base.css"
</style>

路径问题:

在webpack.base.conf.js中有一个 定义了一个src文件夹的简称

resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      '@': resolve('src'),
    }
  },

在以后的所有的开发时src文件夹下的所有文件需要路径时都可以用@代替././之类的

例子:

<img slot="item-ioc-1" src="@/assets/img/tab/1.1.png" alt="">

 

 

六、效果图

 

posted @ 2022-03-17 13:24  猴猴手记  阅读(457)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end