Redux:需要对一些基本设置进行说明

时间:2018-10-30 18:32:15

标签: javascript reactjs redux

我是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)

}

statedispatch来自哪里?自从我将其连接到组件以来,这是否自动引用store的状态和调度?

2)我的一个React组件有一个表单,提交后会调用一个函数:

handleSubmit(event) { ... }

所以在该组件的构造函数中,我有:

constructor() {
    super()
    this.handleSubmit = this.handleSubmit.bind(this);
}

在声明React类组件时是否总是需要调用super()? 为什么我需要在那里进行这种类型的绑定?

3)提交该表单后,我调度了一个名为addPost的操作。 它如何“减速”到减速器?仅仅是因为我在创建商店时使用了减速器,然后使用mapDispatchToProps(dispatch)我让Redux知道可以将哪些动作分派给该减速器?

4)约简器仅返回一个state对象-实际将状态“保存”到存储中的逻辑在哪里?隐藏了吗?

对不起,很长的帖子,谢谢!

3 个答案:

答案 0 :(得分:3)

  1. 请查看我们新的official React-Redux docs。具体来说,您应该通读connect: Extracting Data with mapStateToPropsconnect: Dispatching Actions with mapDispatchToProps

  2. 如果为一个类定义一个constructor 并扩展了另一个类,那么是的,您需要调用{{1} }作为构造函数的第一行-这就是定义ES6类工作的方式。

  3. Redux仅具有单个reducer功能。 super()的内部看起来像这样:

    dispatch()

您可能希望通读Redux文档中的Structuring Reducers页面,以更好地了解reducer通常如何以及为何被拆分为较小的函数。

  1. 在大多数情况下,将不同的“状态片”组合回去的逻辑在function dispatch(action) { newState = rootReducerFunction(oldState, action); subscriberCallbacks.forEach(callback => callback() ); } 中,因为 you 使用它来生成“根减少器”功能。

答案 1 :(得分:3)

  1. 是的,将statedispatch分别视为对您的redux状态和调度函数的引用。

  2. React docs说:

      

    如果您不初始化状态并且不绑定方法,则无需为React组件实现构造函数。

尝试为处理程序使用箭头功能:

class MyComponent extends Component {
    handleSubmit = () => {
        // ...
    }
}
  1. 将还原器分配给商店,将商店分配给react-redux <Provider>组件,并且Provider组件提供一个React context,在此组件中派生后代组件中的分派动作通过所说的减速器。

  2. 该逻辑在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