是否存在监听器
问题
看到了一个 vuetify的issue
在只绑定了 click
事件时,该按钮样式为不可点击,实际上是能够点击的:
1 | <VList> |
简单来说就是按钮的样式不正确,并且在最后一个 beta
版本是正常的,3.0
发布后就寄了
简单排查后发现这样一段代码,用于判断按钮是否可点击:
1 | const isClickable = computed( |
其中最后一行的 link.isClickable
出自一个 hook
,封装了根据传参构建链接对象的逻辑:
1 | const link = useLink(props, attrs); |
useLink
里面的 isClickable
是这样判断的:
1 | const isClickable = computed(() => { |
attrs.onClick
这里出问题了
在 beta15
时,点击事件是通过透传传入子组件根元素的
而后面有一个提交,向组件中增加了点击事件的声明:
1 | export default { |
attrs
存放的是未在组件内声明的传参和事件
这样会导致传入的 @click
事件不会出现在 attrs
中,导致判断该按钮不可点击
解决
如果需要在组件内判断外部是否有监听器,有两个方法
在 props 中声明监听器
例如有父组件:
1 | <Child @click="doSth" /> |
子组件:
1 | <script setup> |
透传
我个人提交的 pr
用的是这个方法,毕竟 useLink
这个方法估计很多地方都用上了,不好动手,而且这样改只是还原了旧版的实现
父组件同上:
1 | <Child @click="doSth" /> |
子组件通过 attrs
检查并绑定:
1 | <script setup> |
或者直接透传:
1 | <script setup> |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 乱炖锅!
评论