系列导航

一、vue tabBar导航栏设计实现1-初步设计

二、vue tabBar导航栏设计实现2-抽取tab-bar

三、vue tabBar导航栏设计实现3-进一步抽取tab-item

四、vue tabBar导航栏设计实现4-再次抽取MainTabBar

五、vue tabBar导航栏设计实现5-最终版本

tabBar导航栏设计4-再次抽取MainTabBar

一、     本节目标效果

上一个节的例子中App.vue中代码量还是很大如何简化App.vue,再次抽取一个MainTabBar组件负责在TabBarItem里放数据

二、代码结构

注:主要是标红的几个文件

三、代码

App.vue

<template>
<div id="listStyle" >
<div id="dayCount">
今日点击:99999 | 今日发布:2000 | 今日下载:1000
</div>
<List border header="资源信息" size="large" >
<ListItem v-for="(item, index) in resourcesList">
<ListItemMeta :avatar="getImgUrl(item.iconPath)" :title="item.title" :description="item.resourcesDesc" />
<template slot="action">
<li>
<Icon type="ios-star-outline" /> {{item.perfectTimes}}
</li>
<li>
<Icon type="ios-thumbs-up-outline" />{{item.goodTimes}}
</li>
<li>
<Icon type="ios-chatbubbles-outline" /> {{item.badTimes}}
</li>
</template>
</ListItem>
<Page id="page" :total="pageTotal" :current="pageNum" :page-size="pageSize" @on-change="handlePage" show-total show-elevator next-text="下一页"/>
</list> </div>
</template> <script>
import {getXyResourcesInfoV} from '@/network/index.js'; //分页的初始参数
const paramter = {
page: 1,
pagesize:4,
ispage:'Y'
}; export default {
name: "MainList",
props: { },
data() { return {
resourcesList: [] ,
pageTotal: 0,
pageNum: 1,
pageSize: 10,
}
},
created() {
this.dataListInit(); },
computed: { },
methods: {
//页面变更
handlePage(value) {
console.log('value:'+value);
this.pageNum = value;
paramter.page = value; this.dataListInit()
}, dataListInit() {
getXyResourcesInfoV(paramter).then(res => {
//debugger
this.pageTotal = res.data.page.count;
this.pageSize = res.data.page.pagesize;
this.pageNum = res.data.page.page;
this.resourcesList = [];
for (var i = 0; i < res.data.obj.dataList.length; i++) {
this.resourcesList.push({
resourcesId: res.data.obj.dataList[i].resourcesId,
title: res.data.obj.dataList[i].title,
resourcesDesc:res.data.obj.dataList[i].resourcesDesc,
perfectTimes:res.data.obj.dataList[i].perfectTimes,
goodTimes:res.data.obj.dataList[i].goodTimes,
badTimes:res.data.obj.dataList[i].badTimes,
iconPath:res.data.obj.dataList[i].iconPath
})
} })
.catch(error => {}); }, itemClick() {
this.$router.replace(this.path)
}, // 动态获取头像图片
getImgUrl(picName) {
//默认图标
//debugger if( picName == 'init' ){
return require("@/assets/image/element/headPhoto/1.png");
}else{
//base64图标
return picName;
}
} }
}
</script> <style lang="scss">
#dayCount { height: 30px; //设置高度
font-size: 15px; //设置字体大小
color: #2d8cf0;
// position: relative;
font-family: "PingFang SC";
padding: 7px
} #page{
//float:right
text-align:right
} </style>

TabBar.vue

<template>
<div id="tab-bar">
<slot></slot>
</div>
</template> <script> import {defineComponent} from 'vue' export default defineComponent({
//组件名称
name:'TabBar',
//接收父组件的数据
props:{
},
components: { },
setup(props,ctx){
return{
}
}
}) </script> <style lang="scss">
#tab-bar {
display: flex;
background-color: #f6f6f6; position: fixed;
left: 0;
right: 0;
bottom: 0; box-shadow: 0 -1px 1px rgba(100,100,100,.2);
} </style>

TabBarItem.vue

<template>
<div class="tab-bar-item">
<slot name="item-icon"></slot>
<slot name="item-text"></slot>
</div>
</template> <script> import {defineComponent} from 'vue' export default defineComponent({
//组件名称
name:'TabBarItem',
//接收父组件的数据
props:{
},
components: { },
setup(props,ctx){
return{
}
}
})
</script> <style lang="scss">
.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: 2px;
}
</style>

