首页 > 其他分享 >vue3 h5自定义tabbar并用keep-alive保存缓存路由

vue3 h5自定义tabbar并用keep-alive保存缓存路由

时间:2024-09-12 14:52:25浏览次数:12  
标签:vue const 自定义 alive keep tabbar scrollTop path 路由

        

  1. 路由嵌套
  2. 封装tabbar组件
  3. 创建一个容器放tabbar和子路由
  4. keep-alive保存路由状态

1.路由嵌套

{
		path: '/',
		name: 'index',
		component: () => import('@/views/index.vue'),
		children:[
			{
				path: '',
				redirect:'/com',
				meta:{
					keepAlive: true
				}
			},
			{
				path: '/com',
				name: 'com',
				component: () => import('@/views/com.vue'),
				meta:{
					keepAlive: true
				}
			},
			{
				path: '/info',
				name: 'info',
				component: () => import('@/views/info.vue'),
				meta:{
					keepAlive: true
				}
			},
			{
				path: '/mine',
				name: 'mine',
				component: () => import('@/views/mine.vue'),
				meta:{
					keepAlive: true
				},
			},
		]
	},

2.封装tabbar组件

src/components/tabbar

<template>
	<div class='tabbarBox'>
		<div class="tabbar-box" v-if="tabs.length > 0">
			<div class="tabbar-item" v-for="(item, index) in tabs" :key="index"
				:class="{ 'active': activeIndex === index }" @click="selectTab(index,item.path)">
				{{ item.title }}
			</div>
		</div>
	</div>
</template>
<script setup lang="ts">

// 接收参数
const props = defineProps({
	tabs: {
		type: Array,
		default: () => { },
	},
});

const router = useRouter()
const tabs = ref<any>([])
const activeIndex = ref<number>(0);

watchEffect(() => {
	tabs.value = props.tabs;
});

const selectTab = (index:number,path:string) => {
  activeIndex.value = index;
		router.push(path)
};
 
onMounted(() => {
})
</script>

3.创建一个容器放tabbar和子路由

src/view/index.vue

网上都是把tabbar放在app.vue里边的,但是放在app.vue每个页面都会显示了还需要判断,直接弄一个容器专门放tabbar页面

<template>
  <div class="tabbar">
    <tabbar :tabs='tabs'/> 
    <router-view v-slot="{ Component }">
      <keep-alive>
        <component :is="Component" />
      </keep-alive>
    </router-view>
  </div>
</template>
<script setup lang="ts">
interface Tab {
  title: string;
  path: string;
}

const tabs: Tab[] = [
  { title: '社区', path: '/com' },
  { title: '消息', path: '/info' },
  { title: '我的', path: '/mine' },
];

onMounted(() => {

})
</script>
<style scoped lang='less'>
.tabbar {
  width: 100vw;
  height: 100vh;
  background: #F7F6FB;
}
</style>

4.使用keep-alive

src/view/com.vue

<template>
	<div class='com-page' ref="comPage">
		<div class="com-box">社区</div>
	</div>
</template>
<script setup lang="ts">
import { useTemplateRef } from 'vue';

const scrollTop = ref<number>(0);
const compage = useTemplateRef<HTMLElement>("comPage");


onActivated(() => {
	nextTick(() => {
		// 跳转后��复 scrollTop 值,在下次路由跳转时��复 scrollTop 值
		if (compage.value) {
			compage.value.scrollTop = scrollTop.value
		}
	})
})
onBeforeRouteLeave((to, from, next) => {
	// 路由跳转前记录 scrollTop 值,在下次路由跳转时��复 scrollTop 值
	if (compage.value) {
		scrollTop.value = compage.value.scrollTop
	}
	next()
})
onMounted(() => {

})
</script>
<style scoped lang='less'>
.com-page {
	width: 100vw;
	height: 100vh;
	background: #F7F6FB;
	overflow: auto;
	font-size: 80px;

	.com-box {
		height: 8000px;
	}

}
</style>

