一个查询功能居然被你玩出了花!(三)

简介: 上次是表单控件,这次是查询控件,不要弄混了哦。

7

 实现方式  

我们以文本类的查询为例进行介绍,我们先做一个查询方式的组件,然后做一个文本的查询子控件。


查询方式

<template>
<el-dropdown @command="handleCommand">
<span class="el-dropdown-link">
{{kindName}}<i
class=" el-icon--right"
:class="{'el-icon-arrow-down': isUp, 'el-icon-arrow-up': !isUp}">i>
span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
v-for="kindId in findKind"
:key="'s_kind_'+ kindId"
:command="kindId"
>
{{findKindList[kindId].name}}
el-dropdown-item>
el-dropdown-menu>
template>
el-dropdown>
template>


使用 el-dropdown 做一个选择列表。


import { defineComponent, ref } from'vue'
import { findKindList } from'/nf-control-web'
// 查询方式的 select
exportdefault defineComponent({
name: 'el-find-kind',
props: {
// 返回选择的查询方式
modelValue: [Number],
// 需要显示的查询方式
findKind: {
type: Array,
default: () => { return [411] }
}
},
emits: ['update:modelValue', 'change'],
setup (props, context) {
const kindName = ref(findKindList[props.modelValue].name)
const handleCommand = (command) => {
kindName.value = findKindList[command].name
context.emit('update:modelValue', command)
context.emit('change', command)
}
return {
isUp,
kindName,
findKindList,
handleCommand
}
}
})

查询子控件

<template>
<div style="float:left;width:65px;text-align:center;">
<find-kind
v-model="findChoiceKind"
:findKind="findKind"
@change="myChange"
/>
div>
<div :style="{width: (150 * colCount - 10 ) + 'px'}" style="float:left;">
<div style="float:left;" :style="{width: (150 * colCount - 40 ) + 'px'}">
<component
:is="ctlList[controlType]"
v-model="findText"
v-bind="$attrs"
:delay="delay"
:colName="colName"
@myChange="myChange">
component>
div>
div>
template>


放置查询方式和查询用的组件。


import { defineComponent } from'vue'
// 引入查询子控件的管理类
import { findItemManage } from'/nf-control-web'
// 查询方式的控件
import selectFindKind from'./s-findkind.vue'
// 异步组件,引入表单子控件
import { formItemToFindItem } from'../nf-el-find-item/map-el-find-item.js'
/*
* 查询子控件,文本类
* * 单行文本
* * 多行文本
* * ulr、电话、邮箱等
*/
exportdefault defineComponent({
name: 'el-find-item-text',
inheritAttrs: false,
props: {
controlId: Number, // 控件ID
controlType: Number, // 控件类型
colName: String, // 字段名称
modelValue: [Array, String], // 查询结果,数组形式
colCount: { // 占用空间
type: Number,
default: 1
},
findKind: { // 查询方式
type: Array, // , 407, 408
default: () => { return [403, 401, 402, 404, 405, 406] }
},
delay: { // 防抖
type: Number,
default: 600
}
},
components: {
'find-kind': selectFindKind
},
emits: ['update:modelValue', 'my-change'],
setup (props, context) {
// 表单子控件 to 查询子控件 的 字典
const ctlList = formItemToFindItem
const {
findChoiceKind, // 选择的查询方式
findText, // 一个关键字查询
mySubmit
} = findItemManage(props, context)
// 设置默认查询方式
findChoiceKind.value = props.findKind[0]
// 提交查询结果
const myChange = () => {
// 一个关键字查询
mySubmit(findText.value)
}
return {
ctlList, // 控件字典,用于加载具体的控件
findChoiceKind, // 查询方式
findText, // 一个查询关键字
myChange // 触发提交事件
}
}
})


设置需要的属性,比如具体的查询方式、防抖时间间隔等。因为文本查询比较简单,所以只需要简单的提交查询条件即可。


查询控件

<template>
<el-card class="box-card">
<el-scrollbar>
<div class="flex-content" style="min-width:400px;">
<el-form
inline
label-position="right"
:model="findItemModel"
ref="formControl"
class="demo-form-expand"
label-width="1px"
size="mini"
>
<el-form-item style="width:100px">
<el-dropdown size="small">
<el-button type="primary">
快捷查询<i class="el-icon-arrow-down el-icon--right">i>
el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
@click="quickClick(0)"
>
快捷查询
el-dropdown-item>
<el-dropdown-item
v-for="(item, key, index) in customer"
:key="'quick_' + index"
@click="quickClick(key)"
>
{{item.title}}
el-dropdown-item>
el-dropdown-menu>
template>
el-dropdown>
el-form-item>
<el-form-item
v-for="(ctrId, index) in arrQuickFind"
:key="'find_quick_'+index"
style="border:1px solid #cfe1f3;min-height:33px;"
:style="{width: ( 160 * getCtrMeta(ctrId).colCount + 80) + 'px'}"
>
<template v-if="getCtrMeta(ctrId).controlType === 1">
<slot :name="ctrId">父组件没有设置插槽slot>
template>
<template v-else>
<component
:is="ctlList[getCtrMeta(ctrId).controlType]"
v-model="findItemModel[ctrId]"
v-bind="getCtrMeta(ctrId)"
@myChange="mySubmit">
component>
template>
el-form-item>
<el-form-item style="width:60px">
<el-button type="primary" round @click="moreOpen">更多el-button>
el-form-item>
el-form>
div>
el-scrollbar>
el-card>
<findmore
:allFind="allFind"
:reload="reload"
:itemMeta="itemMeta"
:findKind="findKind"
:moreFind="moreFind"
v-model:isShow="isShow"
/>
template>


