给 element-plus 增加一个防抖的功能(二)

简介: element-plus 功能非常强大,但是好像只有 el-autocomplete 提供了一个防抖功能,其他表单子控件并没有提供防抖功能,而 el-autocomplete 的防抖和我想要的效果又不太一样,所以只好写个函数实现我想要的防抖效果。

封装控件

为了更方便使用,我们可以基于 el-input 做二次封装,建立一个 text.vue 的文件。

text.vue,模板:

<template>
<el-input
v-model="value"
clearable
@blur="myblur"
@change="mychange"
@clear="myclear"
@keydown="mykeydown"
>
el-input>
template>


代码:

import debounceRef from'../js/debounceRef.js'
// 设置属性
const props = defineProps({
modelValue: [String, Number],
model: Object,
colName: String
})
// 设置提交
const emit = defineEmits(['update:modelValue'])
const events = {
run: () => {},
clear: () => {}
}
const value = debounceRef(props, events, emit)
// 在点击由 clearable 属性生成的清空按钮时触发
const myclear = () => {
events.run() // 立即执行
}
// 仅在输入框失去焦点或用户按下回车时触发
const mychange = () => {
events.run() // 立即执行
}
// 在 Input 失去焦点时触发
const myblur = () => {
events.run() // 立即执行
}
// 按键,用于汉字的连续输入
const mykeydown = (e) => {
// console.log('按键信息:', e)
events.clear()
}


这样在使用的时候就可以很方便了。

使用封装的控件

模板:

<nf-text v-model="retUser.name">nf-text>
<nf-text :model="retUser" colName="name" >nf-text>

代码:

const retUser = reactive({
name: '对象的响应性',
address: '',
age: 18,
like: []
})
  • v-model vs proxy 一般都是使用 v-model 的方式来实现双向绑定,但是我感觉有点绕圈圈,既然表单有一个 model 对象,那么为啥不能直接修改呢?于是设置了这种兼容方式,可以使用 v-model,也可以传入 model 和 属性名称,然后在子组件里面就可以通过 proxy 的 set 拦截的方式实现**“直接”**的修改。

不封装组件,直接使用

如果我就是不想封装,我想直接用行不行?当然是可以的,只需要设置好参数即可。

const retUser = reactive({
name: '对象的响应性',
address: '',
age: 18,
like: []
})
const addressProps = {
model: retUser,
colName: 'address'
}
const events = {
run: () => {},
clear: () => {}
}
const address = debounceRef(addressProps, events)
// 按键,用于汉字的连续输入
const mykeydown = (e) => {
events.clear()
}


依据 model 设置对象,再设置回调函数的对象即可。然后的用法类似于 computed。

当然这样看起来就比较麻烦了,因为一开始就是基于二次封装组件来设计的。

除了文本框还支持其他吗?

各种表单子控件,基本都支持,比如CheckBoxGroup等,虽然其 value 是数组形式,但是也同样支持的,效果就是:选择选项一、二、三,然后一起响应。


<template>
<el-checkbox-group v-model="checkList">
<el-checkbox label="Option A" />
<el-checkbox label="Option B" />
<el-checkbox label="Option C" />
<el-checkbox label="Option D" />
<el-checkbox label="Option E" />
el-checkbox-group>
<div v-if="model" style="display: none;">{{model[colName]}}div>
template>


// 设置属性
const props = defineProps({
modelValue: [Array],
model: Object,
colName: String
})
const emit = defineEmits(['update:modelValue'])
const events = {
run: () => {},
clear: () => {}
}
const checkList = debounceRef(props, events, emit)


这里就不需要设置各种事件了。

总结

个人感觉还是挺方便的。你可能觉得没必要二次封装,其实上面介绍的封装,只是整个二次封装的一小部分代码,还有其他各种功能。

不知道大家有没有猜出来我想实现什么功能?

本文作者:自然框架

个人网址:jyk.cnblogs.com

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

相关文章
|
存储 JSON 前端开发
前端下载文件以及上传图片预览,顺便了解arrayBuffer和blob
前端下载文件以及上传图片预览,顺便了解arrayBuffer和blob
1384 0
|
6月前
|
人工智能 程序员
我的通义灵码插件没有AI程序员选项了
通义灵码插件没有AI程序员选项了
|
JavaScript API
给 element-plus 增加一个防抖的功能(一)
element-plus 功能非常强大,但是好像只有 el-autocomplete 提供了一个防抖功能,其他表单子控件并没有提供防抖功能,而 el-autocomplete 的防抖和我想要的效果又不太一样,所以只好写个函数实现我想要的防抖效果。
|
机器学习/深度学习 数据处理 Python
机器学习实战:房价预测项目
【7月更文挑战第13天】本文详细介绍了基于机器学习的房价预测项目的实战过程。从数据准备、特征工程、模型构建到结果评估,每一步都至关重要。通过合理的特征选择和模型优化,我们可以构建出性能优异的房价预测模型,为房地产行业的决策提供有力支持。未来,随着机器学习技术的不断发展和应用场景的不断拓展,房价预测模型将更加智能化和精准化。
【Echarts】Echarts 柱形图实现从右向左滚动
【Echarts】Echarts 柱形图实现从右向左滚动
428 0
|
C++ 开发者 Unix
面向 C++ 的现代 CMake 教程(四)(5)
面向 C++ 的现代 CMake 教程(四)
207 0
|
安全 Linux 数据安全/隐私保护
代理ip全局代理是什么且如何设置
代理ip全局代理是什么且如何设置
463 0
深入理解 uni-app 页面生命周期(三):onHide vs onUnload
深入理解 uni-app 页面生命周期(三):onHide vs onUnload
1070 0
|
Web App开发 JavaScript 前端开发
JS字符串补全方法padStart()和padEnd()简介
JS字符串补全方法padStart()和padEnd()简介
1052 6
|
JavaScript
Vue3指令:搜索框输入防抖实现(附源码)
Vue3指令:搜索框输入防抖实现(附源码)
527 0