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;