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;
相关推荐
canonical_entropy27 分钟前
下一代低代码渲染框架 nop-chaos-flux 的设计原则
前端·低代码·前端框架
东方小月36 分钟前
5分钟搞懂Harness Engineering(驾驭工程):从提示词到AI Agent的进化之路
前端·后端·架构
我叫黑大帅39 分钟前
为什么需要 @types/react?解决“无法找到模块 react 的声明文件”报错
前端·javascript·面试
之歆1 小时前
DAY_21JavaScript 深度解析:数组(Array)与函数(Function)(一)
前端·javascript
XinZong2 小时前
【AI社交】基于OpenClaw自研轻量化AI社交平台实战
前端
Le_ee2 小时前
ctfweb:php/php短标签/.haccess+图片马/XXE
开发语言·前端·php
爱上好庆祝2 小时前
学习js的第七天(wed APIs的开始)
前端·javascript·css·学习·html·css3
KaMeidebaby3 小时前
卡梅德生物技术快报|冻干工艺开发:注射用心肌肽全流程参数优化与工程化方案
前端·其他·百度·新浪微博
ooseabiscuit3 小时前
Laravel6.x核心优化与特性全解析
android·开发语言·javascript
哆啦A梦15884 小时前
20, Springboot3+vue3实现前台轮播图和详情页的设计
javascript·数据库·spring boot·mybatis·vue3