react 路由导航栏 withRouter

时间:2022-11-08 23:33:29

codesandbox https://codesandbox.io/s/9l6prnyxjy

app.js

import React, { Component, Fragment } from "react";
import {
AppBar,
Button,
Tabs,
Tab,
Icon,
Typography,
Fade,
Slide
} from "@material-ui/core";
import _ from "lodash";
import {
BrowserRouter,
HashRouter,
Link,
Redirect,
Route,
Switch,
withRouter
} from "react-router-dom"; const l = console.log; let Home = props => {
return (
<Fragment>
<Typography variant="headline">首页</Typography>
</Fragment>
);
};
let About = props => {
return (
<Fragment>
<Typography variant="headline">关于</Typography>
</Fragment>
);
}; let Mine = props => {
return (
<Fragment>
<Typography variant="headline">我的</Typography>
</Fragment>
);
}; @withRouter
class Tabbars extends Component {
state = {
tabs: [
{
label: "home",
to: "/home",
icon: "home"
},
{
label: "about",
icon: "supervised_user_circle",
to: "/about"
},
{
label: "mine",
icon: "perm_identity",
to: "/mine"
}
],
value: 0
};
handleChange = (event, value) => {
this.setState({ value });
};
toNav = to => e => {
this.props.history.push(to);
}; componentWillMount() {
// l(this.props)
let { location, history } = this.props; // 确保用户在浏览器改变路由,激活按钮发生变化
this.changeTabbarValue(location.pathname); // 监听路由的变化,主要用于重定向时确保激活按钮发生变化
history.listen(({ pathname }, action) => {
l("router change");
// action === "REPLACE" &&
this.changeTabbarValue(pathname);
});
} changeTabbarValue(pathname) {
let i = this.state.tabs.findIndex(({ to }) => to.includes(pathname));
if (i < 0) {
return l("没找到根路由");
}
i !== this.state.value &&
this.setState({
value: i
});
} componentDidMount() {
document.title = "Ajanuw";
} render() {
return (
<AppBar position="static" color="default">
<Tabs
value={this.state.value}
onChange={this.handleChange}
indicatorColor="primary"
textColor="primary"
fullWidth
>
{this.state.tabs.map(($_, index) => {
return (
<Tab
label={$_.label}
key={index}
onClick={this.toNav($_.to)}
icon={<Icon>{$_.icon}</Icon>}
/>
);
})}
</Tabs>
</AppBar>
);
}
} // Tabbars = withRouter(Tabbars) class App extends Component {
render() {
return (
<BrowserRouter>
<Fragment>
<Tabbars />
{/* 路由中有重定向, 加入动画效果可能会报错 */}
<Switch>
{/* <Route
exact
strict
path="/"
render={props => true && (<Redirect to='/home'/>)}
/> */}
{/* <Redirect exact from='/' to='/home'/> */}
<Redirect from="/" to="/home" exact strict />
<Route
exact
strict
path="/home"
render={props => <Home {...props} />}
/>
<Route path="/about" component={About} />
<Route path="/mine" component={Mine} />
<Route
render={() => {
return <div>404</div>;
}}
/>
</Switch>
</Fragment>
</BrowserRouter>
);
}
} export default App;

index.js

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import CssBaseline from "@material-ui/core/CssBaseline";
import { createMuiTheme, MuiThemeProvider } from "@material-ui/core/styles";
import { pink, blue } from "@material-ui/core/colors"; // 自定义主题
const theme = createMuiTheme({
palette: {
primary: blue,
secondary: pink
}
}); ReactDOM.render(
<React.Fragment>
<CssBaseline />
<MuiThemeProvider theme={theme}>
<App />
</MuiThemeProvider>
</React.Fragment>,
document.getElementById("root")
);

