Taro + vue3 + js + nutUI 框架中自定义tabbar的组件封装以及页面跳转的逻辑

这篇具有很好参考价值的文章主要介绍了Taro + vue3 + js + nutUI 框架中自定义tabbar的组件封装以及页面跳转的逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.需求:

  在H5 中需要封装一个自定义的tabbar 菜单跳转 通过nut-ui 进行二次封装

2. 注意点

  H5 中原生的tabbar 在ios 中会出现问题 所以进行 封装tabbar

3. 代码操作


首先全部的代码 

<template>
    <nut-tabbar v-model="selected" class="tabbar-container" size="18px" @tab-switch="handleClick">
        <nut-tabbar-item :tab-title="item.title" :value="item.value" v-for="(item, index) in tabList" :key="index">
            <template #icon="props" style="position: relative">
                <img v-if="props.active" :src="item.activeImg" />
                <img v-else :src="item.img" />
            </template>
        </nut-tabbar-item>
    </nut-tabbar>
</template>
<script setup lang="ts">
import { storeToRefs } from "pinia";
import { reactive, onMounted, watch } from "vue";
import { useTabbarStore, useUserStore } from "../../store";
import Taro, { eventCenter } from "@tarojs/taro";
const tabbarStore = useTabbarStore();
const userStore = useUserStore();
const { selected, bottomDistance } = storeToRefs(tabbarStore);
const router = Taro.useRouter();

type menu = {
    name: string;
    title: string;
    pagePath: string;
    img: any;
    activeImg: any;
    value: number;
};
watch(selected, (newValue) => {
    // Taro.setStorageSync("selectedTab", newValue);
    tabbarStore.setSelected(newValue)
});
onMounted(() => {
    tabbarStore.setSelected(Taro.getStorageSync("selectedTab") || 0)
    eventCenter.once(router.onReady, () => {
        getTabbarHeight();
    });
});
const getTabbarHeight = () => {
    const query = Taro.createSelectorQuery()
        .select(".tabbar-container")
        .boundingClientRect();
    query.selectViewport();
    query.exec(function (res) {
        if (res[0]) {
            console.log(res);

            const height = res[0].height;
            tabbarStore.setTabbarHeight(height);
        }
    });
};
const tabList = reactive<menu[]>([
    {
        name: "home",
        title: "购票",
        pagePath: "/pages/index/index",
        img: require("../../assets/tabbar/2/3.png"),
        activeImg: require("../../assets/tabbar/1/3.png"),
        value: 0,
    },
    // {
    //     name: "action",
    //     title: "订单",
    //     pagePath: "/pages/order/index",
    //     img: require("../../assets/tabbar/2/5.png"),
    //     activeImg: require("../../assets/tabbar/1/5.png"),
    //     value: 0,
    // },
    {
        name: "report",
        title: "我的",
        pagePath: "/pages/my/index",
        img: require("../../assets/tabbar/2/4.png"),
        activeImg: require("../../assets/tabbar/1/4.png"),
        value: 0,
    },

]);
const handleClick = (item, index: number) => {
    let url = tabList[index].pagePath;

    const pages = Taro.getCurrentPages()
    const currentPage = pages[pages.length - 1]
    if (currentPage.route !== url) {
        handleToPath(url);

    }


};
const handleToPath = (url) => {
    Taro.switchTab({
        url: url,
    });
};
</script>
<style lang="scss">
@import "./customTabBar.scss";
</style>

4.解析

tabList: 菜单的内容数组  根据自己菜单的数量 来决定

const tabList = reactive<menu[]>([

    {

        name: "home",

        title: "购票",

        pagePath: "/pages/index/index",

        img: require("../../assets/tabbar/2/3.png"),

        activeImg: require("../../assets/tabbar/1/3.png"),

        value: 0,

    },

    // {

    //     name: "action",

    //     title: "订单",

    //     pagePath: "/pages/order/index",

    //     img: require("../../assets/tabbar/2/5.png"),

    //     activeImg: require("../../assets/tabbar/1/5.png"),

    //     value: 0,

    // },

    {

        name: "report",

        title: "我的",

        pagePath: "/pages/my/index",

        img: require("../../assets/tabbar/2/4.png"),

        activeImg: require("../../assets/tabbar/1/4.png"),

        value: 0,

    },

]);、

跳转逻辑文章来源地址https://www.toymoban.com/news/detail-854208.html

const handleClick = (item, index: number) => {

    let url = tabList[index].pagePath;



    const pages = Taro.getCurrentPages()

    const currentPage = pages[pages.length - 1]

    if (currentPage.route !== url) {

        handleToPath(url);



    }




};

const handleToPath = (url) => {

    Taro.switchTab({

        url: url,

    });

};

