Uniapp + Vite + Vue3 + uView + Pinia 实现自定义底部 Tabbar(最新保姆级教程)

Uniapp + Vite + Vue3 + uView + Pinia 实现自定义底部 Tabbar(最新保姆级教程)

  • 1、效果展示
  • 2、环境准备
    • 2.1 新建 uniapp 项目
    • 2.2. 安装 uView
    • 2.3 安装 pinia
  • 3. 配置环境
  • 4. 创建目录结构
  • 5、编写 pages.json 页面路由
  • 6、编写 tabbar.js 状态数据
  • 7、编写 tabbar.vue 组件

1、效果展示


在这里插入图片描述

2、环境准备


2.1 新建 uniapp 项目

新建普通 Vue3 项目即可

在这里插入图片描述

2.2. 安装 uView


官网

https://uiadmin.net/uview-plus/components/install.html

安装

npm install uview-plus

2.3 安装 pinia

官网

https://pinia.vuejs.org/zh/getting-started.html

安装

npm install pinia

3. 配置环境


  • main.js
import App from './App'// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({...App
})
// #endif
import uviewPlus, {setConfig
} from 'uview-plus'// #ifdef VUE3
import {createSSRApp
} from 'vue'
import { createPinia } from 'pinia'
export function createApp() {const pinia = createPinia()const app = createSSRApp(App);app.use(pinia);app.use(uviewPlus);// 需要在app.use(uview-plus)之后执行setConfig({// 修改$u.config对象的属性config: {// 修改默认单位为rpx,相当于执行 uni.$u.config.unit = 'rpx'unit: 'px'},// 修改$u.props对象的属性props: {// 修改radio组件的size参数的默认值,相当于执行 uni.$u.props.radio.size = 30radio: {// size: 20 }// 其他组件属性配置// ......}});return {app}
}
// #endif
  • App.vue
