【发布时间】:2019-02-12 12:10:13
【问题描述】:
我有一个问题,直接使用 store 中的 getState 或使用 mapStateToProps 有什么区别。请看我下面的例子
import React, { Component } from 'react'
import store from '../store'
import { connect } from 'react-redux';
class Test extends Component {
constructor(props) {
super(props);
}
render() {
return (
<p>
<h1>{this.props.count}</h1>
<h2>{store.getState().reducer1.count}</h2>
</p>
)
}
}
const mapStateToProps = (state) => ({
count: state.reducer1.count
});
// export default Test;
export default connect(mapStateToProps)(Test);
上面的store.getState和mapStateToProps都正常工作,当状态改变时它仍然会更新。如果我们只使用 getState,我们不需要使用 connect 方法。
我认识到的另一点是当使用 mapStateToProps 和 connect 时,在 reducer 中,我们必须返回对象状态的新副本,而不是返回带有修改的状态。如果没有,当状态改变时组件不会更新。像这样:
return Object.assign({}, state, {
count: state.count + 1,
payload: action.payload,
});
但如果我们使用 store.getState(),我们可以返回一个新副本或修改后的副本。像这样:
state.count++;
state.payload = action.payload;
return state
谁知道请给我解释一下,谢谢。
P/S:和 store.dispatch vs mapDispatchToProps 类似,这两个都可以正常工作,只是想知道为什么我们应该使用 mapToProps 和 connect 而不是直接从 store 调用函数。
【问题讨论】:
-
基本区别在于 mapStateToProps 从 Context 获取存储引用,并将状态对象作为第一个参数传递给 mapStateToProps 函数。所以我们可以从上层组件创建 store 对象,并使用 Provider 传递给子组件。
-
@HenokTesfaye,感谢您的回答,但是我们如何在单独的文件中创建一个 store 并导出它们,然后每个组件如果要使用 getState 或 dispatch 都可以轻松导入 store 并使用它。
-
是的,你可以@Quoc Van Tang。但我认为主要区别在于 1、安全性(您只能访问状态而不是 mapStateToProps 中的商店) 2、关注点分离。最好在 mapStateToProps 中编写状态操作代码。
-
@HenokTesfaye,是的,我明白了。谢谢
-
不客气。
标签: javascript reactjs redux frontend