gpt4 book ai didi

javascript - React Router v4 的嵌套路由 - 解决方案

转载 作者:行者123 更新时间:2023-11-30 11:40:00 25 4
gpt4 key购买 nike

我正在尝试让嵌套路由在 React Router 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')
);

App.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 时,它会给出 cannot GET/about 等等,即使它们都呈现到同一个 url - 我是点击链接还是自己输入。我在想 App 路由没有被渲染,除了在根目录下,我不明白为什么。有谁知道为什么会这样?

此外,我如何转换我的代码,以便我可以像第一个示例代码一样接受匹配参数?所以在主题中,它将匹配对象作为参数,我猜这是对它以前的 url 的某种引用

解决方案

好的,我将在这里提供解决方案,因为许多基于视频的 React Router 教程并不涵盖 React Router v4。我希望正在努力使用新的 React Router 的菜鸟们可以从这个答案中得到帮助。

所以基本上,您必须能够区分客户端路由和 Assets 请求,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 中没有文件,或者另一个匹配的快速路径,例如/about then express 不会响应任何内容。

除了上面的静态中间件之外,您还需要添加一个 catch all 路由来表达 - 但它必须在您的路由定义中紧随其后。

app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '../build', 'index.html'));
};

这是一个通配符路由,因此任何未被静态中间件匹配的内容都将被发送到 index.html。一旦出现在您的浏览器中,react-router 将接管并加载正确的组件。

关于javascript - React Router v4 的嵌套路由 - 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43097562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com