我是一个刚开始反应并尝试制作一个简单项目的人。我的问题是,我试图将组件道具传递给mapStateToProps,但我做不到。我读到我应该将ownProps作为参数传递给mapStateToProps,但它总是空的。
在此处输入图像描述
<Routes>
<Route path="/" exact={true} element={<CollectionsOverview />} />
<Route path="/:id" element={<CollectionPage />} />
</Routes>
在此处输入图像描述
const CollectionPage = ({ collection }) => {
const { id } = useParams();
this.props.id = id;
const { title, items } = collection;
return (
<CollectionPageContainer>
<Title>{title}</Title>
<ItemsContainer>
{
items.map(item => <CollectionItem key={item['id']} item={item} />)
}
</ItemsContainer>
</CollectionPageContainer>
)
}
const mapStateToProps = (state, ownProps) => {
console.log(ownProps);
return {
collection: selectCollection(ownProps.id)(state)
}
}
ownProps在此处为空对象。我的问题是如何将属性传递给mapStateToProps,或者我在这里做错了什么
从组件的使用中可以明显看出,路由中绝对没有任何道具传递给它。
<Route
path="/:id"
element={<CollectionPage />} // <-- no props passed to CollectionPage
/>
然而,connect
HOC正在注入collection
道具,但ownProps
只是一个空对象。
const mapStateToProps = (state, ownProps) => {
console.log(ownProps);
return {
collection: selectCollection(ownProps.id)(state)
}
}
这里的问题是,您的选择器函数似乎需要id
路由匹配参数才能工作,而只有通过useParams
钩子进入函数组件范围后,该参数才可用。
你现在有几个选择。
使用包装器组件";啜饮";
id
,并作为道具传递给CollectionPage
组件const CollectionPageWrapper = (props) => { const { id } = useParams(); return <CollectionPage id={id} {...props} /> }; ... const CollectionPage = ({ collection }) => { const { title, items } = collection; return ( <CollectionPageContainer> <Title>{title}</Title> <ItemsContainer> {items.map(item => <CollectionItem key={item.id} item={item} />)} </ItemsContainer> </CollectionPageContainer> ); }; const mapStateToProps = (state, ownProps) => { collection: selectCollection(ownProps.id)(state) }; export default connect(mapStateToProps)(CollectionPageWrapper);
<Route path="/:id" element={<CollectionPage />} />
将
selectCollection
选择器逻辑移动到CollectionPage
中,并使用useSelector
挂钩并通过带有id
的选择器const CollectionPage = () => { const { id } = useParams(); const collection = useSelector(selectCollection(id)); const { title, items } = collection; return ( <CollectionPageContainer> <Title>{title}</Title> <ItemsContainer> {items.map(item => <CollectionItem key={item.id} item={item} />)} </ItemsContainer> </CollectionPageContainer> ); }; export default CollectionPage;
this.props.id
不存在于react功能组件上。您使用useParams
进行了销毁,做得很好。但在ownProps
中,您没有id
属性。所以你不能那样在selectCollection
中通过它。你可以看看这个演示应用程序。希望它能帮助你了解如何设置这一切。
import { useParams } from "react-router-dom";
import { connect } from "react-redux";
const CollectionPage = ({ collection }) => {
const { id } = useParams();
//this.props.id = id;
console.log(id);
const { title, items } = collection;
return (
<div>
<div>{title}</div>
<div>
{items.map((item) => (
<div key={item["id"]} item={item} />
))}
</div>
</div>
);
};
const mapStateToProps = (state, ownProps) => {
console.log(ownProps.collection.items[0].id); //this is how you can access an ID from your items
/* return {
collection: selectCollection(ownProps.id)(state)
} */
};
export default connect(mapStateToProps)(CollectionPage);