Taro React自定义TabBar使用useContext解决底部选中异常

 更新时间:2023年08月31日 11:57:52   作者:故意避开  
这篇文章主要为大家介绍了Taro React底部自定义TabBar使用React useContext解决底部选中异常(需要点两次才能选中的问题)示例详解,有需要的朋友可以借鉴参考下

TabBar 的选中状态异常

在使用 Taro 进行小程序开发时,底部 TabBar 是非常常见的页面导航方式。然而,有时候我们可能会遇到一个问题:底部 TabBar 的选中状态异常,需要点击两次才能成功选中某个标签。本文将介绍如何使用 React 的 useContext 来解决这个问题,同时结合 Taro 的自定义 TabBar 来实现正常的底部导航。

所用技术

Taro,React HooKs(useContext  , createContext),@antmjs/vantui(这是UI组件)

解决方案:使用 React 的 useContext

在 Taro 中,我们可以使用 useContext 钩子来创建和使用上下文。上下文能够在组件之间共享数据,这里我们将使用它来解决底部选中异常的问题。

创建上下文对象,管理底部TabBar选中状态

// UserContext.js
import { createContext } from 'react';
const UserContext = createContext();
export default UserContext;

useContext 创建上下文

在应用的入口文件app.js中,我们将使用 useContext 创建上下文,并将底部 TabBar 的选中状态放入上下文中。

// app.js
import { useState } from 'react';
import Taro, { createContext, Provider } from '@tarojs/taro';
import './app.scss';
import UserContext from './UserContext';
function App({ children }) {
  const [selectedTab, setSelectedTab] = useState(0);
  return (
    <UserContext.Provider value={{ selectedTab, setSelectedTab }}>
      {children}
    </UserContext.Provider>
  );
}
export default App;

自定义组件TabBar

现在,我们可以在任何组件中使用 useContext 来获取和设置选中状态。那么下面我们来创建一个自定义组件TabBar

首先在app.config.js 这样配置 主要是tabBar中的custom要为true隐藏默认的Tabbar 也是为了后续跳转做准备

//app.config.js 
export default defineAppConfig({
  pages: [
    "pages/index/index",
    "pages/classification/index",
    "pages/shoppingCart/index",
    "pages/user/index",
  ],
  tabBar: {
    custom: true,
    list: [
      {
        pagePath: "pages/index/index",
        text: "主页",
      },
      {
        pagePath: "pages/classification/index",
        text: "分类",
      },
      {
        pagePath: "pages/shoppingCart/index",
        text: "购物车",
      },
      {
        pagePath: "pages/user/index",
        text: "我的",
      },
    ],
  },
  window: {
    backgroundTextStyle: "light",
    navigationBarBackgroundColor: "#fff",
    navigationBarTitleText: "WeChat",
    navigationBarTextStyle: "black",
  },
});

创建custom-tab-bar文件夹

然后在Src目录下创建 一个文件名为 custom-tab-bar 的文件夹 然后在文件夹里创建一个index.js 的文件 小程序会自动获取到此文件夹的index.js文件然后渲染到页面上

