React手稿之 React-Saga的详解
Redux-Saga
redux-saga是一个用于管理应用程序副作用(例如异步获取数据,访问浏览器缓存等)的javascript库,它的目标是让副作用管理更容易,执行更高效,测试更简单,处理故障更容易。
redux-saga相当于一个放置在action与reducer中的垫片。
之所以称之谓副作用呢,就是为了不让触发一个action时,立即执行reducer。也就是在action与reducer之间做一个事情,比如异步获取数据等。
redux-saga使用了ES6中的Generator功能,避免了像redux-thunk的回调地狱。
如何使用
安装
$npminstall--saveredux-saga //或者 $yarnaddredux-saga
示例
假设有一个UI界面,是根据用户ID显示用户详情的。那么我们需要通过接口从数据库根据userId来获取数据。
简单起见,我们在本地使用一个json文件来模拟数据库数据。
{ "297ee83e-4d15-4eb7-8106-e1e5e212933c":{ "username":"Saga" } }
创建UIComponent
importReactfrom'react'; import{USER_FETCH_REQUESTED}from'../../../actions/User'; exportdefaultclassextendsReact.Component{ constructor(props){ super(props); this.state={userId:'297ee83e-4d15-4eb7-8106-e1e5e212933c'} } render(){ const{userInfo={},dispatch}=this.props; return(); } } { dispatch({type:USER_FETCH_REQUESTED,payload:{userId:this.state.userId}}); }}>GetUserInfo用户名:{userInfo.username}
创建saga,这里的saga就相当于action.
import{call,put,takeEvery}from'redux-saga/effects' import{fetchUserApi}from'../api/user'; import{USER_FETCH_REQUESTED,USER_FETCH_SUCCEEDED,USER_FETCH_FAILED}from'../actions/User'; function*fetchUser({payload}){ try{ constuser=yieldcall(fetchUserApi,payload.userId); yieldput({type:USER_FETCH_SUCCEEDED,user}); }catch(e){ yieldput({type:USER_FETCH_FAILED,message:e.message}); } } constuserSaga=function*(){ yieldtakeEvery(USER_FETCH_REQUESTED,fetchUser); } exportdefaultuserSaga;
关于fetchUserApi,我们会在后面的章节中描述。这里仅获取了json文件中与userId相对应的数据。
把saga放入store中:
importcreateSagaMiddlewarefrom'redux-saga'; importSagasfrom'../sagas/index'; constsagaMiddleware=createSagaMiddleware() conststore=createStore( reducer, applyMiddleware(sagaMiddleware) ) sagaMiddleware.run(Sagas)
最后再实现相就的reducer即可:
import{USER_FETCH_SUCCEEDED}from'../actions/User'; constinitialState={user:{}}; exportdefault(state=initialState,action)=>{ switch(action.type){ caseUSER_FETCH_SUCCEEDED: return{...state,user:action.user}; default: returnstate; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。