如何在具有redux可观察性的dom元素上添加事件侦听器

如何在具有redux可观察性的dom元素上添加事件侦听器,redux,redux-observable,Redux,Redux Observable,我需要帮助在窗口键控事件后发送操作 () => Observable.fromEvent(window, 'keyup').map(event => ({type: 'KEY_PRESSED', key: event.key, event})); 谢谢你如果你总是想在这些keyup事件上监听和发送操作,Epic非常简单: const windowKeyUpEpic = () => Observable.fromEvent(window, 'keyup') .map

我需要帮助在窗口键控事件后发送操作

() => Observable.fromEvent(window, 'keyup').map(event => ({type: 'KEY_PRESSED', key: event.key, event}));

谢谢你

如果你总是想在这些
keyup
事件上监听和发送操作,Epic非常简单:

const windowKeyUpEpic = () =>
  Observable.fromEvent(window, 'keyup')
    .map(event => ({
      type: 'KEY_UP',
      key: event.key,
      event
    }));
但这可能是低效的,因为您可能只想在某些特定情况下倾听

相反,您可以通过某种方式启用/禁用此全局侦听器:

const windowKeyUpEpic = action$ =>
  action$.ofType('START_LISTEN_FOR_KEYUP')
    .switchMap(() =>
      Observable.fromEvent(window, 'keyup')
        .map(event => ({
          type: 'KEY_UP',
          key: event.key,
          event
        }))
        .takeUntil(action$.ofType('STOP_LISTEN_FOR_KEYUP'))
    );

如果您总是想在这些
keyup
事件上监听和调度操作,Epic非常简单:

const windowKeyUpEpic = () =>
  Observable.fromEvent(window, 'keyup')
    .map(event => ({
      type: 'KEY_UP',
      key: event.key,
      event
    }));
但这可能是低效的,因为您可能只想在某些特定情况下倾听

相反,您可以通过某种方式启用/禁用此全局侦听器:

const windowKeyUpEpic = action$ =>
  action$.ofType('START_LISTEN_FOR_KEYUP')
    .switchMap(() =>
      Observable.fromEvent(window, 'keyup')
        .map(event => ({
          type: 'KEY_UP',
          key: event.key,
          event
        }))
        .takeUntil(action$.ofType('STOP_LISTEN_FOR_KEYUP'))
    );

为什么不使用.switchMap(()=>Observable.fromEvent(…).map(…).takeUntil()?如果我们把map放在switchMap()内部,我担心放更多的switchMap()调用(例如承诺链)会导致太多嵌套。@NikhilAgarwal如果你把它们放在外部,您正在将这些运算符应用于顶级流—这意味着
takeUntil
将取消整个epic—您将不会侦听未来的操作,`map在本例中不会产生任何影响,但如果您使用
catch
添加错误处理,它将--您不希望错误在
开关映射
之外冒泡,否则错误将到达类型为的
操作$,epic将终止。这有时被称为“隔离观察者链”,所以我们这样做是为了确保类型为
action$不会终止。这是否意味着可以在第一个
switchMap()中执行我上面建议的操作?例如:-
action$of type(…).switchMap(()=>observeable.fromPromise(…).switchMap(()=>observeable.fromPromise(…).switchMap(…).map(…).takeUntil(…)
这意味着我只需要做一级嵌套来隔离观察者链。@NikhilAgarwal就其本质而言,我不能说嵌套一级总是解决方案,但在您的情况下,如果您所关心的不是将错误传播到顶层,那么是的!的确,在大多数可观察到的redux情况下,一级隔离通常是标准的,但并非总是且绝对不是所有RXJ的情况。希望这有帮助!Observable.fromEvent不像Jquery事件监听器那样一直在监听。这不会导致页面变慢吗?我们为什么不使用.switchMap(()=>Observable.fromEvent(…).map(…).takeUntil()?如果我们把map放在switchMap()内部,我担心放更多的switchMap()调用(例如承诺链)会导致太多嵌套。@NikhilAgarwal如果你把它们放在外部,您正在将这些运算符应用于顶级流—这意味着
takeUntil
将取消整个epic—您将不会侦听未来的操作,`map
在本例中不会产生任何影响,但如果您使用
catch
添加错误处理,它将--您不希望错误在
开关映射
之外冒泡,否则错误将到达类型为
操作$,epic将终止。这有时被称为“隔离观察者链”,所以我们这样做是为了确保类型为
action$不会终止。这是否意味着可以在第一个
switchMap()中执行我上面建议的操作?例如:-
action$of type(…).switchMap(()=>observeable.fromPromise(…).switchMap(()=>observeable.fromPromise(…).switchMap(…).map(…).takeUntil(…)
这意味着我只需要做一级嵌套来隔离观察者链。@NikhilAgarwal就其本质而言,我不能说嵌套一级总是解决方案,但在您的情况下,如果您所关心的不是将错误传播到顶层,那么是的!的确,在大多数可观察到的redux情况下,一级隔离通常是标准的,但并非总是且绝对不是所有RXJ的情况。希望这有帮助!Observable.fromEvent不像Jquery事件监听器那样一直在监听。这不会导致页面变慢吗?