diff --git a/packages/uni-components/src/nvue/button/index.tsx b/packages/uni-components/src/nvue/button/index.tsx index a0e199427dc487f12aa492bd210b339a00d9aa61..14c6ad347770d71df6e9b36b0dd609b6a4c94a1d 100644 --- a/packages/uni-components/src/nvue/button/index.tsx +++ b/packages/uni-components/src/nvue/button/index.tsx @@ -1,6 +1,14 @@ -import { inject, onBeforeUnmount, ref, defineComponent, Text } from 'vue' +import { + inject, + onBeforeUnmount, + ref, + defineComponent, + Text, + computed, +} from 'vue' import { uniLabelKey, UniLabelCtx } from '../label' import { useListeners } from '../../helpers/useListeners' +import { useAttrs } from '../../helpers/useAttrs' import { createNVueTextVNode, useHoverClass } from '../utils' import { buttonProps } from '../../components/button' import { extend } from '@vue/shared' @@ -191,6 +199,7 @@ const TYPES = { } export default defineComponent({ + inheritAttrs: false, name: 'Button', props: extend(buttonProps, { type: { @@ -204,15 +213,17 @@ export default defineComponent({ }), styles: buttonStyle, setup(props, { slots, attrs }) { + const { $attrs, $excludeAttrs, $listeners } = useAttrs({ + excludeListeners: true, + }) const type = props.type as keyof typeof TYPES const rootRef = ref(null) const onClick = (e: Event, isLabelClick?: boolean) => { + const _onClick = ($listeners.value as any).onClick || (() => {}) if (props.disabled) { return } - if (isLabelClick) { - ;(rootRef.value as any).event.click.handler(e) - } + _onClick(e) /* const formType = props.formType if (formType) { if (!uniForm) { @@ -254,6 +265,15 @@ export default defineComponent({ } useListeners(props, { 'label-click': onClick }) + const _listeners = computed(() => { + const obj = {} + for (const eventName in $listeners.value) { + const event = ($listeners.value as any)[eventName] + if (eventName !== 'onClick') (obj as any)[eventName] = event + } + return obj + }) + const wrapSlots = () => { if (!slots.default) return [] const vnodes = slots.default() @@ -268,16 +288,22 @@ export default defineComponent({ } return () => { + const _attrs = extend( + {}, + useHoverClass(props), + { hoverClass: _getHoverClass('') }, + $attrs.value, + $excludeAttrs.value, + _listeners.value + ) return ( {props.loading ? (