kd-cloud-web / Blog

一群人, 关于前端, 做一些有趣的事儿
13 stars 1 forks source link

redux-saga #54

Open zzkkui opened 4 years ago

zzkkui commented 4 years ago

Redux-saga

redux-saga 是一个 redux 中间件。

redux 数据流

UI—————>action(plain)—————>reducer——————>state——————>UI

image

redux-saga 数据流

UI—>action(side function)—> middleware—> action(plain)—>reducer—>state—>UI

image

为什么不是 redux-thunk

thunk 可以接收函数,但是只是执行函数,不关心函数内部是什么,如果函数内部极为复杂(拥有多个异步操作),如果需要为每一个异步操作都如此定义一个action,显然action不易维护。

action不易维护的原因:

Effect提供的 API

熟悉 Generator 用法理解起来事半功倍 😉

const loginAction = {
   type:'login'
}
const action = yield take('login');

redux-saga 可以用 fork 和 call 来调用子 saga

  • call(apply)
    有阻塞地调用 saga 或者返回 promise 的函数。
yield call(fetch,'/userInfo',username)
yield fork(addItemFlow)
yield put({ type: 'CLICK_BTN' });
const id = yield select(state => state.id);
const [
  course,
  user,
  order,
] = yield all({
  call(api.getCourse, courseId),
  call(api.getUser, userId),
  call(api.getOrder, orderId),
});

辅助函数

yield* takeEvery("FETCH_REQUESTED", fetchData)
while(true){
    yield take('FETCH_REQUESTED');
    yield fork(fetchData);
}