diff --git a/packages/uni-components/src/components/button/index.tsx b/packages/uni-components/src/components/button/index.tsx index 1b09fb62db24589cf4689b9e2a753d4376177772..f79e10e5fd37f0e67cdb517c967645c3c2f90fad 100644 --- a/packages/uni-components/src/components/button/index.tsx +++ b/packages/uni-components/src/components/button/index.tsx @@ -1,11 +1,15 @@ -import { inject } from 'vue' +import { inject, onBeforeUnmount, ref } from 'vue' import { useI18n, initI18nButtonMsgsOnce } from '@dcloudio/uni-core' import { defineBuiltInComponent } from '../../helpers/component' import { useHover } from '../../helpers/useHover' import { useBooleanAttr } from '../../helpers/useBooleanAttr' import { UniFormCtx, uniFormKey } from '../form' +import { uniLabelKey, UniLabelCtx } from '../label' +import { useListeners } from '../../helpers/useListeners' +import { useAttrs } from '../../helpers/useAttrs' export default /*#__PURE__*/ defineBuiltInComponent({ + inheritAttrs: false, name: 'Button', props: { id: { @@ -41,7 +45,8 @@ export default /*#__PURE__*/ defineBuiltInComponent({ default: '', }, }, - setup(props, { slots }) { + setup(props, { slots, emit }) { + const rootRef = ref(null) if (__PLATFORM__ === 'app') { initI18nButtonMsgsOnce() } @@ -51,10 +56,13 @@ export default /*#__PURE__*/ defineBuiltInComponent({ ) const { hovering, binding } = useHover(props) const { t } = useI18n() - function onClick() { + const onClick = (e: Event, isLabelClick: boolean) => { if (props.disabled) { return } + if (isLabelClick) { + rootRef.value!.click() + } const formType = props.formType if (formType) { if (!uniForm) { @@ -74,23 +82,49 @@ export default /*#__PURE__*/ defineBuiltInComponent({ ) } } + + const uniLabel = inject( + uniLabelKey, + false as unknown as UniLabelCtx + ) + if (!!uniLabel) { + uniLabel.addHandler(onClick) + onBeforeUnmount(() => { + uniLabel.removeHandler(onClick) + }) + } + useListeners(props, { 'label-click': onClick }) + + const { $listeners, $attrs, $excludeAttrs } = useAttrs({ + excludeListeners: true, + }) + const _listeners = Object.create(null) + let events = ['onClick', 'onTap'] + if ($listeners.value) { + Object.keys($listeners.value).forEach((e) => { + if (props.disabled && events.includes(e)) { + return + } + _listeners[e] = ($listeners.value as any)[e] + }) + } + return () => { const hoverClass = props.hoverClass const booleanAttrs = useBooleanAttr(props, 'disabled') - if (hoverClass && hoverClass !== 'none') { - return ( - - {slots.default && slots.default()} - - ) - } + const hasHoverClass = hoverClass && hoverClass !== 'none' + return ( - + {slots.default && slots.default()} ) @@ -100,6 +134,7 @@ export default /*#__PURE__*/ defineBuiltInComponent({ function openFeedback(titleText: string, sendText: string) { const feedback = plus.webview.create( + // @ts-ignore 'https://service.dcloud.net.cn/uniapp/feedback.html', 'feedback', {