Redux使用的基本思路
1)定义actions.js,其中包括actions type(字符串常量)、actions creators(返回一个json的函数,返回的这个json就是actions)2)定义reducers.js,包含多个reducer(就是一个函数):(state, action)=>{……return newState};最后通过
combineReducers()将多个reducer整合到一起 3)createStore(Reducers) 4)在入口文件中render( , rootElement); 5)React最外层组件中,在事件的回调函数中dispatch(actions creators(data));通过export default connect(select)(App) 绑定Redux与React
Redux执行的基本思路
1)用户进行点击(click)、输入(input)等事件,子组件通过callback调用最外层组件的自定义事件 2)最外层组件自定义事件的callback被触发,callback中执行dispatch(actions creators(data)) 3)store监听到action被触发,执行相应的reducer,
state被改变 4)页面render
这个过程的一些问题
1)入口文件中,store被传入Provider,但是子组件中并没有直接使用store,但是却具有dispatch方法(dispatch是store对象上的一个方法),Provider做了什么? 2)最外层组件中,export default connect(select)(App)是怎样联系Redux和React的?
3)dispatch(actions creators(data))是事件的发布者,但是store是什么时候被监听的? 4)reducer中并没有调用React的this.setState方法,页面到底是如何被render的? 5)既然Redux可以render页面,我们还要不要手动在callback中写this.setState?
解答
Provider干的事:接收store,并将store传到子组件中,当store发生变化时,更新store;所以子组件具有store的dispatch方法。问题1)解决。
connect干的事:定义了一个新的组件Connect,经过一系列的merge后,将各种值挂载props上传递到原组件。 Connect组件会保存state状态,同时监听Redux Store的变化,从而触发原组件的更新。在componentDidMount中监听Provider提供的store的变化。通过Context来访问store。响应函数为handleChange,handleChange里接收到通知后,将Connect组件的state改变为新的state,这里会有调用this.setState的操作。问题2)3)4)初步解决。
最后一个问题,官方说法是,既然用了Redux就应该用Redux控制所有状态,不手动render页面;也有人说不应该拘泥于API,在合适的时候可以调用this.setState方法,也确实有些例子是这么做的(https://github.com/emmenko/redux-react-router-async-example/blob/master/lib/components/pages/Login.js);StackOverflow的一个回答(http://stackoverflow.com/questions/34711477/should-you-ever-use-this-setstate-when-using-redux)这么说:需要保存在全局sore中的state需要使用Redux,但是一些展示性的state(比如一个用来表示下拉框是否显示的Boolean值)可以使用this.setState来render页面。问题5)有待继续探索。