<script>export default {onLaunch: function() {console.log('App Launch')// 隐藏原生tarbar (这里因为用自定义tarbar跳转时闪白屏,所以这里用一种特殊的方式)uni.hideTabBar()},onShow: function() {console.log('App Show')},onHide: function() {console.log('App Hide')}}
</script><style lang="scss">/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */@import "uview-plus/index.scss";
</style>
  • vite.config.js(如果没有可以新建,主要用于配置@路径识别)
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
import { resolve } from "path";// https://vitejs.dev/config/
export default defineConfig({plugins: [uni()],resolve: {// 路径别名alias: {"@": resolve(__dirname, "./"),},},
});

4. 创建目录结构

在这里插入图片描述

5、编写 pages.json 页面路由

{// uView 配置"easycom": {"autoscan": true,// 注意一定要放在custom里,否则无效,https://ask.dcloud.net.cn/question/131175"custom": {"^u--(.*)": "uview-plus/components/u-$1/u-$1.vue","^up-(.*)": "uview-plus/components/u-$1/u-$1.vue","^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue"}},"pages": [ {"path": "pages/src/home/home","style": {"navigationBarTitleText": "云尚社区"}},{"path": "pages/src/login/login","style": {"navigationBarTitleText": "登录"}},{"path": "pages/src/community/community","style": {"navigationBarTitleText": "社区"}},{"path": "pages/src/lookHous/lookHous","style": {"navigationBarTitleText": "租房"}},{"path": "pages/src/message/message","style": {"navigationBarTitleText": "消息"}},{"path": "pages/src/user/user","style": {"navigationBarTitleText": "我的"}}],// 这里只配置路径"tabBar": {"list": [{"pagePath": "pages/src/home/home"},{"pagePath": "pages/src/lookHous/lookHous"},{"pagePath": "pages/src/community/community"},{"pagePath": "pages/src/message/message"},{"pagePath": "pages/src/user/user"}],// 高为 0px 不可见因为我们要自定义 tabbar"height": "0px"},"globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "云尚社区","navigationBarBackgroundColor": "#F8F8F8","backgroundColor": "#f8f9fb"},"uniIdRouter": {}
}

6、编写 tabbar.js 状态数据

  • tabbar.js
import {defineStore
} from "pinia"export const useTabbar = defineStore("tabbar", { //js命名state: () => {return {activeTab: 0 // 默认选中的索引}},actions: {//设置active的值setActive(active) {this.activeTab = active}}
})

7、编写 tabbar.vue 组件

<template><view><up-tabbar :value="activeTab" :fixed="true" :placeholder="true" :safeAreaInsetBottom="true"><template v-for="(item, index) in tabbarList" :key="index"><up-tabbar-item :text="item.name" @click="toPageFun(item)" :icon="getTabbarIcon(item, index)"></up-tabbar-item></template></up-tabbar></view>
</template><script setup>import { ref } from 'vue';// 导入 tabbar.js 中暴露的方法import { useTabbar } from "@/pages/store/tabbar/tabbar.js"// 导入 pinia 中暴露的数据转换为响应式的方法import { storeToRefs } from "pinia";// 实例化 tabbar.js 中暴露的方法const tabbar = useTabbar();// 转换为响应式数据const { activeTab } = storeToRefs(tabbar);const tabbarList = ref([{index: 0,name: "首页",url: "/pages/src/home/home",icon: "/static/tabbar/home.png",activeIcon: "/static/tabbar/active-home.png",},{index: 1,name: "租房",url: "/pages/src/lookHous/lookHous",icon: "/static/tabbar/look-hous.png",activeIcon: "/static/tabbar/active-look-hous.png",},{index: 2,name: "社区",url: "/pages/src/community/community",icon: "/static/tabbar/community.png",activeIcon: "/static/tabbar/active-community.png",},{index: 3,name: "消息",url: "/pages/src/message/message",icon: "/static/tabbar/massage.png",activeIcon: "/static/tabbar/active-massage.png",}, {index: 4,name: "我的",url: "/pages/src/user/user",icon: "/static/tabbar/user.png",activeIcon: "/static/tabbar/active-user.png",},]);// 页面跳转const toPageFun = (item) => {// 把当前点击索引更新到 tabbar.js 里面的 activeTab 状态数据tabbar.setActive(item.index);// 页面跳转uni.switchTab({url: item.url})}//图标的切换const getTabbarIcon = (item, index) => {return activeTab.value === index ? item.activeIcon : item.icon}
</script><style lang="scss" scoped>.u-page {padding: 0;&__item {&__title {color: $u-tips-color;background-color: $u-bg-color;padding: 15px 15px 5px 15px;font-size: 15px;&__slot-title {color: $u-primary;font-size: 14px;}}&__slot-icon {width: 17px;height: 17px;}}}
</style>

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

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

相关文章

软件测试之压力测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

日本IT工作内容---一篇梗概

日本IT工作现场是一个充满活力、技术导向且多元化的工作环境。以下是对日本IT工作内容的详细概述&#xff1a; 1. 软件开发&#xff08;Software Engineering, SE&#xff09; 主要任务&#xff1a;编写、测试和维护软件&#xff0c;以满足客户需求。这包括使用多种编程语言和…

HCIP--<OSPF2>

目录 一&#xff0c;OSPF的不规则区域 1&#xff09;远离骨干区域的非骨干区域 2&#xff09;不连续骨干区域(和上面一样) 二&#xff0c;OSPF数据库表 三。优化OSPF的LSA&#xff08;缺少LSA的更新量&#xff09; [1]手工汇总&#xff1a;减少骨干区域的LSA [2]特殊区域&…

编程新纪元:AI如何成为你的编程伙伴

随着人工智能技术的不断进步&#xff0c;我们正步入一个编程的新纪元。在这个时代&#xff0c;AI不仅仅是一个工具&#xff0c;更是程序员的伙伴。它通过提供智能辅助、自动化编码和增强开发效率&#xff0c;正在改变我们编写和理解代码的方式。本文将探讨AI如何成为程序员的得…

【关爱多系统萎缩患者】必知!这些维生素是健康守护神

亲爱的朋友们&#xff0c;今天我们来聊聊一个需要更多社会关爱与理解的群体——多系统萎缩&#xff08;MSA&#xff09;患者。面对这一复杂而罕见的疾病&#xff0c;科学合理的饮食调整&#xff0c;尤其是维生素的补充&#xff0c;显得尤为重要。让我们一起成为他们健康路上的温…

深入CSS 布局——WEB开发系列29

CSS 页面布局技术允许我们拾取网页中的元素&#xff0c;并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。 一、正常布局流&#xff08;Normal Flow&#xff09; CSS的布局基础是“正常流”&#xff0c;也就是页面元素在没有特别指定布局方式时的默认排列…

P5734 【深基6.例6】文字处理软件

1. string的函数 #include <bits/stdc.h> using namespace std; int main() {int n,m; cin >> n;string s, a, b, c;cin >> s;for (int i 0; i < n; i) {cin >> m;if (m 1) {cin >> a;s a;cout << s << endl;}if (m 2) {int …

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算…

Windows一键安装Mysql数据库|非官方复杂安装,解压即可,操作简单

我们都知道在官方安装mysql数据库极其复杂&#xff0c;还极大概率遇到各种问题&#xff0c;今天教大家只要解压就可安装完数据库&#xff0c;操作及其简单绿色。 版本包括了mysql8或mysql5&#xff0c;各位各取所需即可。 不管你之前是否安装过数据库&#xff0c;只要端口330…

Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计

文章目录 0. 前言1. 文件上传代码审计【有1处】1.1 可疑点1【无漏洞】1.1.1 直接搜索upload关键字1.1.2 选择第一个&#xff0c;点进去分析一下1.1.3 分析this.getFile()方法1.1.4 分析new MultipartRequest(request, uploadPath)1.1.5 分析isSafeFile()方法1.1.6 分析request.…

一款rust语言AI神器cursor在ubuntu环境下的安装启动教程

虽然cursor目前只支持英文但是它强大的代码联想能力以及问答能力&#xff0c;可以高效的提高编码效率。 如下步骤所有的前提是你的ubuntu上面已经安装了rust以及其必须的extensions。 1 下载 到官网https://www.cursor.com下载指定版本的软件。 下载到本地以后会生成如下软件…

Spring Cloud之二 微服务注册

1&#xff1a;Intellij 新建服务 user-service 2&#xff1a;pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"…

electron有关mac构建

针对 Mac M1/2/3 芯片的设备&#xff0c;proces.archarm64. 执行下面命令&#xff0c;检查下按照的 node.js 版本是不是 intel x64 指令集&#xff0c;如果是的话安装下 arm64 指令集的 node.js终端中执行以下命令&#xff1a;node -p process.arch 对应的node版本也是arm版 …

【一起学Rust | 进阶篇】使用Bon快速生成builder,提高代码质量

文章目录 前言一、安装Bon二、使用步骤1.为方法实现builder2.实现关联方法的builder3. 为结构体实现builder4. Option<T>字段成为可选项5. 实现Into转化 参考文档 前言 在 Rust 编程语言中&#xff0c;除了广为人知的单例模式之外&#xff0c;工厂模式也是极为容易见到的…

STM32的寄存器深度解析

目录 一、STM32 寄存器概述 二、寄存器的定义与作用 三、寄存器分类 1.内核寄存器 2.外设寄存器 四、重要寄存器详解 1.GPIO 相关寄存器 2.定时器相关寄存器 3.中断相关寄存器 4.RCC 相关寄存器 五、寄存器操作方法 1.直接操作寄存器 2.使用库函数操作寄存器 六…

C++_18_重载运算符

重载运算符 意义&#xff1a;使该类对象使用该运算符时 与 该运算符本意不同 就是 起别的作用了 范围 在 重载的那个类中起效 语法&#xff1a; 返回值类型 operator 运算符(形参列表) {函数体; }举例&#xff1a; 注意 &#xff1a; ​ 形参中 使用 & &#xff08;引用&…

JavaWeb中处理 Web 请求的方式总结

文章目录 JavaWeb中处理 Web 请求的方式总结1. 原始的 Servlet 方式1.1. 环境搭建**创建 Maven 或 Gradle 项目**&#xff1a;**添加 Servlet 依赖**&#xff1a;**创建 Servlet 类**&#xff1a;**配置项目**&#xff1a;**配置 Tomcat**&#xff1a; 1.2. 路由机制1.3. 示例代…

CPU调度算法之SJF(短作业优先)

摘要 CPU的短作业优先&#xff08;SJF, Shortest Job First&#xff09;任务调度算法是一种旨在提高系统响应速度和效率的调度策略。该算法通过优先执行预计运行时间最短的任务&#xff0c;从而减少平均等待时间&#xff0c;提高系统的整体吞吐量。虽然SJF算法在许多场景下表现…

《垃圾回收的算法与实现》-算法-摘抄

本文是书籍《垃圾回收的算法与实现》的摘抄&#xff0c;不涉及算法源码及步骤讲解模块。 预备 对象由头(header)和域(field)构成。 头&#xff1a;对象中保存对象本身信息的部分&#xff0c;主要含有以下信息&#xff1a;对象的大小和种类。 域&#xff1a;对象使用者在对象…

【Java毕业设计】基于SpringBoot+Vue+uniapp的农产品商城系统

文章目录 一、系统架构1、后端&#xff1a;SpringBoot、Mybatis2、前端&#xff1a;Vue、ElementUI4、小程序&#xff1a;uniapp3、数据库&#xff1a;MySQL 二、系统功能三、系统展示1、小程序2、后台管理系统 一、系统架构 1、后端&#xff1a;SpringBoot、Mybatis 2、前端…