这里是快捷查询,更多查询做成了单独的组件,这样可以让模板代码简洁一点,不至于太乱。


/**
* @function div 格式的查询控件
* @description 可以依据 json 动态生成查询控件
* @returns {*} Vue 组件,查询控件
*/
exportdefault {
name: 'el-find-div',
components: {
findmore
},
props: {
...findProps
},
setup (props, context) {
// 控件字典
const ctlList = findItemListKey
// 依据ID获取组件的meta,因为 model 不支持[]嵌套
const getCtrMeta = (id) => {
return props.itemMeta[id] || {}
}
const {
moreFind, // 接收更多查询 更多查询里面子控件的事件
isShow, // 抽屉是否打开
arrQuickFind, // 快捷栏的数组
findItemModel, // 查询子控件的model
moreOpen, // 点击更多,清空快捷
quickClick, // 个性化方案的单击事件
mySubmit // 查询子控件的事件
} = findManage(props, context)
return {
isShow, // 抽屉是否打开
moreFind, // 接收更多查询
arrQuickFind, // 快捷栏的数组
ctlList, // 子控件字典
resetForm, // 重置表单
formControl, // 获取表单的dom
getCtrMeta, // 返回子控件的meta
findItemModel, // 查询子控件的model
moreOpen, // 点击更多,清空快捷
quickClick, // 个性化方案的单击事件
mySubmit
}
}
}


代码比较多,这里是 setup 部分,主要负责代码函数的整合。减少代码混乱的程度。


相关文章
|
8月前
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝(二)
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
58 0
|
JavaScript 测试技术 Python
低成本、快速造测试数据,这个造数工具我后悔推荐晚了!
没有测试数据,所谓的功能测试和性能测试全都是无米之炊。但我发现一个蛮诡异的事情,就是行业内很少会有人去强调测试数据的重要性,甚至市面上都没有人在做测试数据这门生意。
低成本、快速造测试数据,这个造数工具我后悔推荐晚了!
|
4天前
|
SQL 安全 搜索推荐
sqlmap使用教程(1)-指定目标,掌握这十个搜索技巧让你的工作效率至上提高十倍
sqlmap使用教程(1)-指定目标,掌握这十个搜索技巧让你的工作效率至上提高十倍
|
6天前
|
JavaScript API
【源码共读】组件太多,重复工作量大?这次一行命令带你解放双手!
【源码共读】组件太多,重复工作量大?这次一行命令带你解放双手!
40 0
|
8月前
|
数据采集 Web App开发 JavaScript
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝(一)
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
71 0
|
XML Java 数据格式
从非诚勿扰看数据索引,优化代码小妙招
从非诚勿扰看数据索引,优化代码小妙招
116 0
|
安全 Java Linux
正确认识及掌握时间的用法
时间是一个相对地区而言的概念,因此有一个基准地区,就是本初子午线穿过的地区。了解世界时间相关的概念可以更好地协调全球人们的活动,便于跨越不同地区的时差。比如按照UTC时区划分算,洛杉矶和北京 之间的时间差异是16个小时, 但是一旦洛杉矶启用了夏令时两者之间的时间差异只有15个小时,神奇吗?
191 0
正确认识及掌握时间的用法
|
存储 SQL 缓存
如何设计一个支持一亿用户的系统,心中有方案遇事不慌!
如何设计一个支持一亿用户的系统,心中有方案遇事不慌!
157 0
如何设计一个支持一亿用户的系统,心中有方案遇事不慌!
|
JSON 小程序 数据库
一个月空余时间微信诗词小程序前后端开发上线实践指南
一个月空余时间微信诗词小程序前后端开发上线实践指南
一个月空余时间微信诗词小程序前后端开发上线实践指南
|
JavaScript 数据库
一个查询功能居然被你玩出了花!(二)
上次是表单控件,这次是查询控件,不要弄混了哦。
一个查询功能居然被你玩出了花!(二)