Vue3按钮防抖

npm i --save lodash 

			<el-row> 
				<el-col :span="2">
					<el-button type="primary" class="el-btn" @click="ShowPLY">ShowPLY</el-button>
				</el-col>

				<!-- <el-button type="primary" class="el-btn" @click="testScene">testPLY </el-button> -->

				<div id="my-three" style="height:600px;width:100%"></div>

			</el-row>


import { debounce, throttle } from 'lodash'


const ShowPLYExec = async () => { 
	GluePlyFileDate.value = getFileNameFromPath(GluePlyResultFile.value)

	try {

		//let pa = { No: "", PlyFile: "D:/aaa/work/project/aaa/aa/aa/PythonScript/GluePLY/Glue5.ply" GluePlyResultFile }
		let pa = { No: "", PlyFile: GluePlyResultFile.value }
		//let plyUrl = ""
		await axios.post(global_const.WEBAPI + `Python/ShowPLY`, pa)
			.then(function (response) {
				console.log(response);

			})
			.catch(function (error) {
				//ElMessage.error(cmd + '命令执行异常!' + error)
				console.log(error);
			});

	}
	catch (err) {
		//在此处理错误
		console.log(err)
	}

}

const ShowPLY = debounce((evt) => {
	// ---- ^ 业务逻辑 ----
	// 定义fn方法
	const fn = (evt: any) => {
		console.log('debounce =>', evt)
		ShowPLYExec()
	}
	// 调用fn方法
	fn(evt)
	// ---- / 业务逻辑 ----
}, 3000)

Vue 2 中实现按钮防抖功能,可以通过以下几种方式来完成,确保在短时间内多次点击按钮时,只执行一次操作,从而避免重复请求或数据创建的问题。 ### 使用自定义指令实现按钮防抖Vue 2 中,可以通过自定义指令的方式对按钮点击行为进行统一控制。该方法通过在 `v-debounce` 指令中添加点击事件监听器,并结合 `setTimeout` 实现防抖逻辑。在点击后禁用按钮,并在指定时间后重新启用,防止重复点击。 ```javascript // directive.js import Vue from &#39;vue&#39;; Vue.directive(&#39;debounce&#39;, { inserted(el, binding) { el.addEventListener(&#39;click&#39;, () => { if (!el.disabled) { el.disabled = true; setTimeout(() => { el.disabled = false; }, binding.value || 3 * 1000); // 默认 3防抖时间 } }); } }); ``` ```vue <template> <div> <button v-debounce>防抖按钮</button> </div> </template> <script> import &#39;./directive&#39;; // 引入自定义指令 export default { // 组件逻辑 }; </script> ``` 该方法通过直接操作 DOM 的 `disabled` 属性实现防抖,适用于全局按钮点击控制,且逻辑统一、易于维护 [^2]。 --- ### 使用函数封装实现可复用的防抖逻辑 可以通过定义一个通用的 `Debounce` 函数,在方法调用时对执行逻辑进行包装,延迟执行目标函数,直到指定时间间隔内没有再次触发。 ```javascript // utils.js export const Debounce = (fn, wait) => { let delay = wait || 500; let timer; return function () { let args = arguments; if (timer) { clearTimeout(timer); } let callNow = !timer; timer = setTimeout(() => { timer = null; }, delay); if (callNow) { fn.apply(this, args); } }; }; ``` ```vue <template> <button @click="debouncedClick">提交</button> </template> <script> import { Debounce } from &#39;@/utils&#39;; export default { methods: { init() { this.debouncedClick = Debounce(this.handleSubmit, 1000); }, debouncedClick() { // 由 Debounce 包装后的点击方法 }, handleSubmit() { console.log(&#39;提交数据&#39;); // 实际提交逻辑 } }, mounted() { this.init(); } }; </script> ``` 此方法适用于需要在多个组件中复用的防抖逻辑,能够保持组件方法的干净和可测试性 [^1]。 --- ### 在组件内部直接实现防抖逻辑 如果仅需在单个组件中使用防抖功能,可以直接在方法内部管理定时器,实现简单的防抖机制。 ```vue <template> <button @click="debouncedClick">提交</button> </template> <script> export default { data() { return { timer: null }; }, methods: { debouncedClick() { if (this.timer) { clearTimeout(this.timer); } this.timer = setTimeout(() => { this.handleSubmit(); }, 1000); // 1秒防抖时间 }, handleSubmit() { console.log(&#39;按钮点击,提交数据&#39;); // 实际提交逻辑 } }, beforeDestroy() { if (this.timer) { clearTimeout(this.timer); } } }; </script> ``` 该方式适合特定组件内部使用,逻辑清晰,无需引入额外函数或指令 [^3]。 --- ### 总结 在 Vue 2 中实现按钮防抖功能,可以采用以下三种主要方式: - 通过自定义指令控制按钮点击行为,适用于全局控制; - 封装通用的 `Debounce` 函数,提高代码复用性; - 在组件内部直接使用定时器实现防抖逻辑,适用于特定组件需求。 每种方式都可根据具体业务场景灵活选择,确保在用户频繁点击按钮时,有效避免重复请求或数据提交的问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值