quickapp_快应用_tabBar

news2024/12/27 2:02:12

tabBar

      • 配置项中配置tabBar(版本兼容)
      • 使用tabs组件配置tabBar
        • 语法
        • 示例
        • 问题-切换tab没有反应
        • 问题-数据渲染问题
          • 解决
          • 优化
        • 问题-tab的动态配置
      • 第三方组件tabbar

在这里插入图片描述
一般首页都会显示几个tab用于进行页面切换,以下是几种tab配置方式。

配置项中配置tabBar(版本兼容)

在manifest.json配置文件中display.tabBar可以进行tab配置,如下

{
  "display": {
    "tabBar": {
        "color": "#000000",          //文字颜色
        "selectedColor": "#008000",        //选中文字颜色
        "tabbarBackgroundColor": "#FFFFFF",    //组件背景
         "list": [{
            "pagePath": "/home",  //页面路由路径
            "pageParams":"{test: 'test1'}" ,  //页面参数
            "iconPath": "/Common/home.png", //图标
            "selectedIconPath": "/Common/home_active.png", //选中图标
            "text": "首页"    //文字内容
          },
          {
            "pagePath": "/mine",
            "pageParams":"{test: 'test2'}",
            "iconPath": "/Common/mine.png",
            "selectedIconPath": "/Common/mine_active.png",
            "text": "我的"
          }]
      }
}

但是此时存在以下两个问题

  • [1] tabBar配置项是在1110+版本适用,在低于1110版本中不起作用。
    (目前绝大部分机型版本为1070+),还有很多手机型号不兼容!
  • [2] tab不能动态配置!

使用tabs组件配置tabBar

语法
  • 概括

    tabs组件:仅支持最多一个tab-bar组件和最多一个tab-content组件。

    tab-bar组件: tabs的标签展示区,子组件排列方式为横向排列

    tab-content组件:tabs的内容展示区,高度默认充满 tabs 剩余空间,子组件排列方式为横向排列

  • 说明
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

示例
<!-- 书城 -->
<import name="library" src="../../components/library"></import>
<!-- 书架 -->
<import name="bookshelf" src="../../components/bookshelf"></import>
<!-- 排行榜 -->
<import name="ranking" src="../../components/bookshelf/ranking.ux"></import>
<!-- 我的 -->
<import name="mine" src="../../components/mine"></import>

<template>
<div class="page-wrapper">
  <!-- if='tabList.length'-->
  <tabs index="{{selectedTab}}" onchange="changeTab" >
    <tab-content>
      <library></library>
      <bookshelf id='bookshelf'></bookshelf>
      <ranking ></ranking>
      <mine></mine>
    </tab-content>
    <tab-bar mode="fixed" class="tab-bar">
      <div class="tab-item" for="tabList">
        <image class="iconfont" src='{{ selectedTab === $idx ? $item.onfocus_icon_url : $item.icon_url}}'></image>
        <text class="tab-title">{{ $item.title }}</text>
      </div>
    </tab-bar>
  </tabs>
</div>
</template>
<script>
export default {
  private: {
    tabList: [],
    selectedTab: 0 //默认第一个页面
  },
  onInit() {
    this.init()
  },
  init (){
    this.tabList = [
      {
        title: '书城',
        icon_url: 'https://img.iwave.net.cn/other/c7d4037ba99fea69c46dc096f46b11b6.png',
        onfocus_icon_url: 'https://img.iwave.net.cn/other/c996112028a8de365b292d7fcc95ebc2.png',
        type: 0
      },
      {
        title: '书架',
        icon_url: 'https://img.iwave.net.cn/other/6862b4ec95abc6f6f40494f67a6fae0d.png',
        onfocus_icon_url: 'https://img.iwave.net.cn/other/23512e7e0b47bbaf0d2a86f7dfb1c986.png',
        type: 1
      },
      {
        title: '排行榜',
        icon_url: 'https://img.iwave.net.cn/other/64f89f4184c04f20143c49c0685659c1.png',
        onfocus_icon_url: 'https://img.iwave.net.cn/other/d5b9e41090cdbbc1d92dae91f2d4398b.png',
        type: 2
      },
      {
        title: '我的',
        icon_url: 'https://img.iwave.net.cn/other/f6e7f3684b50f041f00e88c0753466c0.png',
        onfocus_icon_url: 'https://img.iwave.net.cn/other/2e72f98dc9780b08cd00f684f2ca2c21.png',
        type: 3
      }
    ]
  },
  changeTab(e) {
    let index = e.index === undefined ? 1 : e.index
    this.selectedTab = index
  }
}
</script>
问题-切换tab没有反应

最初我是直接将tabList写死的,这样tab切换没有问题

init(){
this.tabList = [...]
}

后来进行动态配置,从后端获取数据,发现tab切换没有反应

init(){
  const res = await $http.httpGet('init')
  if (res && !res.status) {
    this.tabList = res.data.tabs
  }
}

这是为什么呢?

原因是因为tab组件的子组件tab-bar、tab-content中的数据是不允许动态变换的!

若是动态加载需要在加载完成时再渲染,也就是加上if判断

<tabs index="{{selectedTab}}" onchange="changeTab" if='tabList.length'>
  ...
</tabs>
问题-数据渲染问题

知识点: 自定义组件生命周期+ 父子组件生命周期执行顺序

前提:以上示例中的四个组件(书城、书架、排行榜、我的)的初始化都是在init生命周期执行的。

问题1:当打开示例中的页面时会同时初始化这四个组件(打开页面时走4个组件的init生命周期函数)。

思考:我就在想要不在页面展现的时候再初始化呢(show生命周期中),经过实践发现自定义组件没有show生命周期。

问题2: 再次打开书城、书架、排行榜、我的页面时存在不更新数据的情况。

原因:[1] 切换tab的时候都是在main页面,不会执行任何生命周期; [2]在主页去其他页面点击左上角返回时走的是main组件的show生命周期,子组件不执行任何生命周期。因此除了通过router跳转到首页外,子组件只初始化一次!

解决

tips: 如果数据量不是很大的话,可以接受在初始化的时候同时初始化4个页面!

若是介意同时加载

  • [1]自定义组件中:不在init生命周期中进行初始化,封装一个init方法进行初始化
    init(){
      // 初始化
    }
    
  • [2] 主页中:在ready生命周期默认初始化第一个组件
    onReady(){
      this.$child('library').init()
    }
    
    每次展示页面和切换tab时加载对应组件
    onShow(){
      this.refreshBookShelf()
    },
    changeTab(e) {
      let index = e.index === undefined ? 1 : e.index
      this.selectedTab = index
      this.refreshBookShelf()
    },
    refreshBookShelf(){
      if (this.selectedTab == 0) {
        this.$child('library').init()
      }
      if (this.selectedTab == 1) {
        this.$child('bookshelf').init()
      }
      if (this.selectedTab == 2) {
        this.$child('ranking').init()
      }
      if (this.selectedTab == 3) {
        this.$child('mine').init()
      }
    }
    
优化

在这个需求里面书城、排行榜、我的页面的数据不是经常更新,

所以我在main页面打开时同时初始化四个页面

在切换tab或者是展示main页面时只重新加载书架的内容(因为书架内容会根据用户行为实时变化)

另外在书城、排行榜、我的页面添加下拉刷新(若是用户想要更新数据可以通过下拉刷新去更新)

  • [1] 组件:在init生命周期中进行初始化,封装一个init方法进行初始化
    onInit(){
      this.init()
    },
    init(){
      // 初始化
    }
    
  • [2] 主页:由于书架数据需要每次打开页面都更新
    onShow(){
      this.refreshBookShelf()
    },
    changeTab(e) {
      let index = e.index === undefined ? 1 : e.index
      this.selectedTab = index
      this.refreshBookShelf()
    },
    refreshBookShelf(){
      if (this.selectedTab == 1) {
        this.$child('bookshelf').init()
      }
    }
    
问题-tab的动态配置

现在的tab虽然tab-bar中的数据可以动态配置(动态显示tab名字和icon),但是对应的组件是固定的。
在这里插入图片描述
此时可以通过循环判断的方式进行

通过tab-bar配置的type固定是哪个组件进行渲染

<block for='item in tabList'>
  <library if='item.type == 0'></library>
  <bookshelf if='item.type == 1' id='bookshelf'></bookshelf>
  <ranking if='item.type == 2'></ranking>
  <mine if='item.type == 3'></mine>
</block>

注意只能通过if判断是否展示组件!!!!使用三元表达式和&&判断不起效果!!!!

<block for='item in tabList'>
  {{
    (
      item.type == 0 ? <library></library> : (
      item.type == 1 ? <bookshelf id='bookshelf'></bookshelf> : (
      item.type == 2 ? <ranking></ranking> : <mine></mine>
    )))
  }}
</block>

此时会在tab-content中渲染16个组件!!!
在这里插入图片描述
相当于是不管判断成不成立,每次循环都渲染4个组件!!!

另外就是其他页面跳转到main页面时传递的selectedTab值必须与type对应!

比如跳转到排行版页面

const index = this.tabList.findIndex(item => item.type == 2)
router.push('/page/main',{
  selectedTab: index
})

第三方组件tabbar

直接使用第三方组件库的tabbar组件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1220015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三种快速创建SpringBoot项目的方式

文章目录 在线创建IntelliJ IDEA 创建Maven 创建基本项目结构 SpringBoot 是一个快速开发框架&#xff0c;通过maven依赖的继承方式&#xff0c;帮助我们快速整合第三方常用框架。现在是 Java 领域的绝对霸主。 今天介绍三种快速创建 SpringBoot 项目的方式。 在线创建 1、打…

Uniapp-安装HBuilder调试基座失败解决方案

无法安装原因 有时候我们测试的时候&#xff0c;在手机上插上了线可能因为各种原因没有点击安装或者安装后删除就无法再次安装了&#xff0c;会提示同步资源失败,未得到同步资源的授权,请停止运行后重新运行&#xff0c;而且无论怎么操作都解决不聊这个问题&#xff0c;这是由…

搭建自己的JRebel服务

引入 JRebel插件热部署快速入门教程 上一篇文章有提到如何使用JRebel&#xff0c;其中在激活JRebel那一步骤时咱们使用的激活地址实际就是放在我的个人服务器上&#xff0c;本篇文章咱们手把手的搭建一个个人的JRebel服务。 下载激活工具 下载地址 如下图所示&#xff0c;…

专注于绘画,不受限制!尝试Growly Draw for Mac的快速绘画应用

Growly Draw Mac版是Mac平台上的一款绘画应用&#xff0c;它提供了简单易用的画板页面和多种色彩、画笔工具&#xff0c;让你可以轻松地完成作画。无论你是初学者还是专业人士&#xff0c;都可以在这款应用中找到适合自己的绘画方式。通过使用Growly Draw Mac版&#xff0c;你可…

echarts 实现双y轴折线图示例

该示例有如下几个特点&#xff1a; ①实现tooltip自定义样式&#xff08;echarts 实现tooltip提示框样式自定义-CSDN博客&#xff09; ②legend左右区分展示 ③双y轴折线展示 代码如下&#xff1a; this.options {grid: {left: "3%",right: "3%",top: &…

3GPP TS38.201 NR; Physical layer; General description (Release 18)

TS38.201是介绍性的标准&#xff0c;简单介绍了RAN的信道组成和PHY层承担的功能&#xff0c;下图是PHY层相关标准的关系。 文章目录 结构信道类型调制方式PHY层支持的过程物理层测量其他标准TS 38.202: Physical layer services provided by the physical layerTS 38.211: Ph…

docker笔记14--docker-nerdctl-crictl-ctr使用对比

docker笔记14--docker-nerdctl-crictl-ctr使用对比 介绍工具对比dockernerdctlcrictlctr 注意事项说明 介绍 随着容器云技术的成熟&#xff0c;越来越多的从业者开始接触、熟悉 docker和containerd 了&#xff0c;很多时候需要同时在 docker 和 containerd之间切换&#xff0c…

L1 频段卫星导航射频前端低噪声放大器芯片MS2659

产品简述 MS2659 是一款具有高增益、低噪声系数的低噪声放大器 (LNA) &#xff0c;支持 L1 频段多模式全球卫星定位&#xff0c;可以应用于 GPS 、 北斗二代、伽利略、 GLONASS 等 GNSS 导航接收机中。芯片采 用 SOT23-6 的封装形式。 主要特点 ◼ 支持北斗、 …

java调用c函数

一、关于JNI JNI是Java Native Interface的缩写&#xff0c;JNI是JAVA平台专门用于和本地C代码进行相互操作的API&#xff0c;称为JAVA本地接口。 二、JNI开发流程 1.在JAVA中先声明一个native方法。2.通过javac -h或javah -jni命令导出JNI使用的C头头文件。3.使用C实现本地方…

科普丨企业防泄密软件是什么

企业防泄密软件是一种专门设计用于保护企业敏感信息不被泄露的软件产品。这类软件通常采用多种安全技术和策略&#xff0c;以增强企业数据的安全性和保密性&#xff0c;防止核心知识产权和商业机密的泄露。 域之盾软件----企业防泄密软件的主要功能包括&#xff1a; 1、数据加密…

16位 (MCU) R7F101G6G3CSP、R7F101G6E3CSP、R7F101G6G2DSP、R7F101G6E2DSP是新一代RL78通用微控制器

产品描述 RL78/G24微控制器具有RL78系列MCU的最高处理性能&#xff0c;CPU工作频率高达48MHz&#xff0c;设有灵活的应用加速器 (FAA)。FAA是一款专门用于算法运算的协处理器&#xff0c;可以独立于CPU运行&#xff0c;提供更高处理能力。RL78/G24 MCU具有增强的模拟功能和大量…

【MySQL】表的约束——主键、外键、唯一键,三键区别知否?

表的约束 前言正式开始空属性默认值comment列描述zerofill主键增删主键复合主键 自增长唯一键外键主键作为外键约束唯一键作为外键约束 总结 前言 我在上一篇讲完了所有的数据类型&#xff0c;数据类型本身也是MySQL中的一种约束&#xff0c;如果你对于MySQL中的数据类型不太了…

【面试经典150 | 数学】加一

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;加一 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结…

wu-ui-uniapp 多平台快速开发的UI框架

WU-UI 多平台快速开发的UI框架(无论平台&#xff0c;一致体验) 官方群 wu-ui官方1群: 767943089 说明 wu-ui(如虎添翼) 是 全面兼容多端的uniapp生态框架&#xff0c;基于vue2、vue3和nvue开发。丰富组件库&#xff0c;便捷工具库&#xff0c;简单高效。无论平台&#x…

电子眼与无人机在城市安防中的协同应用研究

随着城市化进程的快速推进&#xff0c;城市安全问题成为了人们关注的焦点。传统的安防手段已经无法满足现代城市复杂多变的安全需求。因此&#xff0c;结合电子眼与无人机技术&#xff0c;实现二者之间的协同应用&#xff0c;成为提升城市安防能力的重要途径。 一、电子眼与无人…

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】Optimized Hot Spot Analysis 优化的热点分析https://mp.weixin.qq.com/s/lfoIls8exW5G6PPJ9gtDew em&#xff0c;先给大家推荐一个空间统计分析的学习资源网站 https://spatialstats-analysis-1.hub.arcgis.com/ .…

基于SSM的个人通讯录(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的个人通讯录&#xff08;有报告&#xff09;。Javaee项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff1a; 采用M&#xff08;mod…

全新小权云黑系统

小权云黑管理系统 V1.0 功能如下&#xff1a; 1.添加骗子&#xff0c;查询骗子 2.可添加团队后台方便审核用 3.在线反馈留言系统 4.前台提交骗子&#xff0c;后台需要审核才能过 5.后台使用光年UI界面 6.新增导航列表&#xff0c;可给网站添加导航友链 7.可添加云黑类型收录 8.…

【Linux专题】firewalld 过滤出接口流量

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等_厦门微思网络的博客-CSDN博客文章浏览阅读428次。风和日丽&#xff0c;小微给你送福利~如果你是小微的老粉&#xff0c;这里有一份粉丝福利待领取...如果你是新粉关注到了小微&am…

3分钟搞懂oled透明触摸显示屏

OLED透明触摸显示屏是一种先进的显示技术&#xff0c;它结合了OLED显示屏和触摸功能&#xff0c;具有透明度高、色彩鲜艳、触摸灵敏、节能环保等优点。下面用3分钟时间&#xff0c;为您讲解OLED透明触摸显示屏的基本原理、特点和优势。 OLED透明触摸显示屏的基本原理 OLED透明…