useTemplateRef是vue3.5新发布的特性,用来获取dom

标签:vue,const,自定义,alive,keep,tabbar,scrollTop,path,路由
From: https://blog.csdn.net/weixin_54422862/article/details/142174510

相关文章

  • VUE自定义指令
    在Vue.js中,自定义指令允许你创建自己的DOM操作逻辑。虽然Vue3中的自定义指令相对较少使用(因为许多功能可以通过组件和其他API实现),但它们仍然是一个有用的工具。下面是如何在Vue中创建和使用自定义指令的基本步骤。1.创建自定义指令自定义指令可以通过app.directive......
  • Zabbix自定义监控项与触发器
            当我们需要获取某台主机上的数据时,直接利用zabbix提供的模板可以很方便的获得需要的数据,但是有些特别的数据,利用这些现有的模板或监控项是无法实现的,例如网站状态信息的监控、mysql数据库主从状态等信息。这是就需要自己定义键值和监控项,以满足企业对检测数......
  • DevExpress WinForms中文教程:Data Grid - 如何自定义行和单元格的样式?
    在本教程中您将学习如何使用事件更改数据单元格样式,您将从要给显示任务数据的网格开始,并且没有应用条件格式。通过处理GridView.RowStyle事件,您将对Priority字段值为High的行应用不同的背景颜色。然后如果Status设置为New,您将使用GridView.RowCellStyle事件来突出显示这些行中的St......
  • 单元测试,Junit,反射,注解(元注解,自定义注解,解析注解),动态代理
    目录一、单元测试二、反射1.认识反射2.获取类3.获取类的构造器4.获取类的成员变量5.获取类的成员方法6.作用三、注解1.概述、自定义注解2.元注解3.注解的解析四、动态代理1.概述2.使用代理的好处一、单元测试单元测试就是针对最小的功能单元(方法),编写测试代码对......
  • 自定义注解校验参数
    自定义注解校验参数:1、定义注解,写好返回值,申明注解的用处,文档生成importjavax.validation.Constraint;importjavax.validation.Payload;importjava.lang.annotation.Documented;importjava.lang.annotation.Retention;importjava.lang.annotation.Target;importstat......
  • 【Python脚本】自定义Payload的ICMP报文发送
    原创Evan运维小站OpsStationICMP(InternetControlMessageProtocol)是一种网络层协议,主要用于在IP主机、网关之间传递控制消息。通常,ICMP报文具有固定的格式,并用于发送错误报告或与网络诊断相关的消息。标准ICMP报文不包含用户定义的payload内容。但是,你可以通过发送一个"......
  • Java的class与String互相转换,自定义密码策略
    目的客户要求密码校验方式,用自己的认证方式。提供一种方案,在不出补丁的情况下,解决这个问题。原理1、本地写一个类,用客户想要的方案,实现密码校验的接口,编译成class类。2、然后把这个class类,先转换成二进制,再转换成16进制的字符串。3、将字符串写到客户的数据库里。4、重启服务,在......
  • Springboot枚举自定义序列化
    packagexxxxxxxxxxxxx;importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.SerializerProvider;importcom.fasterx......
  • IF语句 | WITH子句 | 自定义函数
    IF语句IF(expr1,expr2,expr3)expr1的值为TRUE,则返回值为expr2expr1的值为FALSE,则返回值为expr3SELECTIF(TRUE,1+1,1+2);->2SELECTIF(FALSE,1+1,1+2);->3WITH子句WITH子句主要用来创建一个暂时的结果集,这个结果集在后续的查询中可以多次使用WITHta......
  • 痞子衡嵌入式:在MDK开发环境下自定义安装与切换不同编译器版本的方法
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在MDK开发环境下自定义安装与切换不同编译器版本的方法。KeilMDK想必是嵌入式开发者最熟悉的工具之一了,自2005年Arm公司收购Keil公司之后,MDK就走上了发展快车道,从v2.50a一路狂奔到现在最新的v......