Taro?React自定義TabBar使用useContext解決底部選中異常
TabBar 的選中狀態(tài)異常
在使用 Taro 進(jìn)行小程序開(kāi)發(fā)時(shí),底部 TabBar 是非常常見(jiàn)的頁(yè)面導(dǎo)航方式。然而,有時(shí)候我們可能會(huì)遇到一個(gè)問(wèn)題:底部 TabBar 的選中狀態(tài)異常,需要點(diǎn)擊兩次才能成功選中某個(gè)標(biāo)簽。本文將介紹如何使用 React 的 useContext 來(lái)解決這個(gè)問(wèn)題,同時(shí)結(jié)合 Taro 的自定義 TabBar 來(lái)實(shí)現(xiàn)正常的底部導(dǎo)航。
所用技術(shù)
Taro,React HooKs(useContext , createContext),@antmjs/vantui(這是UI組件)
解決方案:使用 React 的 useContext
在 Taro 中,我們可以使用 useContext 鉤子來(lái)創(chuàng)建和使用上下文。上下文能夠在組件之間共享數(shù)據(jù),這里我們將使用它來(lái)解決底部選中異常的問(wèn)題。
創(chuàng)建上下文對(duì)象,管理底部TabBar選中狀態(tài)
// UserContext.js
import { createContext } from 'react';
const UserContext = createContext();
export default UserContext;useContext 創(chuàng)建上下文
在應(yīng)用的入口文件app.js中,我們將使用 useContext 創(chuàng)建上下文,并將底部 TabBar 的選中狀態(tài)放入上下文中。
// 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
現(xiàn)在,我們可以在任何組件中使用 useContext 來(lái)獲取和設(shè)置選中狀態(tài)。那么下面我們來(lái)創(chuàng)建一個(gè)自定義組件TabBar
首先在app.config.js 這樣配置 主要是tabBar中的custom要為true隱藏默認(rèn)的Tabbar 也是為了后續(xù)跳轉(zhuǎn)做準(zhǔn)備
//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: "主頁(yè)",
},
{
pagePath: "pages/classification/index",
text: "分類",
},
{
pagePath: "pages/shoppingCart/index",
text: "購(gòu)物車",
},
{
pagePath: "pages/user/index",
text: "我的",
},
],
},
window: {
backgroundTextStyle: "light",
navigationBarBackgroundColor: "#fff",
navigationBarTitleText: "WeChat",
navigationBarTextStyle: "black",
},
});創(chuàng)建custom-tab-bar文件夾
然后在Src目錄下創(chuàng)建 一個(gè)文件名為 custom-tab-bar 的文件夾 然后在文件夾里創(chuàng)建一個(gè)index.js 的文件 小程序會(huì)自動(dòng)獲取到此文件夾的index.js文件然后渲染到頁(yè)面上
// 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: '首頁(yè)',
url: 'pages/index/index',
},
{
id: 1,
icon: 'qr',
text: '分類',
url: 'pages/classification/indexe',
},
{
id: 2,
icon: 'shopping-cart-o',
text: '購(gòu)物車',
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>
)
}通過(guò)使用 useContext,我們可以將選中狀態(tài)在不同的組件之間共享,從而解決底部選中異常問(wèn)題。這樣,點(diǎn)擊底部標(biāo)簽時(shí)就可以正常切換選中狀態(tài)了。
總結(jié)
使用 Taro React,我們可以使用 useContext 鉤子來(lái)解決底部 TabBar 選中異常的問(wèn)題。通過(guò)創(chuàng)建上下文并共享選中狀態(tài),我們可以實(shí)現(xiàn)正常的底部導(dǎo)航,提供更好的用戶體驗(yàn)。
希望本文能夠幫助你解決底部選中異常問(wèn)題,并在 Taro 小程序開(kāi)發(fā)中有更流暢的導(dǎo)航體驗(yàn)。
以上就是Taro React自定義TabBar使用useContext解決底部選中異常的詳細(xì)內(nèi)容,更多關(guān)于React useContext底部選中的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react結(jié)合typescript?封裝組件實(shí)例詳解
這篇文章主要為大家介紹了react結(jié)合typescript?封裝組件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
React?useEffect不支持async?function示例分析
這篇文章主要為大家介紹了React?useEffect不支持async?function示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
每天一個(gè)hooks學(xué)習(xí)之useUnmount
這篇文章主要為大家介紹了每天一個(gè)hooks學(xué)習(xí)之useUnmount,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
React Native使用Modal自定義分享界面的示例代碼
本篇文章主要介紹了React Native使用Modal自定義分享界面的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
在React中實(shí)現(xiàn)子組件向父組件傳值的幾種方法
在React應(yīng)用中,組件間的通信是常見(jiàn)的需求,通常,父組件通過(guò)props向子組件傳遞數(shù)據(jù),但有時(shí)也需要子組件向父組件傳遞數(shù)據(jù),本文將探討如何在React中實(shí)現(xiàn)子組件向父組件傳值的幾種方法,需要的朋友可以參考下2025-04-04
Remix路由模塊輸出對(duì)象loader函數(shù)詳解
這篇文章主要為大家介紹了Remix路由模塊輸出對(duì)象loader函數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-04-04

