我试图让嵌套路由工作在React路由器v4。我指的是这一页https://reacttraining.com/react-router/web/guides/quick-start
它们是如何嵌套路由的
import React from 'react'
import {
BrowserRouter as Router,
Route,
Link
} from 'react-router-dom'
const BasicExample = () => (
<Router>
<div>
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/about">About</Link></li>
<li><Link to="/topics">Topics</Link></li>
</ul>
<hr/>
<Route exact path="/" component={Home}/>
<Route path="/about" component={About}/>
<Route path="/topics" component={Topics}/>
</div>
</Router>
)
const Home = () => (
<div>
<h2>Home</h2>
</div>
)
const About = () => (
<div>
<h2>About</h2>
</div>
)
const Topics = ({ match }) => (
<div>
<h2>Topics</h2>
<ul>
<li>
<Link to={`${match.url}/rendering`}>
Rendering with React
</Link>
</li>
<li>
<Link to={`${match.url}/components`}>
Components
</Link>
</li>
<li>
<Link to={`${match.url}/props-v-state`}>
Props v. State
</Link>
</li>
</ul>
<Route path={`${match.url}/:topicId`} component={Topic}/>
<Route exact path={match.url} render={() => (
<h3>Please select a topic.</h3>
)}/>
</div>
)
const Topic = ({ match }) => (
<div>
<h3>{match.params.topicId}</h3>
</div>
)
export default BasicExample
这显然是可行的,但我想将其更改为类格式。
所以我在下面试过了
指数js
render((
<Router>
<div>
<Route path="/" component={App}/>
</div>
</Router>
), document.getElementById('root')
);
应用程序。js
class App extends Component {
render() {
return (
<div className="container">
<header>
<span className="icn-logo"><i className="material-icons">code</i></span>
<ul className="main-nav">
<li><Link to="/">Home</Link></li>
<li><Link to="/about">About</Link></li>
<li><Link to="/teachers">Teachers</Link></li>
<li><Link to="/courses">Courses</Link></li>
</ul>
</header>
<Route exact path="/" component={Home}/>
<Route path="/about" component={About}/>
<Route path="/teachers" component={Teachers}/>
<Route path="/courses" component={Course}/>
</div>
);
}
}
export default App;
问题是,当我点击链接时,它会路由到正确的url,并且可以工作,但是当我自己键入url时,它会给出“无法获取/关于”等等,即使它们都呈现到相同的url-无论是我点击链接还是我自己键入链接。我在想,App
route没有被渲染,除了root,我不明白为什么。有人知道为什么会这样吗?
另外,如何转换代码,以便像第一个示例代码一样接受match参数?所以在主题中,它将match对象作为一个参数,我猜这是对其先前url的某种引用
解决
好的,我将在这里提供解决方案,因为很多基于视频的React路由器教程都不包括React路由器v4。我希望正在与新React路由器斗争的noobs能从这个答案中得到帮助。
因此,基本上您必须能够将客户端路由与资产请求区分开来,webpack dev server
为此提供了一个完美的选项。
你所要做的就是添加
devServer: {
port: 3000,
historyApiFallback: {
index:'index.html'
}
}
当服务器没有响应时,webpack.config.js将始终指向index.html
这是我的参考。读https://jaketrent.com/post/pushstate-webpack-dev-server/可能有用
这通常是服务器问题,而不是客户端代码中的任何问题。如果将express与静态服务一起使用:
app.use(express.static('build'));
然后,如果目录build
中没有文件,或者另一个express route(例如/about
)中没有匹配的文件,则express不会做出任何响应。
除了上面的静态中间件之外,您还需要添加一个捕获所有路由来表示——不过,它必须在您的路由定义中位于它之后。
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '../build', 'index.html'));
};
这是一个通配符路由,所以任何没有被静态中间件匹配的东西都将被发送index.html.一旦它在浏览器中着陆,那么反应路由器将接管并加载正确的组件。