【发布时间】:2021-03-23 06:00:18
【问题描述】:
我有 2 个帖子组件列表,当单击明信片上的链接时,我正在进入帖子。 我无法访问子组件中的 props.postDetails。当我控制台记录道具时,我有 {history: {…}, location: {…}, match: {…}, staticContext: undefined} 只有这个没有 props.postDetails。 有人可以帮忙吗?
父组件的代码是:
mport {useState, useEffect} from 'react';
import {BrowserRouter as Router, Switch, Route, Link, withRouter} from "react-router-dom";
import logo from "./assets/images/logo.jpg";
import Post from './Post';
const Home = () => {
const [posts, setPosts] = useState([]);
useEffect(() => {
getResults();
},[]);
const getResults =() => {
fetch("https://blog-d8b04-default-rtdb.europe-west1.firebasedatabase.app/posts.json")
.then(response => response.json())
.then(data => {setPosts(data)});
}
const postsArr = [];
Object.values(posts).forEach((post, key) => {
postsArr.push(post);
});
return(
<div>
<div className="container-fluid">
<div className="row">
<div className="posts-container col-md-12">
<div className="row">
{
postsArr.map((post, key) => (
<div className="col-md-4">
<Link to={`/post/${key}`} >
<div className="pic-wrapper">
<img className="img-fluid" src={post.pic} alt={post.title}/>
</div>
<h4>{post.title}</h4>
<Post postDetails={post}/>
</Link>
</div>
))
}
</div>
</div>
</div>
</div>
</div>
)
}
子组件代码:
import {withRouter} from "react-router-dom";
const Post = (props) => {
const {pic, title, author, description} = props.postDetails;
return(
<div className="container">
<div className="pic-wrapper">
<img className="img-fluid" src={pic} alt={title}/>
</div>
<h4>{title}</h4>
<p>{author}</p>
</div>
)
}
export default withRouter(Post);
【问题讨论】:
-
是否有理由包装 Post 组件'withRouter'?看起来 withRouter HOC 没有从父级传递道具。
-
同样没有 HOC withRouter 不转发,同样的事情。
-
是的,如果没有 HOC,您将无法获得位置、匹配、历史道具,但是,如果我正确阅读您的代码,您似乎不需要用路由器包装您的明信片.如果您希望用户单击卡片导航到详细信息页面,那么您需要两条路线;主页和帖子详细信息。
-
在提供的 sn-p 中,我绝对没有理由不定义
props.postDetails。你确定你引用了正确的组件吗?您能否提供一个重现此问题的 running 代码框?postsArr有什么意义?似乎您可以轻松地直接映射posts状态。withRouter似乎也同样没用,因为它似乎没有Post引用任何路由道具。这就是你真实的、完整的代码吗? -
@Drew Reese 这里是转载代码codesandbox.io/s/currying-lake-zt4et?file=/src/Post.js
标签: javascript reactjs