<!--
* 按钮事件
*
* <template>
* // v-model动态控制disabled
* <q-button v-model="btnLoading" @click="handleClick">确定</q-button>
* <q-button @click="handleClick">确定</q-button>
* </template>
* <script setup>
* const handleClick = () => {
* console.log('按钮被点击了');
* };
* </script>
-->
<script lang="ts">
import { defineComponent, ref, computed, PropType, watch } from "vue";
export default defineComponent({
name: "DebouncedButton",
props: {
// 防抖时间(毫秒),用于定时重置按钮
debounceTime: {
type: Number as PropType<number>,
default: 1500, // 默认1.5秒
},
// 按钮禁用状态,通过 v-model 传入,默认为 undefined 表示未传入
modelValue: {
type: Boolean as PropType<boolean | undefined>,
default: undefined,
},
},
emits: ["click", "update:modelValue"],
setup(props, { emit }) {
// 内部禁用状态控制(当 modelValue 不传值时使用)
const internalDisabled = ref(false);
// 根据是否传入 modelValue 来决定按钮禁用状态的计算属性
const isButtonDisabled = computed(() => props.modelValue || internalDisabled.value);
// 点击事件处理
const handleClick = () => {
if (!isButtonDisabled.value) {
// 触发外部的点击事件
emit("click");
if (props.modelValue !== undefined) {
// 如果传入了 modelValue,使用外部控制禁用状态
emit("update:modelValue", true);
} else {
// 如果没有传入 modelValue,使用内部控制禁用状态,并设置定时器
internalDisabled.value = true;
setTimeout(() => {
internalDisabled.value = false;
}, props.debounceTime);
}
}
};
// 监听 modelValue 的变化,确保在外部重新启用时也能解除内部禁用
watch(
() => props.modelValue,
(newVal) => {
if (newVal === false) {
internalDisabled.value = false;
}
},
);
return {
handleClick,
isButtonDisabled,
};
},
});
</script>
<template>
<!-- type="primary" -->
<el-button type="danger" :disabled="isButtonDisabled" @click="handleClick">
<slot></slot>
</el-button>
</template>
<style scoped></style>
vue3+ts , 按钮防抖和动态禁用按钮
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- day40 1、这节主要涉及内容 ① hyform 中的 input、picker 双向绑定思路 ② 分页器相关细...
- 1,前言 源于一段话 Element Plus 团队正在将原有组件内的 Font Icon 向 SVG Icon ...
- 一、动态组件、keep-alive、$refs、webpack分包、异步组件 1、实现下面效果,用v-if如何实现...
- 1、如何在vue的template中,使用【@】给【img】添加【src】? 需要把【@】写成 【~@】 2、由于...