【Redux Saga炼金笔记】1秒内点击3次按钮触发事件

配方

  • effects: race, take, call

流程

  1. 首次点击按钮开始计时
  2. 如果1秒内再点击2次则触发三连击事件
  3. 未完成三连击则触发超时事件

实现

1 按钮点击时dispatch一个CLICK的action

function Test ({handleClick}) {
  return (
    <div>
      Click 3 times in one second.
      <button onClick={handleClick}>Click me!</button>
    </div>
  );
}

Test = connect(
  () => ({}),
  (dispatch) => ({
    handleClick () {
      dispatch({type: 'CLICK'});
    }
  })
)(Test);

2 使用take监听CLICK

function *clickWatcher () {
  while (true) {
    yield take('CLICK');
  }
}
store.runSaga(clickWatcher);

3 在监听到第一个CLICK之后,启动race,竞争者为一个1秒的delay任务和一个take两次CLICK的任务

function *clickWatcher () {
  while (true) {
    yield take('CLICK');

    const {timeout, success} = yield race({
      timeout: call(delay, 1000),
      success: call(function * () {
        yield take('CLICK');
        yield take('CLICK');
        return true;
      })
    });
  }
}

4 delay任务胜出则超时,反之发动三连击技能

function *handleTripleClick () {
  alert('Woh~');
}
function *handleTimeout () {
  alert('GAME OVER');
}

function *clickWatcher () {
  while (true) {
    yield take('CLICK');

    const {timeout, success} = yield race({
      timeout: call(delay, 1000),
      success: call(function * () {
        yield take('CLICK');
        yield take('CLICK');
        return true;
      })
    });
    if (success) {
      yield call(handleTripleClick);
    } else {
      yield call(handleTimeout);
    }
  }
}
height="265" width="100%" scrolling="no" title="Redux Saga Cookbooks 01" src="//codepen.io/awaw00/embed/oBBdVV/?height=265&theme-id=0&default-tab=js,result&embed-version=2" allowfullscreen="true">See the Pen <a href="http://codepen.io/awaw00/pen/oBBdVV/">Redux Saga Cookbooks 01</a> by aaron wang (<a href="http://codepen.io/awaw00">@awaw00</a>) on <a href="http://codepen.io">CodePen</a>.&#10;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值