当前位置:网站首页 > Vue.js开发 > 正文

vue3中,封装el-select选择器组件(一)——表单四等分布局、查询、重置resetFields、el-date-picker起止日期、特殊字符校验、自定义指令v-throttle用于按钮防抖

vue3中,封装el-select选择器组件(一)——表单四等分布局、查询、重置resetFields、el-date-picker起止日期、特殊字符校验、自定义指令v-throttle用于按钮防抖

效果

在这里插入图片描述
1-流程状态
在这里插入图片描述
2-牵头单位
在这里插入图片描述
3-系统内单位角色
在这里插入图片描述

页面文件

index.vue

<template> <div class="main-content"> <el-form ref="formRef" class="inline-form" label-position="right" label-width="130px" :model="formInline" > <el-form-item class="width25" label="项目名称:" prop="prjName"> <el-input v-model="formInline.prjName" maxlength="100" placeholder="请输入" @input="(e) => (formInline.prjName = replaceCommonText(e))" /> </el-form-item> <el-form-item class="width25" label="开始时间:"> <el-date-picker v-model="prjDate" end-placeholder="结束日期" format="YYYY-MM-DD" placeholder="请选择" range-separator="至" start-placeholder="开始日期" type="daterange" value-format="YYYY-MM-DD" /> </el-form-item> <el-form-item class="width25" label="牵头单位:" prop="leadUnit"> <unitSelect v-model="formInline.leadUnit" v-model:contrUnitName="formInline.leadUnitName" @change-unit="handleUnitChange" /> </el-form-item> <el-form-item class="width25" label="系统内单位角色:" prop="innerRole"> <dictSelect v-model="formInline.innerRole" :dictid="'sgCompRole'" /> </el-form-item> <el-form-item class="width25" label="流程状态:" prop="processState"> <dictSelect v-model="formInline.processState" :dictid="'projectExamine'" /> </el-form-item> <el-form-item class="search_btn"> <el-button v-throttle="3000" type="primary" @click="onSubmit(formInline)" > 查询 </el-button> <el-button v-throttle="3000" plain type="primary" @click="resetForm(formRef)" > 重置 </el-button> </el-form-item> </el-form> </div> </template> <script setup> import { queryByPage } from "@/api/project/couny"; import unitSelect from "@src/components/unitSelect"; import dictSelect from "@src/components/dictSelect"; import { replaceCommonText } from "@src/utils/validate"; const formRef = ref(); const prjDate = ref([]); const formInline = ref({ prjName: "", startDate: "", //项目开始日期 endDate: "", //项目结束日期 leadUnitName: "", //牵头单位 innerRole: "", //系统内单位角色 processState: "", //流程状态 }); const page = reactive({ pageSize: 10, pageNumber: 1, total: 0, }); //重置-写法一 const resetForm = (formEl) => { if (!formEl) return; prjDate.value = []; formEl.resetFields(); formInline.leadUnit = ""; onLoad(); }; //重置-写法二 // const resetForm = () => { // formRef.value.resetFields() // onLoad() // } //重置-写法三 // const resetForm = (formEl: FormInstance | undefined) => { // if (!formEl) return // formEl.resetFields() // onLoad() // } //查询 const onSubmit = () => { onLoad(); }; const onLoad = async () => { const formData = { pageSize: page.pageSize, pageNumber: page.pageNumber, ...formInline, startDate: prjDate.value ? prjDate.value[0] : "", endDate: prjDate.value ? prjDate.value[1] : "", }; await queryByPage(formData).then((res) => { tableData.value = res.data.data; page.pageSize = res.data.pageSize; page.total = Number(res.data.total); page.pageNumber = res.data.pageNumber; }); }; const handleUnitChange = (val) => { formInline.leadUnit = val.id; formInline.leadUnitName = val.orgObjMdmName; }; </script> <style lang="scss" scoped></style> 
公共样式

src\assets\css\element.css

.main-content { 
    padding: 20px 30px; } .inline-form { 
    overflow: hidden; /* border-bottom: 1px dashed #ccc; */ } .inline-form .search_btn{ 
    float: right; margin-right: 0 !important; } 
引用方法

src\app\science\api\project\couny.js

import request from '@src/utils/request' import { 
    sciencePostUrl } from '@/config' //立项管理项目分页列表查询 export const queryByPage = (data) => { 
    return request({ 
    url: `${ 
     sciencePostUrl}/prj/queryByPage`, method: 'post', data, }) } 

src\utils\validate.ts

// 禁止输入框特殊字符校验  export function replaceCommonText(e: any) { 
    if (!checkSpecificKeyWord(e)) { 
    // 提交关键字 ElMessage({ 
    message: '不能包含关键词: ' + wordKey, type: 'warning', }) const y = e.replace(wordKey, '') return y } else { 
    const str = e.replace( /[`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【 】、;,’。 ]/g, '' ) const y = str.replace(/\s+/g, '') return y } } // 禁止输入框特殊字符校验-简约版 export function replaceSimpleText(e: any) { 
    if (!checkSpecificKeyWord(e)) { 
    // 提交关键字 ElMessage({ 
    message: '不能包含关键词: ' + wordKey, type: 'warning', }) const y = e.replace(wordKey, '') return y } else { 
    const str = e.replace( /[`~!@#$%^&*_\+=<>?:"{}|;'\\[\]·~!@#¥%……&*——\+={}|?:“”【 】;’。 ]/g, '' ) const y = str.replace(/\s+/g, '') return y } } / * @description form表单特定字符校验 * @param value * @returns {boolean} */ export function validateCommonText(rule: any, value: any, callback: any) { 
    const err: any = validatorSpecialCharacter(value) if (err) { 
    callback(new Error(err.message)) return } callback() } // export function validateCommonText(rule: any, value: any, callback: any) { 
    // const noChars = "[`~!#$^&*\"()=|{}'‘: ; ',\\[\\].<>/?~!#¥……&*()——|{}【】‘;:”“'。,、?]‘'@ /% ‘" // const v = value || '' // for (let i = 0; i < noChars.length; i++) { 
    // const char = noChars[i] // if (v.indexOf(char) != -1) { 
    // callback(new Error('不能使用特殊字符')) // return // } // } // const words = ['javascript', 'script', 'function', 'jscript', 'vbscript', 'confirm', 'onfocus', 'onblur', 'alert', 'location', 'document', 'window', 'onclick', 'href', 'prompt', 'onerror', '/*', 'data:', '\\u003e', '\\u003c', 'eval', 'url', 'expr', 'URLUnencoded', 'referrer', 'write', 'writeIn', 'body.innerHtml', 'execScript', 'setInterval', 'setTimeout', 'open', 'navigate', 'srcdoc', 'iframe', 'body', 'form', 'base', 'img', 'src', 'style', 'div', 'object', 'meta', 'link', 'input', 'comment', 'br', 'and', 'or', 'exec', 'insert', 'select', 'delete', 'update', 'alter', 'create', 'drop', 'count', 'chr', 'char', 'asc', 'mid', 'substring', 'master', 'truncate', 'declare', 'restore', 'backup', 'like', 'table', 'from', 'grant', 'use', 'column_name', 'group_concat', 'information_schema.columns', 'union', 'where', 'order', 'by', 'join', 'modify', 'into', 'substr', 'ascii', 'having'] // for (let i = 0; i < noChars.length; i++) { 
    // const word = words[i] // if (v.indexOf(word) != -1) { 
    // callback(new Error('不能包含: ' + word)) // return // } // } // callback() // } 
自定义指令

library\plugins\directive.ts

import type { 
    DirectiveBinding } from 'vue' export function setup(app: any) { 
    / * @description 自定义指令v-throttle */ app.directive('throttle', { 
    mounted(el: any, binding: DirectiveBinding) { 
    let { 
    throttleTime } = binding.value if (!throttleTime) { 
    throttleTime = 1000 } let timer: any let disable = false el.addEventListener( 'click', (event: any) => { 
    if (timer) { 
    clearTimeout(timer) } if (!disable) { 
    disable = true } else { 
    event && event.stopImmediatePropagation() } timer = setTimeout(() => { 
    timer = null disable = false }, throttleTime) }, true ) }, }) } 
到此这篇vue3中,封装el-select选择器组件(一)——表单四等分布局、查询、重置resetFields、el-date-picker起止日期、特殊字符校验、自定义指令v-throttle用于按钮防抖的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • vue3中,封装el-select选择器组件(二)——filterable模糊搜索、watch用法、nextTick用法、toRefs用法、sessionStorage取值、设置基准地址apiUrl2024-12-02 23:45:07
  • vue3中,封装el-tree树形控件组件,用于组织架构——defineEmits、defineProps& vue3之computed计算属性、watch和nextTick监听的写法 & `${写法2024-12-02 23:45:07
  • vue3中,当前页中封装tab切换模块2024-12-02 23:45:07
  • vue3中,js-cookie的使用 & token之获取token-getToken()、存储token-setToken()、移除token-removeToken()2024-12-02 23:45:07
  • vue2中,data为什么是函数2024-12-02 23:45:07
  • vue3封装表单组件(三)02封装el-dialog组件的传值-select选择框、input输入框之查询、重置的使用 & vue3中父子传值的使用步骤2024-12-02 23:45:07
  • vue3封装表单组件(三)01封装el-dialog组件的传值-radio单选框、form表单之defineEmits、defineProps的使用2024-12-02 23:45:07
  • vue3封装表单组件(二)01之el-tree-select & vue3封装组件写法2024-12-02 23:45:07
  • vue3封装表单组件(一)之el-select & `${}之接口抽离公共词根2024-12-02 23:45:07
  • axios配置多个接口请求(四)——vue项目axios配置多个IP地址,并配置多个接口请求2024-12-02 23:45:07
  • 全屏图片