Skip to content

事件监听 ​

listen() 将 DOM 事件监听交给 Makoo 管理。下面的入口在每次点击页面时打印点击目标。

声明监听器 ​

src/main.ts

ts
import { createMakoo, listen } from '@makoojs/core';

const tasks = createMakoo().start([
  listen({
    id: 'page-click',
    listenAt: 'body',
    type: 'click',
    callback: (event) => console.log('Clicked:', event.target)
  })
]);

listenAt 是目标元素的 CSS 选择器,type 是事件名称,callback 接收原生 DOM 事件。运行开发脚本后,点击页面并查看浏览器控制台。

开关与销毁 ​

start() 返回的 tasks 可以按 ID 取回监听器。需要暂停页面点击日志时调用 close():

ts
const task = tasks.get('page-click');
if (task?.kind === 'listener') {
  task.close();
}
方法用途
close()暂停监听,保留任务
open()恢复监听
destroy()移除监听器和任务

open() 和 close() 返回是否成功改变状态。完整类型见任务句柄。

用状态控制监听 ​

当监听开关需要跟随应用状态时,通过 activitySignal 传入状态源。下面用 Escape 键切换点击监听:

src/main.ts

ts
import { createActivityStore, createMakoo, listen } from '@makoojs/core';

const enabled = createActivityStore(true);

createMakoo().start([
  listen({
    id: 'page-click',
    listenAt: 'body',
    type: 'click',
    callback: (event) => console.log('Clicked:', event.target),
    activitySignal: () => enabled
  }),
  listen({
    id: 'toggle-clicks',
    listenAt: 'body',
    type: 'keydown',
    callback: (event) => {
      if (event instanceof KeyboardEvent && event.key === 'Escape') {
        enabled.update((value) => !value);
        console.log('Click listener enabled:', enabled.get());
      }
    }
  })
]);

enabled 为 true 时启用点击监听,为 false 时暂停。activitySignal 返回的对象提供 get() 读取当前值、subscribe() 订阅变化;createActivityStore() 已实现这两个方法。

键盘监听保持启用,因此暂停点击监听后仍可以按 Escape 恢复。

随组件注册监听 ​

组件任务的 options.on 接收一个 listen() 声明,使监听器与组件任务一起注册和清理。组件内可通过 makoo.controlListener('OPEN') 或 makoo.controlListener('CLOSE') 控制它。见 MakooContext。