【发布时间】:2017-08-23 06:37:29
【问题描述】:
我正在尝试更熟悉 reactjs 路由。我已经构建了这个小演示 - 但应用程序在页面之间切换时显得很慢,而且当 url 错误时错误页面也不会显示。
http://localhost:3000/ -- 回家
http://localhost:3000/about -- 转到 about(但感觉渲染速度很慢)
http://localhost:3000/abc——回家而不是报错——为什么?
结构是这样的
my-app
├── build
│ └── static_
│ └── favicon.ico
│ └── index.html
├── node_modules_
├── .gitignore
├── favicon.ico
├── index.html
├── package.json
├── README.md
└── src
├── components
│ ├── About
│ │ └── About.js
│ ├── Error
│ │ └── Error.js
│ ├── Header
│ │ └── Header.js
│ └── Home
│ └── Home.js
├── index.css
├── index.js
└── router.js
// index.js
import React, { Component } from 'react'
import { render } from 'react-dom'
import './index.css'
import Routes from './router'
// this is a class because it needs state
class App extends Component {
componentDidMount() {
}
render() {
return (
<Routes />
)
}
}
render(
<App />,
document.getElementById('root')
);
// Router.js
import React, { Component } from 'react'
import { BrowserRouter as Router, Route, Redirect, Switch } from 'react-router-dom'
import createBrowserHistory from 'history/createBrowserHistory'
// components
import Home from './components/Home/Home'
import About from './components/About/About'
import Error from './components/Error/Error'
import Header from './components/Header/Header'
const history = createBrowserHistory()
// we can pass the lang files as props to the routes
// we should have a nested route inside service here to show the other services page
class Routes extends Component {
render () {
return (
<Router history={history}>
<div className='off-canvas-wrap' data-offcanvas>
<div className='inner-wrap'>
<Header transparent />
<Switch>
<Route path='/about' component={About} />
<Route path='/' component={Home} />
<Redirect from='/' />
<Route component={Error} />
</Switch>
</div>
</div>
</Router>
)
}
}
export default Routes
// About.js
import React, { Component } from 'react'
// this is a class because it needs state
class About extends Component {
componentDidMount() {
}
render() {
return (
<div className="app">
About
</div>
)
}
}
export default About
// 错误.js
import React, { Component } from 'react'
// this is a class because it needs state
class Error extends Component {
componentDidMount() {
}
render() {
return (
<div className="app">
Error
</div>
)
}
}
export default Error
// Header.js
import React, { Component } from 'react'
import { Link } from 'react-router-dom'
import { Row, Col, Menu, Icon, Alert } from 'antd'
const SubMenu = Menu.SubMenu;
const MenuItemGroup = Menu.ItemGroup;
// this is a class because it needs state
class Header extends Component {
state = {
current: 'home',
}
handleClick = (e) => {
console.log('click ', e);
this.setState({
current: e.key,
});
}
componentDidMount() {
}
render() {
return (
<Menu
onClick={this.handleClick}
selectedKeys={[this.state.current]}
mode="horizontal"
>
<Menu.Item key="home">
<Link to="/home" rel="noopener noreferrer">Home</Link>
</Menu.Item>
<Menu.Item key="about">
<Link to="/about" rel="noopener noreferrer">About</Link>
</Menu.Item>
</Menu>
)
}
}
export default Header
// Home.js
import React, { Component } from 'react'
// this is a class because it needs state
class Home extends Component {
componentDidMount() {
}
render() {
return (
<div className="app">
Home
</div>
)
}
}
export default Home
【问题讨论】:
-
我已经把这个jsfiddle中的代码库作为参考——jsfiddle.net/0ht35rpb/102
标签: reactjs routing react-router