sync$()
同步事件 (BETA)
Qwik 异步处理事件。这意味着某些 API(如 event.preventDefault()
和 event.stopPropagation()
)无法按预期工作。为了解决此限制,Qwik 提供了一个 sync$()
API,允许您同步处理事件。但 sync$()
有一些注意事项
sync$()
无法闭包任何状态。sync$()
无法调用在作用域中声明或导入的其他函数。sync$()
被序列化为 HTML,因此我们应该注意函数的大小。
处理这些限制的典型方法是将事件处理分成两部分
sync$()
:同步调用,可以调用event.preventDefault()
和event.stopPropagation()
等方法。$()
:异步调用,可以闭包状态并调用其他函数,对大小没有限制。
由于 sync$()
无法访问状态,那么处理它的最佳策略是什么?答案是使用元素属性将状态传递到 sync$()
函数中。
注意:如果您只需要阻止默认行为,您可以简单地使用标准的
preventDefault:{eventName}
语法。这仅适用于您需要同步地将事件链接在一起的情况。
sync$()
示例:带状态的 在此示例中,我们有一个行为,我们希望根据某些状态阻止链接的默认行为。我们通过将代码分成三个部分来实现这一点
sync$()
:同步部分,保持最小化,$()
:异步部分,可以任意大,可以闭包状态,data-should-prevent-default
:元素上的属性,用于将状态传递到sync$()
函数中。
import { component$, useSignal, sync$, $ } from '@builder.io/qwik';
export default component$(() => {
const shouldPreventDefault = useSignal(true);
return (
<div>
<div>Sync Event:</div>
<input
type="checkbox"
checked={shouldPreventDefault.value}
onChange$={(e, target) =>
(shouldPreventDefault.value = target.checked)
}
/>{' '}
Should Prevent Default
<hr />
<a
href="https://google.com"
target="_blank"
data-should-prevent-default={shouldPreventDefault.value}
onClick$={[
sync$((e: MouseEvent, target: HTMLAnchorElement) => {
if (target.hasAttribute('data-should-prevent-default')) {
e.preventDefault();
}
}),
$(() => {
console.log(
shouldPreventDefault.value ? 'Prevented' : 'Not Prevented'
);
}),
]}
>
open Google
</a>
</div>
);
});