react引入redux之初体验(一)
let store = createStore(reducer,{},applyMiddleware(thunk));
reducer作为参数,创建了一个store,reducer就是store的监听器,这个监听器是在store创建之初就已经定下来的,可以称为内置监听器,不再需要我们手动去绑定。这里我们就有一个疑惑了,那难不成这个监听器是每次都会调用的?没错,就是这样的,这也是一开始让我不太适应的地方。暂且先往下看,接下来看看store的几个重要方法,首先是store.subscribe(action,()=>{}),然后是dispatch(action),当我们派发一个action的时候,首先触发的是内置监听器reducer,生成可用于state来更新视图的数据,执行完毕之后,触发subscribe监听的函数,可进行store.getState()操作获取数据以及setState()更新视图。以上还有两个东西没有细讲,action和applyMiddleware是什么呢?action好理解,就是动作定义,它是个对象,也可以是个函数,但最终它还得是个对象。说起来有点绕,解释一下,定义一个动作,其实就是定义一个对象,类似这样: actionNotify = {type:"通知",text:"我准备请求数据了"};
actionAsync1 = (opts)=>{
return (dispatch)=>{
dispatch(actionNotify);//发个通知,我要开始请求数据了
//发起网络请求
return fetch(...).then((resData)=>{ dispatch({type:"数据到了",text:"数据请求成功了,请显示",data:resData}); }); } }
看以上代码,是两个不同类型的action,异步actionAsync1返回的函数,可以直接dispatch一个普通actionNotify,也可以网络请求数据完成后,再dispatch新的action,但最终被dispatch的还是一个普通的action,所以说action是个对象,也可以是个函数,但最终它还得是个对象。其实我们可以简单理解一下,action之所以会有异步函数的形式,只是为了数据层和UI层更好的分离,网络请求必不可少,如果不在action,那必然在UI层或者reducer层,显然都不太合适,所以异步action就是为了解决这个问题而存在的。但是我们知道,store.dispatch本身并不支持action是个函数,redux-thunk帮我们完美解决了这个问题。上面我们略过的redux中的applyMiddleware方法,就是用于引入thunk这个中间件,对普通的store进行dispatch异步action的赋能。如此一来,store.dispatch(异步action)就解决了。至此,我们就大致讲清楚了store,action,reducer三者的关系了,也就基本搞清楚redux究竟是干什么的问题。 个人简介: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |