将 w=10=sh 迁移到 w=11=sh (ch)
Migrate 'react-router' into 'react-router-dom' (v4)
我正在学习 React Routing,我正在看这个教程:
https://www.youtube.com/watch?v=1iAG6h9ff5s
它是 2016 年的教程,所以我想有些事情发生了变化,因为 'react-router' 不再工作了,我应该使用 'react-router-dom'。
我发现我必须卸载 'history' 和 'react-router' 并改用 'react-router-dom',但是当我更改它时它没有按预期工作。
如何编辑它以使其与 'react-router-dom' 一起使用?
import React from "react";
import ReactDOM from "react-dom";
import {Router, Route, IndexRoute, hashHistory} from "react-router";
import Layout from "./pages/Layout";
import Archives from "./pages/Archives";
import Featured from "./pages/Featured";
import Settings from "./pages/Settings";
const app = document.getElementById('app');
ReactDOM.render(
<Router history={hashHistory}>
<Route path="/" component={Layout}>
<IndexRoute component={Featured}></IndexRoute>
<Route path="archives" component={Archives}></Route>
<Route path="settings" component={Settings}></Route>
</Route>
</Router>,
app);
我的编辑:
import React from "react";
import ReactDOM from "react-dom";
import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
import Layout from "./pages/Layout";
import Archives from "./pages/Archives";
import Featured from "./pages/Featured";
import Settings from "./pages/Settings";
const app = document.getElementById('app');
ReactDOM.render(
<Router>
<Route path="/" component={Layout}>
<Route path="/featured" component={Featured}/>
<Route path="/archives" component={Archives}/>
<Route path="/settings" component={Settings}/>
</Route>
</Router>,
app);
pushState 也不起作用...
Layout.js
import React from "react";
import {Link} from "react-router-dom";
export default class Layout extends React.Component {
navigate() {
this.props.history.pushState(null, "/");
}
render() {
return (
<div>
{this.props.children}
<h1>Welcome</h1>
<button onClick={this.navigate.bind(this)}>Featured</button>
</div>
);
}
}
当我单击 Link url 更改时,但未加载内容...此外,当我访问 url 时,出现 "Cannot GET" 错误
看完视频后,您可能想要这样的东西。起初这不会那么容易理解,但在看到其中的一些之后你就会消化它。首先,你用 Route
渲染你的 Layout
。然后在这条顶级路线中,您使用其他 Route
来设置您的组件。
我们通常使用 exact
props 作为顶根,例如 /
。如果你没有像这样设置你的应用程序,例如你所有的路由都在你的顶部 Router
配置中,那么要使用类似 /featured
的路由,我们必须有 exact
属性。如果我们不使用它 Router
总是点击 /
路径并且我们总是看到顶级组件。
但是,在您的情况下,您希望在顶级组件中路由其他组件。所以,我们在这里删除 exact
属性。
您也可以使用 push
更改历史记录。
更新
考虑到名为 "Featured" 的导航按钮后,我认为您希望 Featured
组件在此处呈现为默认组件。再次按下按钮时,您将回到 Featured
一个。我已经根据那个更改了代码。在这个版本中,我们在 Layout
中添加了一个 /
路由,并将其指向 Featured
。所以,当我们来到这里时,它被渲染了。但是,我们在这里使用 exact
属性,因为我们还需要像“/featured”、“/archives”和“/settings”这样的路由。
export default class Layout extends React.Component {
navigate = () => this.props.history.push("/");
render() {
return (
<div>
<h1>Welcome</h1>
<Link to="/featured">Featured</Link>
<Link to="/archives">Archives</Link>
<Link to="/settings">Settings</Link>
<br />
<button onClick={this.navigate}>Featured</button>
<Route exact path="/" component={Featured} />
<Route path="/featured" component={Featured} />
<Route path="/archives" component={Archives} />
<Route path="/settings" component={Settings} />
<div>
Some other info.
</div>
</div>
);
}
}
const app = document.getElementById('root');
ReactDOM.render(
<Router>
<Switch>
<Route path="/" component={Layout} />
</Switch>
</Router>,
app);
我正在学习 React Routing,我正在看这个教程:
https://www.youtube.com/watch?v=1iAG6h9ff5s
它是 2016 年的教程,所以我想有些事情发生了变化,因为 'react-router' 不再工作了,我应该使用 'react-router-dom'。
我发现我必须卸载 'history' 和 'react-router' 并改用 'react-router-dom',但是当我更改它时它没有按预期工作。
如何编辑它以使其与 'react-router-dom' 一起使用?
import React from "react";
import ReactDOM from "react-dom";
import {Router, Route, IndexRoute, hashHistory} from "react-router";
import Layout from "./pages/Layout";
import Archives from "./pages/Archives";
import Featured from "./pages/Featured";
import Settings from "./pages/Settings";
const app = document.getElementById('app');
ReactDOM.render(
<Router history={hashHistory}>
<Route path="/" component={Layout}>
<IndexRoute component={Featured}></IndexRoute>
<Route path="archives" component={Archives}></Route>
<Route path="settings" component={Settings}></Route>
</Route>
</Router>,
app);
我的编辑:
import React from "react";
import ReactDOM from "react-dom";
import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom";
import Layout from "./pages/Layout";
import Archives from "./pages/Archives";
import Featured from "./pages/Featured";
import Settings from "./pages/Settings";
const app = document.getElementById('app');
ReactDOM.render(
<Router>
<Route path="/" component={Layout}>
<Route path="/featured" component={Featured}/>
<Route path="/archives" component={Archives}/>
<Route path="/settings" component={Settings}/>
</Route>
</Router>,
app);
pushState 也不起作用... Layout.js
import React from "react";
import {Link} from "react-router-dom";
export default class Layout extends React.Component {
navigate() {
this.props.history.pushState(null, "/");
}
render() {
return (
<div>
{this.props.children}
<h1>Welcome</h1>
<button onClick={this.navigate.bind(this)}>Featured</button>
</div>
);
}
}
当我单击 Link url 更改时,但未加载内容...此外,当我访问 url 时,出现 "Cannot GET" 错误
看完视频后,您可能想要这样的东西。起初这不会那么容易理解,但在看到其中的一些之后你就会消化它。首先,你用 Route
渲染你的 Layout
。然后在这条顶级路线中,您使用其他 Route
来设置您的组件。
我们通常使用 exact
props 作为顶根,例如 /
。如果你没有像这样设置你的应用程序,例如你所有的路由都在你的顶部 Router
配置中,那么要使用类似 /featured
的路由,我们必须有 exact
属性。如果我们不使用它 Router
总是点击 /
路径并且我们总是看到顶级组件。
但是,在您的情况下,您希望在顶级组件中路由其他组件。所以,我们在这里删除 exact
属性。
您也可以使用 push
更改历史记录。
更新
考虑到名为 "Featured" 的导航按钮后,我认为您希望 Featured
组件在此处呈现为默认组件。再次按下按钮时,您将回到 Featured
一个。我已经根据那个更改了代码。在这个版本中,我们在 Layout
中添加了一个 /
路由,并将其指向 Featured
。所以,当我们来到这里时,它被渲染了。但是,我们在这里使用 exact
属性,因为我们还需要像“/featured”、“/archives”和“/settings”这样的路由。
export default class Layout extends React.Component {
navigate = () => this.props.history.push("/");
render() {
return (
<div>
<h1>Welcome</h1>
<Link to="/featured">Featured</Link>
<Link to="/archives">Archives</Link>
<Link to="/settings">Settings</Link>
<br />
<button onClick={this.navigate}>Featured</button>
<Route exact path="/" component={Featured} />
<Route path="/featured" component={Featured} />
<Route path="/archives" component={Archives} />
<Route path="/settings" component={Settings} />
<div>
Some other info.
</div>
</div>
);
}
}
const app = document.getElementById('root');
ReactDOM.render(
<Router>
<Switch>
<Route path="/" component={Layout} />
</Switch>
</Router>,
app);