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. ESP8266 NOOS SDK libat.a Functions

    at_baseCmd.o custom_infoat_baseCmd.o at_exeCmdNullat_baseCmd.o at_setupCmdEat_baseCmd.o at_exeCmdRst ...

  2. 与临时对象的斗争(上)ZZ

    C++ 是一门以效率见长的语言(虽然近来越来越多的人“不齿”谈及效率,我深以为不然,在某一次的程序编写中不对效率锱铢必较并不意味意味着我们就不应该追求更多的更好的做法).总之吧,相比起其它语言,程序员 ...

  3. ECharts JS应用:图表页面实现

    因为要统计数据进行图表展示,所以就简单学习了 ECharts JS 的应用.它是一个纯Javascript图库,它依赖于一个轻量级的Canvas库 ZRender,并提供直观.生动.交互式和高度可定制 ...

  4. Win10系统的SurfacePro4无法修改启动顺序怎么办

    必须要把底部的开关关闭,否则启动顺序无法修改      

  5. linux 杀死进程

    列车进程 ps -ef 杀死进程 - 后面是pid kill 1234356

  6. Linux下修改Mysql的用户(root)的密码的俩种方法

     from:https://www.cnblogs.com/daizhuacai/archive/2013/01/17/2865138.html   修改的用户都以root为列.一.拥有原来的myql ...

  7. 分析轮子(六)- LinkedList.java

    注:玩的是JDK1.7版本 一:先上类的继承结构图 二:再看一下他的底层实现数据结构 三:然后从源码中找点好玩的东西 1)双向链表的结构构成元素,头指针.尾指针.节点信息(前向指针.后向指针.节点信息 ...

  8. Linux驱动面试题

    1. Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备. 字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种 ...

  9. 性能测试相关(TPS/RT/PV等)(转)

    对于我们开发来说,我们日常最熟悉的工作就是把客户的需求实现并交付.但是,事情并不是往往就这样结束了,我们还需要后续对上线的系统进行跟踪调查,查看系统的运行情况.为什么呢?一方面,我们需要关注系统在运行 ...

  10. OC 与 js 界面JSBridge交互

    // 1.新建WebView self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; [self.view addSubv ...