【发布时间】:2018-07-03 11:42:03
【问题描述】:
我有一个用例,我有一个容器,比如 BarChartContainer。这个容器把 URL 作为一个 prop 接收进来,我的 saga 在这个 URL 的基础上得到了需要的数据,然后发送到 BarChartComponent(PureComponent),这个 BarChartContainer 调用了这个组件来渲染柱状图。 现在,我希望它是动态的,比如说如果我想在容器中的 3 个地方使用它,我只需传入所需 URL 的属性,容器的每个实例都应该根据 URL 呈现数据。我面临的问题是,即使对这个容器的每次调用都有不同的道具,但容器只有一个商店。所以最终,只有 1 个 URL 存储在商店中(即来自 BarChartContainer 第三个实例的道具的那个。我应该如何配置商店,以便它维护一棵树,以保存实例的状态。
这是我的容器的代码
export class BarChartContainer extends React.PureComponent {
static propTypes = {
initializeBarChart: PropTypes.func,
data: PropTypes.object.isRequired,
dataUrl: PropTypes.string,
addUrlToStore: PropTypes.func,
};
/**
*Defines the default values of certain props
*
* @static
* @memberof BarChartContainer
*/
static defaultProps = {
data: {},
dataUrl: '',
};
/**
*This function is called on the initial load of BarChartContainer
*
* @memberof BarChartContainer
*/
componentWillMount() {
this.props.addUrlToStore(this.props.dataUrl);
this.props.initializeBarChart();
}
render() {
return (
<div className="container-barchartcontainer">
<BarChart data={this.props.data.dataPoints} />
</div>
);
}
}
const mapStateToProps = createStructuredSelector({
data: selectData(),
});
function mapDispatchToProps(dispatch) {
return {
initializeBarChart: () => dispatch(defaultAction()),
addUrlToStore: (url) => dispatch(addUrlToStoreAction(url)),
};
}
const withConnect = connect(mapStateToProps, mapDispatchToProps);
const withReducer = injectReducer({ key: 'barChartContainer', reducer });
const withSaga = injectSaga({ key: 'barChartContainer`, saga });
export default compose(
withReducer,
withSaga,
withConnect,
)(BarChartContainer);
这是三个容器的支架
export default class Holder extends React.PureComponent {
render() {
return (
<div className="container-holder">
<BarChartContainer dataUrl='url1' />
<BarChartContainer dataUrl='url2' />
<BarChartContainer dataUrl='url3' />
</div>
);
}
}
【问题讨论】:
-
有办法,但我会重新考虑设计。您可以为每个容器分配一个 id 并使用该 id 调用您的 selectData ,或者您可以将容器转换为 PureComponent 并将选择它的责任移至其父级。 IMO 第二种选择会更好。
-
感谢 Facundo,但是对于这两种情况中的任何一种,我都没有达到我最初的基本目标。我想以最少的代码更改注入一个容器到一个持有者,这样容器可以根据我传递的道具以及存储在其存储中的数据进行配置。您能否建议另一种技术,以便我能够为商店维护树状结构。比如说,将父级作为 barchartcontainer 的存储,然后将数据关联到作为子级创建的容器的每个实例,树?
标签: reactjs redux react-redux reactive-programming code-reuse