当前位置: 首页 > news >正文

自定义tabbar跳转防止页面抖动(uniapp案例,也适用所有前端项目)

自定义tabbar思路就是自己写个tabbar组件引入到tabbar页面内,使每个页面显示也会有这个组件显示,但是这样的话,每次点击由于tabbar是作为页面组件使用的,会跟着组件的渲染和销毁一起执行,导致每次页面显示就会有抖动效果,解决方式为:做一个主页面,将tabbar页面引入进去,同时把该tabbar对应的页面也引入进去,这样的话只需要一个页面执行显示和隐藏就行了,也不会导致tabbar组件老是重复显示和隐藏了,具体实现方法如下

编写一个tabbar组件

我在/wxcomponents/tabbar/index.vue下面绘制tabbar组件,内容如下:

这里我tabbar的图标使用了阿里巴巴矢量图标的base64编码,有想要了解的点击可以参考我这篇文章

阿里巴巴矢量图标的font.css配置如下(如果tabbar图标是图片的话可以省略这一步,只是我项目用的是阿里巴巴图标的,不是图片):

@font-face {font-family: 'iconfont';/* Project id 4663953 */src: url('//at.alicdn.com/t/c/font_4663953_oa7tsq0eoq.woff2?t=1724567838049') format('woff2'),url('//at.alicdn.com/t/c/font_4663953_oa7tsq0eoq.woff?t=1724567838049') format('woff'),url('//at.alicdn.com/t/c/font_4663953_oa7tsq0eoq.ttf?t=1724567838049') format('truetype');
}.iconfont-themeColor {font-family: "iconfont" !important;font-size: 16px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: #F9BE3E
}.iconfont-noColor {font-family: "iconfont" !important;font-size: 16px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color:#8a8a8a
}

tabbar组件内容如下

<template><view class="tabbarContainer"><view class="home" @click="navigatePage('home')"><span :class="pagename=='home'?'iconfont-themeColor':'iconfont-noColor'">&#xe60f;</span><text>首页</text></view><view class="order" @click="navigatePage('order')"><span :class="pagename=='order'?'iconfont-themeColor':'iconfont-noColor'">&#xe62c;</span><text>点餐</text></view><view class="mycenter" @click="navigatePage('mycenter')"><span :class="pagename=='mycenter'?'iconfont-themeColor':'iconfont-noColor'">&#xe60e;</span><text>个人中心</text></view></view>
</template><script setup>import {defineEmits,defineProps} from 'vue';const props = defineProps(['pagename']) // 这里接收的是父组件向子组件发送的数据const emits = defineEmits(['changePage']) // 这里接收的是子组件向父组件发送的事件// 点击某个图标显示不一样的页面只需要给父组件修改下name值就行const navigatePage = (pagename) => {emits('changePage', pagename)}
</script><style scoped lang="scss">.tabbarContainer {width: 750upx;height: 168upx;position: fixed;left: 0;bottom: 0;display: flex;.home,.order,.mycenter {flex: 1;height: 118upx;display: flex;flex-direction: column;justify-content: center;align-items: center;}}
</style>

在主页面pages/index/index.vue加入以下代码:

<template><view><!-- 根据不一样的name显示不一样的页面 --><home v-if="name=='home'"></home><order v-if="name=='order'"></order><mycenter v-if="name=='mycenter'"></mycenter><!-- 根据pagename判断当前是哪个页面,然后高亮当前页面图标 --><tabbar :pagename="name" @changePage="changePage"></tabbar></view>
</template><script setup>import tabbar from '/wxcomponents/tabbar/index.vue'  // tabbar组件import Home from '/pages/tabbar/home.vue'  // home页面(tabbar页面)import Mycenter from '/pages/tabbar/mycenter.vue' // Mycenter页面(tabbar页面)import Order from '/pages/tabbar/order.vue' // Order页面(tabbar页面)import {ref} from 'vue';const name = ref('home') // 默认显示home页面// 点击切换时修改name的值,从而实现上面的tabbar页面的显示和隐藏const changePage = (e) => {name.value = e}
</script><style>
</style>

主要思路就这样,各位有更好的办法可以评论下


http://www.mrgr.cn/news/14868.html

相关文章:

  • Django框架安全
  • QT +ffmpeg-4.2.2-win64-shared 拉取 RTMP/http-flv 流播放
  • 如何使用WebSafeCompiler进行网站优化和知识产权保护
  • 自定义任意进制转换,平台架构之安全,商品ID,用户id--SAAS本地化及未来之窗行业应用跨平台架构
  • 国密起步2:GmSSL3使用SM4(对称加密)
  • Controller中接收数组参数 post请求中在body中传+post请求中通过表单形式传(x-www-form-urlencoded)
  • 使用分离轴定理对多边形进行碰撞检测
  • 用好外呼机器人,帮助企业提升客户管理效率
  • STM32-PWM驱动舵机——HAL库
  • ZaKi:Ingonyama的Prover market基础设施
  • linux基础命令
  • SpringBoot日常:Spring之@PostConstruct解析
  • 中介者模式详解
  • Windows上MSYS2的安装和使用
  • Android12 添加设置控制导航栏显示和状态栏下拉
  • 【如何用本机的Navicat远程连接到ubuntu服务器上的mysql】
  • Ubuntu 24.04 Intel install netcdf parallel
  • 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器)
  • 本地部署一个WordPress博客结合内网穿透实现异地远程访问本地站点
  • Java巅峰之路---进阶篇---面向对象(三)