问题描述
我目前正在将一个 vue 2 / Quasar 1 项目迁移到 vue 3 / Quasar 2 并且我正在为一个 SVG 动画元素上的事件而苦苦挣扎,该事件在新版本中似乎没有触发....
<animateTransform
begin="startAnimation.begin"
attributeName="transform"
attributeType="XML"
type="rotate"
from="-18 150 380"
to="0 150 380"
dur="0.6s"
repeatCount="1"
fill="freeze"
calcMode="spline"
keySpli@R_502_6431@="0.3 0.7 0.3 0.7"
keyTimes="0;1"
@endEvent="animationEndHandler()"
/>
endEvent 事件 (https://developer.mozilla.org/en-US/docs/Web/API/SVGAnimationElement/endEvent_event) 在旧版本中运行良好,但在新版本中没有任何反应。其他一切都一样,我已经尝试将 animationEndHandler 方法减少到只有 console.log('hello')
我已经在 Mac 上的 Chrome 和 Safari 中尝试过,并使用适用于 iOS 的 Cordova 构建,所以我相信这不是浏览器问题,因为旧版本可以在相同的浏览器中运行。
仅仅因为我没有其他任何东西可以尝试,我也尝试了以下所有......
@endEvent="animationEndHandler"
@endevent="animationEndHandler"
@end-event="animationEndHandler"
@endevent="animationEndHandler()"
@end-event="animationEndHandler()"
v-on:endEvent="animationEndHandler()"
v-on:endEvent="animationEndHandler"
v-on:endevent="animationEndHandler()"
v-on:endevent="animationEndHandler"
v-on:end-event="animationEndHandler()"
v-on:end-event="animationEndHandler"
当我检查 chrome 开发工具中的 <animateTransform>
元素并查看右侧的 Event Listeners 选项卡时,我可以在其中看到“endevent”,并且在处理程序中引用了我的 animationEndHandler
,但它似乎永远不会被调用。
如果有人能就为什么这在 Vue 3 下不再有效提供任何建议,我将不胜感激!
解决方法
我不清楚原因(可能是 Vue 3 错误),但您可以通过声明自己的 custom directive 来模拟 v-on
(@
是其简写)来解决它).
例如,本地注册一个指令,命名为on2
:
export default {
directives: {
on2: {
mounted(el,binding) {
// <div v-on2:foo="bar"> -> binding = { arg: 'foo',value: this.bar }
el.addEventListener(binding.arg,binding.value);
},},}
或者全局注册指令:
createApp(...)
.directive('on2',{
mounted(el,binding) {
el.addEventListener(binding.arg,binding.value);
},})
.mount('#app')
并在您的模板中使用它:
<animateTransform v-on2:endEvent="animationEndHandler" />