MainTabBar.vue

<template>
<tab-bar>
<tab-bar-item path="/">
<template v-slot:item-icon>
<img :src="require('../../assets/img/tabbar/home.svg')">
</template>
<template v-slot:item-icon-active>
<img :src="require('../../assets/img/tabbar/home_active.svg')">
</template>
<template v-slot:item-text>
<div slot="item-text">首页</div>
</template>
</tab-bar-item>
<tab-bar-item path="/category">
<template v-slot:item-icon>
<img :src="require('../../assets/img/tabbar/category.svg')">
</template>
<template v-slot:item-icon-active>
<img :src="require('../../assets/img/tabbar/category_active.svg')">
</template>
<template v-slot:item-text>
<div slot="item-text">分类</div>
</template>
</tab-bar-item>
<tab-bar-item path="/cart">
<template v-slot:item-icon>
<img :src="require('../../assets/img/tabbar/shopcart.svg')">
</template>
<template v-slot:item-icon-active>
<img :src="require('../../assets/img/tabbar/shopcart_active.svg')">
</template>
<template v-slot:item-text>
<div slot="item-text">购物车</div>
</template>
</tab-bar-item>
<tab-bar-item path="/profile">
<template v-slot:item-icon>
<img :src="require('../../assets/img/tabbar/profile.svg')">
</template>
<template v-slot:item-icon-active>
<img :src="require('../../assets/img/tabbar/profile_active.svg')">
</template>
<template v-slot:item-text>
<div slot="item-text">我的</div>
</template>
</tab-bar-item>
</tab-bar>
</template> <script>
import TabBar from '../tabbar/TabBar'
import TabBarItem from '../tabbar/TabBarItem' export default {
name: "MainTabBar",
components: {
TabBar,
TabBarItem
}
}
</script> <style scoped> </style>

index.js

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import Category from '../views/Category.vue'
import Cart from '../views/Cart.vue'
import Profile from '../views/Profile.vue' const routes = [
{
path: '/',
name: 'Home',
component: Home
} ,
{
path: '/category',
component: Category
},
{
path: '/cart',
component: Cart
},
{
path: '/profile',
component: Profile
}
] const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
}) export default router

其他一些代码不很简单看之前的博客内容

四、代码按照步骤解释

1、 抽取MainTabBar.vue组件

MainTabBar.vue组件里调用TabBar.vue和TabBarItem.vue组件,并且将数据放到MainTabBar.vue组件里。

2、TabBarItem.vue组件里增加itemClick方法负责页面跳转 ,跳转的地址由MainTabBar.vu中的tab-bar-item 组件的path属性动态传递过来。

3、 index.js中配置路由

4、App.vue中调用MainTabBar.vue组件,注意这里一定要加一个<router-view>标签要不路径跳转没有占位符就不会有效果。