react 路由导航栏 withRouter的更多相关文章

  1. React Navigation 导航栏样式调整&plus;底部角标消息提示

    五一佳节匆匆而过,有人选择在外面看人山人海,有人选择宅在家中度过五一,也有人依然坚守在第一线,致敬! 这是坚持学习react-native的第二篇文章,可能会迟到,但是绝不会缺席,这篇要涉及到的是re ...

  2. 【React -- 9&sol;100】 抽离顶部导航栏 - &lbrack;组件复用&rsqb;

    今天写的页面中需要重复使用到顶部导航栏,所以把顶部导航栏抽离出来 考虑复用组件的健壮性,使用PropTypes校验,可以自定义一个click事件 JSX import React from &quot ...

  3. 在React中使用 react-router-dom 编程式路由导航的正确姿势【含V5&period;x、V6&period;x】

    ## react-router-dom 编程式路由导航 (v5) ###### 1.push跳转+携带params参数 ```jsx props.history.push(`/b/child1/${i ...

  4. element-ui使用导航栏跳转路由用法

    element-ui使用导航栏跳转路由用法 最近初学vue,试着做一个小项目熟悉语法与思想,其中使用elemen-ui的导航栏做路由跳转切换页面.下面记录一下学习过程 element-ui引入vue项 ...

  5. React Native&lpar;四&rpar;——顶部以及底部导航栏实现方式

    效果图: 一步一步慢慢来: 其实刚入手做app的时候,就应该做出简单的顶部以及底部导航栏.无奈又在忙其他事情,导致这些现在才整理出来. 1.顶部导航栏:react-native-scrollable- ...

  6. elementUI的导航栏怎么根据路由默认选中相关项

    1. <el-menu :default-active="this.$route.path.substr(1)" class="left-nav"> ...

  7. vue&plus;el-menu实现路由刷新和导航栏菜单状态保持(局部刷新页面)

    一.菜单项激活状态保持 有时,我们在项目中会有这样一个需求,即实现 一个侧导航栏,点击不同的菜单项,右边内容会跟着变化,而页面手动刷新后想要使菜单激活状态保持,那么这个功能该如何实现呢? 现在给出以下 ...

  8. &lbrack;RN&rsqb; React Native 自定义导航栏随滚动渐变

    React Native 自定义导航栏随滚动渐变 实现效果预览: 代码实现: 1.定义导航栏 NavPage.js import React, {Component} from 'react'; im ...

  9. React实现顶部固定滑动式导航栏(导航条下拉一定像素时显示原导航栏样式)

    摘要 基于react的框架开发一个顶部固定滑动式的酷炫导航栏,当导航栏置顶时,导航栏沉浸在背景图片里:当鼠标滑动滚轮时,导航栏固定滑动并展示下拉样式. JS部分 相关技术栈:react.antd.re ...

随机推荐

  1. 对于Eclipse的正确用法

    有时候我们刚刚修改了工程里的文件 但是启动的时候它硬是说你有东西没有声明 而那个东西又明明在那里.. 这时候我们可以认为实际与它调用的工程关系文件(我假想的) 不同步.. 我们可以通过clean功能来 ...

  2. PAT &lpar;Basic Level&rpar; Practise:1018&period; 锤子剪刀布

    [题目链接] 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行 ...

  3. python 初学之账户登录

    要求: 输入用户名密码正确,提示登录成功, 输入三次密码错误,锁定账户. 开始: 使用两个文件: 密码账户文件 文件格式: jason    23456 tom       56789 tang   ...

  4. SpringMVC注解&commat;Component、&commat;Repository、&commat;Service、&commat;Controller区别

    SpringMVC中四个基本注解: @Component.@Repository   @Service.@Controller 看字面含义,很容易却别出其中三个: @Controller   控制层, ...

  5. mongoDB 集合(表)操作

    mongoDB 集合(表)操作 集合命名规则 使用 utf8 字符(通常不会起中文名字) 不能含有 "\0" 字符 不要以 system. 开头(否咋会覆盖系统集合开头) 不要和关 ...

  6. http连接基础类,负责底层的http通信

    /// <summary> /// http连接基础类,负责底层的http通信 /// </summary> public class HttpService { public ...

  7. JMter随记

    线程组( Threads (Users))理解:一个虚拟用户组,线程组内线程数量在运行过程中不会发生改变. 注意事项:线程间变量相互独立. 一个测试计划内可以包含多个线程组. 可定义内容: 取样器错误 ...

  8. Type curtilage home

    This year's National Day coincides with the Mid-Autumn festival, the double false merger about eight ...

  9. DBUtils工具类

    import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql. ...

  10. jooq实践

    用法 sql语句 SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*) FROM AUTHOR JOIN BOOK ON AUTHOR.ID = B ...