// custom-tab-bar/index.js
import { Tabbar, TabbarItem } from '@antmjs/vantui'
import Taro from '@tarojs/taro'
import React, { useEffect, useRef, useState } from 'react'
import { useContext } from 'react';
import UserContext from '../component/UserContext';
export default function index() {
    const { selectedTab, setSelectedTab} = useContext(UserContext);
    const [tabData, setTabData] = useState({
        list: [
            {
                id: 0,
                icon: 'home-o',
                text: '首页',
                url: 'pages/index/index',
            },
            {
                id: 1,
                icon: 'qr',
                text: '分类',
                url: 'pages/classification/indexe',
            },
            {
                id: 2,
                icon: 'shopping-cart-o',
                text: '购物车',
                url: 'pages/shoppingCart/index',
            },
            {
                id: 3,
                icon: 'manager-o',
                text: '我的',
                url: 'pages/user/index',
            },
        ]
    })
    const onChange = (e) => {
        setSelectedTab(e.detail)
        if (e.detail == 0) {
            Taro.switchTab({
                url: '/pages/index/index'
            })
        } else if (e.detail == 1) {
            Taro.switchTab({
                url: '/pages/classification/index'
            })
        } else if (e.detail == 2) {
            Taro.switchTab({
                url: '/pages/shoppingCart/index'
            })
        } else if (e.detail == 3) {
            Taro.switchTab({
                url: '/pages/user/index'
            })
        }
    }
    return (
        <Tabbar active={selectedTab} onChange={onChange}>
            {tabData.list.map(Item => {
                return <TabbarItem key={Item.id} icon={Item.icon}>
                    {Item.text}
                </TabbarItem>
            })}
        </Tabbar>
    )
}

通过使用 useContext,我们可以将选中状态在不同的组件之间共享,从而解决底部选中异常问题。这样,点击底部标签时就可以正常切换选中状态了。

总结

使用 Taro React,我们可以使用 useContext 钩子来解决底部 TabBar 选中异常的问题。通过创建上下文并共享选中状态,我们可以实现正常的底部导航,提供更好的用户体验。

希望本文能够帮助你解决底部选中异常问题,并在 Taro 小程序开发中有更流畅的导航体验。

以上就是Taro React自定义TabBar使用useContext解决底部选中异常的详细内容,更多关于React useContext底部选中的资料请关注脚本之家其它相关文章!

相关文章

  • React使用fullpage.js实现整屏翻页功能

    React使用fullpage.js实现整屏翻页功能

    最近笔者在完成一个移动端小项目的过程中需要实现整屏翻页的效果;调研完毕之后,最终决定使用pullPage.js实现此功能,fullPage.js使用起来比较方便,并且官网上也给了在react项目中使用的demo,本文记录了这个第三方库的使用过程,感兴趣的朋友可以参考下
    2023-11-11
  • 简析React Native startReactApplication 方法

    简析React Native startReactApplication 方法

    这篇文章主要介绍了React Native startReactApplication 方法简析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • React 正确使用useCallback useMemo的方式

    React 正确使用useCallback useMemo的方式

    这篇文章主要介绍了React 正确使用useCallback useMemo的方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • react自适应布局px转rem实现示例详解

    react自适应布局px转rem实现示例详解

    这篇文章主要为大家介绍了react自适应布局px转rem实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • React利用props的children实现插槽功能

    React利用props的children实现插槽功能

    React中并没有vue中的 slot 插槽概念 不过 可以通过props.children 实现类似功能,本文为大家整理了实现的具体方,需要的可以参考一下
    2023-07-07
  • react之组件通信详解

    react之组件通信详解

    本篇文章主要介绍了React组件通信详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-10-10
  • GraphQL在react中的应用示例详解

    GraphQL在react中的应用示例详解

    这篇文章主要为大家介绍了GraphQL在react中的应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 解决React报错Cannot assign to 'current' because it is a read-only property

    解决React报错Cannot assign to 'current'

    这篇文章主要为大家介绍了React报错Cannot assign to 'current' because it is a read-only property的解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • react性能优化达到最大化的方法 immutable.js使用的必要性

    react性能优化达到最大化的方法 immutable.js使用的必要性

    这篇文章主要为大家详细介绍了react性能优化达到最大化的方法,一步一步优化react性能的过程,告诉大家使用immutable.js的必要性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • webpack入门+react环境配置

    webpack入门+react环境配置

    webpack是一个前端资源模块化管理和打包工具,说白了就是方便我们管理自己的常用的一些代码,比如你开发中用到sass以及jade同时用到es6,开发时你不可能改动某个地方就挨个命令去转换再到浏览器去看效果,那样效率是非常低的。所以webpack帮我们省去了那些多余的步骤。
    2017-02-02

最新评论