我遇到了一个问题,因为我有一个相当复杂的组件来呈现项目列表。项目列表直接来自redux状态树。我希望有2条重用此相同组件的单独路由,但它们中的每条都会连接到状态树的不同列表。
这是一个简化的示例:
从状态树开始:
state = {
fruits: ['apple', 'banana', 'grape', 'pear'],
vegetables: ['celery', 'carrot', 'cucumber']
}
和一个简单的 list 组件
class ListView extends Component {
render() {
return (
<div>
{this.props.items.map((item, index) =>
<div key={index}>{item}</div>
)}
</div>
)
}
}
function mapStateToProps(state) {
return {
items: state.fruits
}
}
export default connect(mapStateToProps)(ListView)
更高级别的App组件如下所示:
class App extends Component {
render() {
return (
<div>
{this.props.children}
</div>
)
}
}
export default connect()(App)
路线如下所示:
<Route path='/' component={App}>
<IndexRedirect to='fruits' />
<Route path='fruits' component={ListView} />
<Route path='vegetables' component={ListView} />
</Route>
因此,现在ListView组件已连接到redux状态的水果部分。但是,我想在这里利用路由结构,以便“/ fruits”和“/ vegetables”都使用相同的组件,但是“/ fruits”将列出水果,而“/ vegetables”将列出蔬菜。
显而易见的解决方法是创建一个全新的且相同的组件类,并更改mapStateToProps方法以连接到蔬菜数组。
有没有一种方法可以重用此组件,但是可以访问每个组件中状态树的不同部分?
最佳答案
在ListView中,您可以将FruitsList和VeggiesList都导出为单独的组件,然后根据路线显示正确的组件。
class ListView extends Component {
render() {
return (
<div>
{this.props.items.map((item, index) =>
<div key={index}>{item}</div>
)}
</div>
)
}
}
function mapStateToPropsVeggies(state) {
return {
items: state.veggies
}
}
function mapStateToPropsFruits(state) {
return {
items: state.fruits
}
}
const VeggiesList = connect(mapStateToPropsVeggies)(ListView);
const FruitsList = connect(mapStateToPropsFruits)(ListView);
export default ListView;
export {
VeggiesList,
FruitsList
};
然后将路由器更新为:
<Route path='/' component={App}>
<IndexRedirect to='fruits' />
<Route path='fruits' component={FruitsList} />
<Route path='vegetables' component={VeggiesList} />
</Route>