是否存在监听器
问题
看到了一个 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 许可协议。转载请注明来自 乱炖锅!
评论





