onMount 和事件监听器

onMount and event listener

我发现一个奇怪的行为,如果我添加 document.addEventListener 来点击 onMount

  1. 我有 2 个组件:App 和 Nested
  2. App中有一个按钮,设置isShow = true,嵌套组件显示
  3. 在嵌套组件中有 onMount 运行 document.addEventListener('click')
  4. 如果我点击 App 中的按钮,嵌套组件将被挂载,事件侦听器将立即附加到文档,然后点击, 组件挂载之前被点击,将是已处理。

我猜这是因为 Svelte 一次完成。我试过 await tick(),但没用。

我看到解决方案之一是将 document.addEventListener 换成 setTimeout。它有效,但我认为这是一个错误的决定。

那么,这是正常行为还是错误?

这是一个例子: https://svelte.dev/repl/c89c272ca6c245dabf8451ba950d10c0?version=3.6.8

这是预期的行为。最简单的解决方案可能是添加 { capture: true }(或只是 true)作为 addEventListenerremoveEventListener 的第三个参数:https://svelte.dev/repl/daee8509d6634a68b2cf35e53f660e34?version=3.6.8。这是有效的,因为在附加嵌套事件侦听器时事件已经离开 capturing 阶段,现在处于 bubbling 阶段。