【发布时间】:2016-04-15 04:31:12
【问题描述】:
来自 Redux 的 store 服务最终被 React 应用程序中的各种组件使用。它所暴露的方法(如 dispatch、getState 和 subscribe)被各种组件(如容器或展示)使用。
我认为传递此存储服务的方法是一个重要的设计决策。我看到了两种方法,它们是:
1) 通过将 store 作为 prop 传递给所有嵌套级别的每个组件。这不是推荐的。
2) 使用像 react-redux 这样的工具,它在上下文的帮助下,可以在任何需要的地方使用 store(准确地说是 state 和 dispatch)。
我的问题是:为什么不直接在需要的地方导入商店。对于基于 SPA 的 React 应用程序,store 将是一个单例。嵌套在任何级别的组件都可以简单地导入商店。为什么我们应该采用上述两种方法中的任何一种?
对于任何嵌套级别的组件:我们可以这样做
import store from "path/to/store";
let MyComponent = () => {
let state = store.getState();
return (
<div onClick={() => {
store.dispatch({
type: "SOME_EVENT",
payload: store.somedata
});
}}>{state.dataINeedHere}</div>
);
};
export default MyComponent;
而不是
import { connect } from "react-redux";
let MyComponent = ({somedata, onMyAction}) => {
let state = store.getState();
return (
<div onClick={() => {
onMyAction(somedata);
}}>{somedata}</div>
);
};
const mapStateToProps = (state) => {
return {
somedata: state.somedata
}
}
const mapDispatchToProps = (dispatch) => {
return {
onMyAction: (input) => {
dispatch({
type: "SOME_EVENT",
payload: input
});
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);
【问题讨论】:
-
在你的“我们可以这样做”的例子中,当某些状态发生变化时,什么会导致你的组件重新渲染?
-
我会在顶层订阅状态更改并触发重新渲染
-
你研究过 mobx / mobx-react 吗?听起来像你描述的那样。
标签: reactjs redux react-redux