Post ID路由出现在其他组件中
Post ID route showing up in other components
我正在学习路由器和 redux。我正在尝试创建一个博客。现在 post ID 路由显示在其他组件(如关于和投资组合)中,但不显示在主页中,因为我已将其设为精确路径。
https://github.com/chiranjeebhub/router-redux
Post.js:
import React, { Component } from "react";
import { connect } from "react-redux";
class Post extends Component {
render() {
const post = this.props.post ? (
<div>
<h4>{this.props.post.title}</h4>
<p>{this.props.post.body}</p>
</div>
) : (
<div>
<p>loading post ... </p>
</div>
);
return <div>{post}</div>;
}
}
const mapStateToProps = (state, ownProps) => {
let id = ownProps.match.params.post_id;
return {
post: state.posts.find(post => post.id == id)
};
};
export default connect(mapStateToProps)(Post);
我的路由器:
import React, { Component } from "react";
import { BrowserRouter, Route } from "react-router-dom";
import NavBar from "./Components/NavBar";
import Home from "./Components/Home";
import About from "./Components/About";
import Post from "./Components/post";
import Portfolio from "./Components/portfolio";
class App extends Component {
render() {
return (
<BrowserRouter>
<div className="App">
<NavBar />
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/portfolio" component={Portfolio} />
<Route path="/:post_id" component={Post} />
</div>
</BrowserRouter>
);
}
}
export default App;
About.js
import React, { Component } from "react";
class About extends Component {
render() {
return (
<div>
<h1>About Me</h1>
</div>
);
}
}
export default About;
减速器
const initState = {
posts: [
{ id: "1", title: "title1", body: "body1" },
{ id: "2", title: "title2", body: "body2" },
{ id: "3", title: "title3", body: "body3" },
{ id: "4", title: "title4", body: "body4" }
]
};
const rootReducer = (state = initState, action) => {
return state;
};
export default rootReducer;
现在,当我加载 "About" 组件时,"Loading Posts..." 显示在 post.js
您遇到问题是因为路径
<Route path="/:post_id" component={Post} />
表明 post_id
占位符需要一个动态值。由于 post_id
只是一个占位符,使用 about
、portfolio
、1
等作为路由参数将满足条件。
即
// All of them are valid
/about
/portfolio
/1
因此 Post
组件与其他组件一起显示。
因此您应该用 Switch
组件包装 Route
组件。由于 Switch
组件仅呈现与路径匹配的第一个子组件,因此当使用 /about
和 /portfolio
时,Post
组件将不会显示。
import { BrowserRouter, Route, Switch } from 'react-router-dom';
<BrowserRouter>
<div className="App">
<NavBar />
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/portfolio" component={Portfolio} />
<Route path="/:post_id" component={Post} />
</Switch>
</div>
</BrowserRouter>
我正在学习路由器和 redux。我正在尝试创建一个博客。现在 post ID 路由显示在其他组件(如关于和投资组合)中,但不显示在主页中,因为我已将其设为精确路径。
https://github.com/chiranjeebhub/router-redux
Post.js:
import React, { Component } from "react";
import { connect } from "react-redux";
class Post extends Component {
render() {
const post = this.props.post ? (
<div>
<h4>{this.props.post.title}</h4>
<p>{this.props.post.body}</p>
</div>
) : (
<div>
<p>loading post ... </p>
</div>
);
return <div>{post}</div>;
}
}
const mapStateToProps = (state, ownProps) => {
let id = ownProps.match.params.post_id;
return {
post: state.posts.find(post => post.id == id)
};
};
export default connect(mapStateToProps)(Post);
我的路由器:
import React, { Component } from "react";
import { BrowserRouter, Route } from "react-router-dom";
import NavBar from "./Components/NavBar";
import Home from "./Components/Home";
import About from "./Components/About";
import Post from "./Components/post";
import Portfolio from "./Components/portfolio";
class App extends Component {
render() {
return (
<BrowserRouter>
<div className="App">
<NavBar />
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/portfolio" component={Portfolio} />
<Route path="/:post_id" component={Post} />
</div>
</BrowserRouter>
);
}
}
export default App;
About.js
import React, { Component } from "react";
class About extends Component {
render() {
return (
<div>
<h1>About Me</h1>
</div>
);
}
}
export default About;
减速器
const initState = {
posts: [
{ id: "1", title: "title1", body: "body1" },
{ id: "2", title: "title2", body: "body2" },
{ id: "3", title: "title3", body: "body3" },
{ id: "4", title: "title4", body: "body4" }
]
};
const rootReducer = (state = initState, action) => {
return state;
};
export default rootReducer;
现在,当我加载 "About" 组件时,"Loading Posts..." 显示在 post.js
您遇到问题是因为路径
<Route path="/:post_id" component={Post} />
表明 post_id
占位符需要一个动态值。由于 post_id
只是一个占位符,使用 about
、portfolio
、1
等作为路由参数将满足条件。
即
// All of them are valid
/about
/portfolio
/1
因此 Post
组件与其他组件一起显示。
因此您应该用 Switch
组件包装 Route
组件。由于 Switch
组件仅呈现与路径匹配的第一个子组件,因此当使用 /about
和 /portfolio
时,Post
组件将不会显示。
import { BrowserRouter, Route, Switch } from 'react-router-dom';
<BrowserRouter>
<div className="App">
<NavBar />
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/portfolio" component={Portfolio} />
<Route path="/:post_id" component={Post} />
</Switch>
</div>
</BrowserRouter>