// const pages = Taro.getCurrentPages()

    const currentPage = pages[pages.length - 1]

    if (currentPage.route !== url) {

        handleToPath(url);



    } 当前页面如果是当前的菜单 那么判断一下 根据页面的Api 查找当前的页面路径 当页面不存在 才跳转 这是优化问题

到了这里,关于Taro + vue3 + js + nutUI 框架中自定义tabbar的组件封装以及页面跳转的逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • taro.js和nutui实现商品选择页面

    1. 首先安装 Taro.js 和 NutUI: ``` npm install -g @tarojs/cli npm install taro-ui ``` 2. 创建 Taro 项目并进入项目目录: ``` taro init myapp cd myapp ``` 3. 选用 Taro 模板一并安装依赖: ``` npm install ``` 4. 在页面目录中创建商品选择页: ``` taro create --name goods --type page ``` 5. 在 `goods.jsx`中导入并使用

    2024年02月11日
    浏览(44)
  • Vue中自定义.js变量

    order.js文件内容: // 订单是否报账 const EXPENESS_STATUS_NO=0; const EXPENESS_STATUS_YES=1; // 状态 0-未发货 1-发货 2-确认收获 const STATUS_NO=0; const STATUS_SEND=1; const STATUS_DELIVERY=2; //  如何不加这个,vue中引入不进来变量值 export {     EXPENESS_STATUS_NO,     EXPENESS_STATUS_YES,     STATUS_NO,     STAT

    2024年02月13日
    浏览(40)
  • Taro + vue3 实现自定义返回栏

    算是一个简单的返回页面  主要是这里 Taro +vue3 的页面结构还有一个 

    2024年04月29日
    浏览(44)
  • taro之--微信自定义tabbar

    Taro 支持使用 React、Vue、或者小程序原生语法来编写小程序自定义 TabBar 组件。 微信小程序自定义 TabBar(React) 微信小程序自定义 TabBar(Vue3) 配置方法和微信小程序相同,开发前请仔细阅读 《微信小程序自定义 TabBar 文档》。 配置信息 在 app.config 中按正常填写 tabBar 项 的

    2024年02月09日
    浏览(35)
  • taro+vue3 搭建一套框架,适用于微信小程序和H5

    安装 Taro。可以在终端输入以下命令进行安装: 创建项目。使用以下命令创建 Taro+Vue3 项目: 其中,myApp 是项目名称。 进入项目并启动。使用以下命令进入项目并启动: 注意,需要先进入对应的目录再启动。 编写代码。在 src 目录下编写代码,可以像使用 Vue 开发 Web 应用程

    2024年02月10日
    浏览(58)
  • 在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果

    backdrop-filter: blur(10px); 这一行代码表示将背景进行模糊处理,模糊程度为10像素。这会导致背景内容在这个元素后面呈现模糊效果。 background-color: rgb(255 255 255 / .32); 这一行代码表示设置元素的背景颜色为白色(RGB值为0, 0, 0),并且通过/符号后面的透明度值(32%不透明度)使背

    2024年04月09日
    浏览(50)
  • uniapp使用vue3和ts开发小程序自定义tab栏,实现自定义凸出tabbar效果

    要实现自定义的tabbar效果,可以使用自定义tab覆盖主tab来实现,当程序启动或者从后台显示在前台时隐藏自带的tab来实现。自定义一个tab组件,然后在里面实现自定义的逻辑。 组件中所使用的组件api可以看:Tabbar 底部导航栏 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-

    2024年02月04日
    浏览(44)
  • 使用 NutUI 搭建「自定义业务风格」的组件库 | 京东云技术团队

    作者:京东零售 佟恩 本文介绍,如何使用 NutUI 组件库,搭建一套为专属业务风格的业务组件库。 NutUI 是一款京东风格的移动端组件库。NutUI 目前支持 Vue 和 React技术栈,支持Taro多端适配。 一般组件库,都会给用户提供修改主题的方式。比如在 NutUI 组件库中,给用户提供了

    2024年02月03日
    浏览(64)
  • # vue3 vant4 Tabbar 标签栏组件的封装 和Popup弹出层的封装

    需求如上,标签栏里第三个是图片,整个项目有两种场景, 标签栏正常跳转页面, 标签拦渲染别的图片时候,点击就是打开弹出层, 封装了标签栏,弹出层两部分,作为公共组件 标签栏的封装 徽标样式需要调整,list现在是自己暂时再state里写的假数据 下面是再使用标签组

    2024年01月20日
    浏览(67)
  • vue3笔记:自定义组件

    自定义组件,举个🌰: 1、封装自定义组件 CustomList.vue src 底下 type 文件夹中声明的 interface 接口文件 2、在 App.vue 中使用自定义组件 CustomList.vue 1、全局注册 在 main.ts 中使用 app.component(\\\'MyComponent\\\', MyComponent) 全局注册一个组件,可以在app内的任何地方使用。 缺点: 无法在生产打

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包