onMount 和事件监听器
onMount and event listener
我发现一个奇怪的行为,如果我添加 document.addEventListener
来点击 onMount
。
- 我有 2 个组件:App 和 Nested
- App中有一个按钮,设置
isShow = true
,嵌套组件显示
- 在嵌套组件中有
onMount
运行 document.addEventListener('click')
- 如果我点击 App 中的按钮,嵌套组件将被挂载,事件侦听器将立即附加到文档,然后点击,在 组件挂载之前被点击,将是已处理。
我猜这是因为 Svelte 一次完成。我试过 await tick()
,但没用。
我看到解决方案之一是将 document.addEventListener
换成 setTimeout
。它有效,但我认为这是一个错误的决定。
那么,这是正常行为还是错误?
这是一个例子:
https://svelte.dev/repl/c89c272ca6c245dabf8451ba950d10c0?version=3.6.8
这是预期的行为。最简单的解决方案可能是添加 { capture: true }
(或只是 true
)作为 addEventListener
和 removeEventListener
的第三个参数:https://svelte.dev/repl/daee8509d6634a68b2cf35e53f660e34?version=3.6.8。这是有效的,因为在附加嵌套事件侦听器时事件已经离开 capturing 阶段,现在处于 bubbling 阶段。
我发现一个奇怪的行为,如果我添加 document.addEventListener
来点击 onMount
。
- 我有 2 个组件:App 和 Nested
- App中有一个按钮,设置
isShow = true
,嵌套组件显示 - 在嵌套组件中有
onMount
运行document.addEventListener('click')
- 如果我点击 App 中的按钮,嵌套组件将被挂载,事件侦听器将立即附加到文档,然后点击,在 组件挂载之前被点击,将是已处理。
我猜这是因为 Svelte 一次完成。我试过 await tick()
,但没用。
我看到解决方案之一是将 document.addEventListener
换成 setTimeout
。它有效,但我认为这是一个错误的决定。
那么,这是正常行为还是错误?
这是一个例子: https://svelte.dev/repl/c89c272ca6c245dabf8451ba950d10c0?version=3.6.8
这是预期的行为。最简单的解决方案可能是添加 { capture: true }
(或只是 true
)作为 addEventListener
和 removeEventListener
的第三个参数:https://svelte.dev/repl/daee8509d6634a68b2cf35e53f660e34?version=3.6.8。这是有效的,因为在附加嵌套事件侦听器时事件已经离开 capturing 阶段,现在处于 bubbling 阶段。