我是Redux初学者,在看了一些教程之后,我仍然有一些问题:
1)
创建我的store
后,我有:
ReactDOM.render(<Provider store={store}><BrowserRouter><App/></BrowserRouter></Provider>, document.getElementById('root'));
进入App
组件,我定义:
function mapStateToProps(state) {
return {
posts: state.posts,
comments: state.comments
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(actions, dispatch)
}
state
和dispatch
来自哪里?自从我将其连接到组件以来,这是否自动引用store
的状态和调度?
2)我的一个React组件有一个表单,提交后会调用一个函数:
handleSubmit(event) { ... }
所以在该组件的构造函数中,我有:
constructor() {
super()
this.handleSubmit = this.handleSubmit.bind(this);
}
在声明React类组件时是否总是需要调用super()
?
为什么我需要在那里进行这种类型的绑定?
3)提交该表单后,我调度了一个名为addPost
的操作。
它如何“减速”到减速器?仅仅是因为我在创建商店时使用了减速器,然后使用mapDispatchToProps(dispatch)
我让Redux知道可以将哪些动作分派给该减速器?
4)约简器仅返回一个state
对象-实际将状态“保存”到存储中的逻辑在哪里?隐藏了吗?
对不起,很长的帖子,谢谢!
答案 0 :(得分:3)
请查看我们新的official React-Redux docs。具体来说,您应该通读connect
: Extracting Data with mapStateToProps
和connect
: Dispatching Actions with mapDispatchToProps
。
如果为一个类定义一个constructor
, 并扩展了另一个类,那么是的,您需要调用{{1} }作为构造函数的第一行-这就是定义ES6类工作的方式。
Redux仅具有单个reducer功能。 super()
的内部看起来像这样:
dispatch()
您可能希望通读Redux文档中的Structuring Reducers页面,以更好地了解reducer通常如何以及为何被拆分为较小的函数。
function dispatch(action) {
newState = rootReducerFunction(oldState, action);
subscriberCallbacks.forEach(callback => callback() );
}
中,因为 you 使用它来生成“根减少器”功能。答案 1 :(得分:3)
是的,将state
和dispatch
分别视为对您的redux状态和调度函数的引用。
如果您不初始化状态并且不绑定方法,则无需为React组件实现构造函数。
尝试为处理程序使用箭头功能:
class MyComponent extends Component {
handleSubmit = () => {
// ...
}
}
将还原器分配给商店,将商店分配给react-redux <Provider>
组件,并且Provider组件提供一个React context,在此组件中派生后代组件中的分派动作通过所说的减速器。
该逻辑在redux库中。
答案 2 :(得分:0)
状态和调度来自何处?自从我将其连接到组件以来,这是否自动引用商店的状态和调度?
状态是最难理解的主题之一,当我们开始专注于Redux时,状态就居于首位。我们定义的每个基于类的组件都有其自己的状态对象。
mapStateToProps
是我们从应用程序级别状态到组件级别的接口的能力。它是我们从状态对象中提取属性并将其注入到组件中的地方。
dispatch
是您更改应用程序状态的方法,dispatch
是一项操作。
在实现中,您正在使用bindActionCreators
,它将值是动作创建者的对象转换为具有相同键的对象,但每个动作创建者都被封装在dispatch
调用中,因此它们可以直接调用。
我个人从来没有以这种方式连接过redux动作,所以我不得不查一查。
在声明React类组件时是否总是需要调用super()?为什么我需要在那里进行这种类型的绑定?
是的,React组件总是必须在其构造函数中调用super
才能正确设置。
有关这种绑定欺骗的深入说明,请从React docs开始。如果您不太喜欢,请知道在React中,每当定义使用this
的事件处理程序时,都需要向this.methodName = this.methodName.bind(this)
函数中添加constructor
。