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 导航栏样式调整+底部角标消息提示

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

  2. 【React -- 9/100】 抽离顶部导航栏 - [组件复用]

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

  3. 在React中使用 react-router-dom 编程式路由导航的正确姿势【含V5.x、V6.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(四)——顶部以及底部导航栏实现方式

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

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

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

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

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

  8. [RN] React Native 自定义导航栏随滚动渐变

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

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

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

随机推荐

  1. 《Unity3D 实战核心技术详解》书中关于矩阵的错误

    最近一直在学习实时渲染,不免要接触线性代数.而渲染中,一定会用到矩阵,当我再次去复习我之前看的书时,发现<Unity3D 实战核心技术详解>关于矩阵就有几处错误 ,特标注出来. 书的第一章 ...

  2. Docker国内镜像source

    现在使用docker的镜像大多基于几种基本Linux系统.虽然我不需要在容器李安装很多东西,但经常需要一些必要的工具,而基础镜像里并不包含,比如vim, ifconfig, curl等.考虑下载速度, ...

  3. 先打11.2.0.3.8这个PSU,后建库

    SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. SQL> select c ...

  4. centos 中查找文件、目录、内容

    1.查找文件 find / -name 'filename'12.查找目录 find / -name 'path' -type d13.查找内容 find . | xargs grep -ri 'co ...

  5. mysql分组用法

    --select num from 表 group by num --select num from 表 group by num,nid --特别的:group by 必须在where之后,orde ...

  6. k8s应用首页临时改成升级维护页面

    在本地虚拟机 产生一个nginx配置文件 [root@centos-01 dockerfile]# cat weifeng_maintain.conf server { listen 443; ser ...

  7. [WPF] VisualBrush 中的布局

    今天插一篇随笔.说一说上周五遇到的一个布局问题,问题大概是这样的:需要在一个快区域上添加一张透明的背景图片,由于区域较大.并且宽高都不是固定大小,图片较小 所以图片需要居中显示.除此之外还需要在图片的 ...

  8. Vue $emit()不触发方法的原因

    vue使用$emit时,父组件无法触发监听事件的原因是: $emit传入的事件名称只能使用小写,不能使用大写的驼峰规则命名

  9. 《Effective Java 第三版》目录汇总

    经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习.时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正. 第一章简介 忽略 第二章 创建和销毁对象 1. 考虑使用静态工厂方法替 ...

  10. v2ray和ss的安装资料整理

    v2ray: 1. https://yuan.ga/v2ray-complete-tutorial/ 2. https://toutyrater.github.io/ 推荐使用:v2ray,会比ss快 ...