vue3 lodash 防抖函数写在click中不生效?
我在utils的public.ts封装了一个方法
import _ from 'lodash'// 节流
export const getDebounce = (fn: (e: Event) => void, count: number) => _.debounce(fn, count)
login.vue使用
import { getDebounce } from '@/utils/public'const login = () => { console.log(123) }
<el-button @click="getDebounce(login,1000)">登录</el-button>
但这样写不生效,换成下面写法就生效了
const login = () => { console.log( 123 ) }const loginDe = getDebounce(login, 1000)
<el-button @click="loginDe">登录</el-button>
在我看来 他们两是一个意思,为什么上面不生效?
回答:
并不是一个意思,vue
的事件绑定可以绑定一个回调函数,也可以是一段回调函数体,当你绑定的是一个函数名时【即你描述中下面那种】,它的回调函数就是该函数,而如果绑定的不是一个函数名,那么就会自动包裹一层匿名函数,也就是说<el-button @click="getDebounce(login,1000)">登录</el-button>
这个会被视为<el-button @click="() => getDebounce(login,1000)">登录</el-button>
回答:
都用上vue3了,不如封装一个防抖hook:
import { ref, watch, onUnmounted } from 'vue';export default function useDebounce(fn, delay) {
const timeout = ref(null);
const debounceFn = (...args) => {
clearTimeout(timeout.value);
timeout.value = setTimeout(() => {
fn(...args);
}, delay);
};
onUnmounted(() => {
clearTimeout(timeout.value);
});
return debounceFn;
}
使用方法:
import { ref } from 'vue';import useDebounce from './useDebounce';
export default {
setup() {
const input = ref('');
const debouncedInput = ref('');
const updateDebouncedInput = useDebounce((value) => {
debouncedInput.value = value;
}, 500);
watch(input, (newValue) => {
updateDebouncedInput(newValue);
});
return {
input,
debouncedInput,
};
},
};
以上是 vue3 lodash 防抖函数写在click中不生效? 的全部内容, 来源链接: utcz.com/p/934260.html