vue tabBar导航栏设计实现4-再次抽取MainTabBar的更多相关文章

  1. 微信小程序------导航栏样式、tabBar导航栏

    一:导航栏样式设置 小程序的导航栏样式在app.json中定义. 这里设置导航,背景黑色,文字白色,文字内容测试小程序 app.json内容: { "pages":[ " ...

  2. 微信小程序入门四: 导航栏样式、tabBar导航栏

    实例内容 导航栏样式设置 tabBar导航栏 实例一:导航栏样式设置 小程序的导航栏样式在app.json中定义. 这里设置导航,背景黑色,文字白色,文字内容测试小程序 app.json内容: { & ...

  3. 超详细Vue实现导航栏绑定内容锚点+滚动动画+vue-router(hash模式可用)

    超详细Vue实现导航栏绑定内容锚点+滚动动画+vue-router(hash模式可用) 转载自:https://www.jianshu.com/p/2ad8c8b5bf75 亲测有效~ <tem ...

  4. Nuxt/Vue自定义导航栏Topbar+标签栏Tabbar组件

    基于Vue.js实现自定义Topbar+Tabbar组件|仿咸鱼底部凸起导航 最近一直在倒腾Nuxt项目,由于Nuxt.js是基于Vue.js的服务端渲染框架,只要是会vue,基本能很快上手了. 一般 ...

  5. 使用vue给导航栏添加链接

    如下面的导航栏,使用vue技术给该导航栏增加链接: js代码为: navigation:function(){ new Vue({ el: '#navUl', data: { menuData:{ ' ...

  6. Flutter - TabBar导航栏切换后,状态丢失

    上一篇讲到了 Flutter - BottomNavigationBar底部导航栏切换后,状态丢失 里面提到了TabBar,这儿专门再写一下吧,具体怎么操作,来不让TabBar的状态丢失.毕竟大家99 ...

  7. 记一次Vue跨导航栏问题解决方案

    简述 这篇文章是我项目中,遇到的一个issue,我将解决过程和方法记录下来. 本篇文章基于Vue.js进行的前端页面构建,由于仅涉及前端,将不做数据来源及其他部分的叙述.使用的CSS框架是 Boots ...

  8. Vue设置导航栏为公共模块并在登录页不显示

    1.公共模块的内容可以放在App.vue中但是通常登录页面是不需要导航的,那么就需要规避登录页这时,就可以采用keep-alive结合$route.meta来实现这个功能.keep-alive 是 V ...

  9. vue 侧边导航栏递归显示

    import axios from "axios"; import tabs1 from "../tab_content/tab1.vue"; import m ...

  10. 新浪微博客户端(1)-实现Tabbar导航栏效果

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

随机推荐

  1. Echarts图表基本参数设置说明

    ECharts 是一款强大的数据可视化库,可以通过 JavaScript 构建交互式和动态的图表.在使用 ECharts 进行图表绘制时,我们可以通过设置各种参数来达到我们想要的效果.下面是对 ECh ...

  2. SpringBoot项目中常见组件的配置属性

    本文本的属性摘录自官方Properties配置清单,并附加了国内开发常用的框架配置属性.以国内WEB开发中,所涉及的常见组件为顺序组织配置清单 1. 配置属性清单 1.1 日志配置 序号 属性名 类型 ...

  3. 华企盾DSC造成扫描仪无法扫描成pdf文件

    解决方法:去掉缩略图策略,重启电脑

  4. 微软成为PostgreSQL主要贡献者

    微软成为PostgreSQL主要贡献者 微软对PostgreSQL贡献的很多新功能都来自于客户在使用微软Azure上的PostgreSQL管理实例数据库,所以这些新功能都来自于真实的客户需求 微软对P ...

  5. ubuntu设置系统字符集为中文

    第一步:查看自己系统的字符集 先查看系统的默认字符集格式:locale 或者cat /etc/default/locale root@JumpServer-APP-T02:~# locale LANG ...

  6. Java 全栈知识体系(2021 PDF 版本)

    40000 +字长文总结,民工哥已将此文整理成PDF文档了,需要的见文后下载获取方式. 全栈知识体系总览 Java入门与进阶 面向对象与Java基础 Java 基础 - 面向对象 Java 基础 - ...

  7. Docker、pre-commit 导致的 git commit 报错:找不到 python 3.8

    到这个问题的原因可能有很多,这里只是记录下针对我遇到这这跟题的原因及解决方法 问题描述 执行 git commit 命令,报错 /usr/bin/env: 'python3.8': No such f ...

  8. 【华为云技术分享】LiteOS无法直接烧录或者烧录失败解决方法--ST-Link

    前提条件: 程序编译成功,并且电脑上已经安装ST-Link驱动,你使用的仿真器也是ST-Link. 上图黑色的是J-Link,下图紫色的是ST-Link,本教程适用于ST-Link,如果是J-Link ...

  9. 华为云API Explorer重磅推出API编排,开发者0代码高效构建工作流

    本文分享自华为云社区<华为云API Explorer重磅推出API编排,开发者0代码高效构建工作流(体验用户招募中)>,作者:华为云PaaS服务小智. 打破传统开发模式,API编排应运而生 ...

  10. 【好书推荐】《Python黑魔法指南》-附高清PDF版

    摘要:<Python 黑魔法手册.pdf >作者(明哥)是一个从事云计算多年的 Python 重度用户,它把自已多年的 Python 编码经验整理成小册子,没有长篇大论,半天就能全能掌握, ...