React TabBar切换与高亮实现

TabBar切换和高亮

渲染 TabBar.Item

js 复制代码
// TabBar 数据
const tabItems = [
  {
    title: "首页",
    icon: "icon-ind",
    path: "/home",
  },
  {
    title: "找房",
    icon: "icon-findHouse",
    path: "/home/list",
  },
  {
    title: "资讯",
    icon: "icon-infom",
    path: "/home/news",
  },
  {
    title: "我的",
    icon: "icon-my",
    path: "/home/profile",
  },
];
js 复制代码
// 渲染 TabBar.Item
  renderTabBarItem() {
    return tabItems.map((item) => (
      <TabBar.Item
        title={item.title}
        key={item.title}
        // 默认图标
        icon={<i className={`iconfont ${item.icon}`} />}
        // 选中图标
        selectedIcon={<i className={`iconfont ${item.icon}`} />}
        // 是否选中
        selected={this.state.selectedTab === item.path}
        // 点击菜单项时,进行路由切换
        onPress={() => {
          this.setState({
            selectedTab: item.path,
          });

          // 路由切换
          this.props.history.push(item.path);
        }}
      />
    ));
  }

内容通过路由来实现切换渲染

noRenderContent={true}

exact 是 React Router 中 Route 组件的一个属性。

功能: 精确匹配路由路径。

exact 属性存在时,只有当访问的路径与 /home 完全匹配时,才会渲染 [Index](javascript:void(0)) 组件。如果没有 exact,访问 /home/news/home/list 等路径时,也会匹配到 /home 路由并渲染 Index 组件。

js 复制代码
render() {
    // console.log(this.props.location.pathname)
    return (
      <div className="home">
        {/* 2.3 渲染子路由 */}
        <Route path="/home/news" component={News} />
        <Route exact path="/home" component={Index} />
        <Route path="/home/list" component={HouseList} />
        <Route path="/home/profile" component={Profile} />
        {/* TabBar */}

        <TabBar tintColor="#21b97a" noRenderContent={true} barTintColor="white">
          {this.renderTabBarItem()}
        </TabBar>
      </div>
    );
  }

思路:在 路由切换 时,也执行 菜单高亮 的逻辑代码

1 添加 componentDidUpdate 钩子函数

2 在钩子函数中判断路由地址是否切换(因为路由的信息是通过 props 传递给组件的,所以,通过比较更新前后的两个props)

3 在路由地址切换时,让 菜单高亮

js 复制代码
// 组件接收到新的props(此处,实际上是路由信息)就会触发该钩子函数
  componentDidUpdate(prevProps) {
    // prevProps 上一次的props,此处也就是上一次的路由信息
    // this.props 当前最新的props,此处也就是最新的路由信息
    // 注意:在该钩子函数中更新状态时,一定要在 条件判断 中进行,否则会造成递归更新的问题
    if (prevProps.location.pathname !== this.props.location.pathname) {
      // 此时,就说明路由发生切换了
      this.setState({
        selectedTab: this.props.location.pathname,
      });
    }
  }

默认选中的TabBar菜单项

js 复制代码
state = {
    // 默认选中的TabBar菜单项
    selectedTab: this.props.location.pathname,
  };

是否选中

js 复制代码
selected={this.state.selectedTab === item.path}

点击菜单项时,进行路由切换

js 复制代码
onPress={() => {
          this.setState({
            selectedTab: item.path,
          });

          // 路由切换
          this.props.history.push(item.path);
        }}

首页路由处理

js 复制代码
import React from "react";
import { BrowserRouter as Router, Route, Redirect } from "react-router-dom";
import Home from "./pages/Home";
import CityList from "./pages/CityList";

function App() {
  return (
    <Router>
      <div className="App">
        <Route
          path="/"
          exact
          render={() => <Redirect to="/home" />}
        />
        <Route path="/home" component={Home} />
        <Route path="/city" component={CityList} />
      </div>
    </Router>
  );
}

export default App;
相关推荐
木斯佳38 分钟前
前端八股文面经大全:携程前端一面(2026-04-17)·面经深度解析
前端·状态模式
2301_7990730239 分钟前
基于 Next.js + 火山引擎 AI 的电商素材智能生成工具实战——字节跳动前端训练营成果
javascript·人工智能·火山引擎
Java后端的Ai之路43 分钟前
LangChain ReAct Agent 核心技术问答
前端·react.js·langchain
码喽7号1 小时前
Vue学习七:MockJs前端数据模拟
前端·vue.js·学习
NotFound4862 小时前
探究分享从对话到执行:OpenTiny NEXT 如何重塑前端智能化开发范式
前端
小满zs2 小时前
Next.js精通SEO第二章(robots.txt + sitemap.xml)
前端·seo
kyriewen2 小时前
你的首屏慢得像蜗牛?这6招让页面“秒开”
前端·面试·性能优化
算是难了3 小时前
Nestjs学习总结_3
前端·typescript·node.js
yogalin19933 小时前
如何实现一个简化的响应式系统
前端