dvajs学习笔记- effects API [1]

最近在学习dva,但发现官方文档有点滞后,所以自己记录下笔记,如有笔误或者理解不当的地方,还请指正

dva是一个基于 redux 和 redux-saga 的数据流方案,其中effects是Action 处理器,处理异步动作,基于 Redux-saga 实现。Effect 指的是副作用。根据函数式编程,计算以外的操作都属于 Effect,典型的就是 I/O 操作、数据库读写

在本model中调用action是不用加namespace,如果加上甚至会抛出警告,跨model调用才要加上namespace区分

  • call 阻塞
    用于调用异步逻辑,支持 promise

    const result = yield call(fetch, payload);
    
  • put 不阻塞
    用于触发 action,一般来触发reducer改变state

    yield put({
          type: 'todos/add', payload: 'Learn Dva' });
    
  • put.resolve 阻塞
    功能与put一样,区别是put.resolve是阻塞的,执行完才进行下一步

  • select 不阻塞
    用于从 state 里获取数据

    const {
          args } = yield select(state => state[namespace]);
    
  • take 阻塞
    可以监听action的开始和结束阶段,take会阻塞到监听的事件触发,才执行下一步

    it('take', done => {
         
    const app = create();
    app.model({
         
      namespace: 'count',
      state: 0,
      reducers: {
         
        add(state, {
          payload }) {
         
          return state + payload || 1;
        },
      },
      effects: {
         
        *addDelay({
          payload }, {
          put, call }) {
         
          yield call(delay, payload.delay || 100);
          yield put({
          type: 'add', payload: payload.amount });
        },
        *test(action, {
          put, select, take }) {
         
          yield put({
          type: 'addDelay', payload: {
          amount: 2 } });
          // @@start 是监听put操作的第一步,即payload与state还没合并,这时state为0
          //yield take('addDelay/@@start');
          //@@end 是监听put操作的最后一步,即将payload与state合并,返回新的state,这时state为2
          yield take('addDelay/@@end');
          const count = yield select(state => state.count);
          yield put({
          type: 'addDelay', payload: {
          amount: count, delay: 0 } });
        },
      },
    });
    app.start();
    app._store.dispatch({
          type: 'count/test' });
    setTimeout(() => {
         
      expect(app._store.getState().count).toEqual(4);
      done();
    }, 300);
    });
    

    可以监听action数组,满足一个即可

    it('take with array of actions', () => {
         
    const app = create();
    let takenCount = 0;
    app.model({
         
      namespace: 'count',
      state: null,
      reducers: {
         
        addRequest() {
         
          return 1;
        },
        addFailure() {
         
          return -1;
        },
        addSuccess() {
         
          return 0;
        },
      },
      effects: {
         
        *add(action, {
          put }) {
         
          yield put(
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值