【发布时间】:2016-01-11 01:13:15
【问题描述】:
我了解 Redux 的操作、reducer 和映射到存储的概念。 我已经能够成功地将 Redux 执行到我的应用程序中。
我一直在愉快地使用 React 的 contextTypes 来处理需要来自 Redux 的数据的子组件,这些数据之前已被调用过。
然后我遇到了一个奇怪的情况,数据被一个孩子变异了。当我在 SO 上发布问题时,一位成员告诉我无论如何我都应该谨慎使用 contextTypes。
所以解决我的问题的唯一方法是在孩子的父母中再次映射到商店,就像父母的更高组件之前所做的那样,并将该数据作为道具传递给孩子.
但这对我来说似乎完全错了。再次映射到同一家商店?为什么?我不明白什么?为什么我必须在每个需要另一个组件映射到的相同数据的组件上写这个?
export default class Foo extends Component {
.....
// I DID THIS STUFF IN A HIGHER COMPONENT.
// WHY MUST I REPEAT MYSELF AGAIN?
// WHAT AM I NOT UNDERSTANDING?
static propTypes = {
children: PropTypes.node.isRequired,
dispatch: PropTypes.func.isRequired,
products: PropTypes.array
};
componentDidMount() {
const { dispatch } = this.props;
dispatch(fetchProductsIfNeeded());
}
.....
}
const mapStateToProps = (state) => {
const {productsReducer } = state;
if (!productsReducer) {
return {
isFetching: false,
didInvalidate: false,
error: null,
products: []
};
}
return {
error: productsReducer.error,
isFetching: productsReducer.isFetching,
didInvalidate: productsReducer.didInvalidate,
products: productsReducer.products
};
};
export default connect(mapStateToProps)(Foo);
我查看了容器,但在我看来容器将所有愚蠢的组件一次包装在其中......
<ProductsContainer>
<ProductsComponent />
<ProductSpecialsComponent />
<ProductsDiscountedComponent />
</ProductsContainer>
这不是我想要的。我想,就像服务一样,我可以在每个相应的哑组件中使用该容器......
<ProductsContainer>
<ProductsDiscountedComponent />
</ProductsContainer>
<ProductsContainer>
<ProductSpecialsComponent />
</ProductsContainer>
<ProductsContainer>
<ProductsComponent />
</ProductsContainer>
现在为了获得上面所示的 3 个子组件,它们中的每一个都必须映射到商店,而这似乎完全错了。
我找不到任何我可以掌握的解决方案。
问题:
有没有一种方法可以只映射一次,然后为需要该数据的组件调用该“服务”?
如果是这样,我们将不胜感激。
后记:
我虽然也许如果我可以将“映射服务”作为一个纯 JavaScript 函数 o/s 执行,并将该函数导入需要它的组件中,这将解决问题,但我还没有看到任何Redux 存储被映射到 o/s React 的示例。
更新:
我在这里发布了解决方案......
【问题讨论】:
-
解决方案请看这里....stackoverflow.com/questions/34712755/…
标签: javascript reactjs redux