vue实现添加一段代码功能(Vue实现动态查询规则生成组件)
类别:编程学习 浏览量:943
时间:2022-01-26 01:21:53 vue实现添加一段代码功能
Vue实现动态查询规则生成组件1. 动态查询规则动态查询规则,大致如下图所示。是可以按照用户的自定义进行组织查询语句的一种复杂组件,大致可以实现SQL查询的where条件,下面是摘自mongodb的某一软件。
按照规则组件的组织形式,可以把其视为一棵树,有树干和树叶,这样看起来就不难了。
2.1 组件属性 data: 是树结构的内容,我们定义为:
{ condition: 'AND', rules: [], }
fieldList: 字段列表数组,可供选择的字段集合;
operatorList: 操作列表数组,可供选择的操作集合,定义如下:
{ label: '包含', value: '⊂', },
2.2 组件html
这里采用ElementUI构建,因此可以方便的组合各类ui控件来进行构建需要的界面。
当然该组件既然被看作树,因此其也是个递归组件,因此还涉及到自己调用自己。
<template> <li class="rules-group-container"> <li class="rules-group-header"> <el-radio-group v-model="data.condition" size="mini"> <el-radio-button label="AND"></el-radio-button> <el-radio-button label="OR"></el-radio-button> </el-radio-group> <li> <el-button size="mini" @click="addRule(data)">添加规则</el-button> <el-button size="mini" @click="addGroup(data)">添加分组</el-button> <el-button v-if="parent" size="mini" @click="delGroup(data, parent)">删除</el-button> </li> </li> <li class="rules-group-body"> <li class="rules-list"> <template v-for="(rule, index) in data.rules"> <li :key="index" v-if="!rule.condition" class="rule-container"> <!-- 字段 --> <wt-dropdown class="rule-item" v-model="rule.FilterField" :data="getFieldList(rule.FilterTable)" @change="handleFieldChange(rule)" ></wt-dropdown> <!-- 操作符 --> <wt-dropdown class="rule-item" v-model="rule.Operator" :disabled="inputStatus && rule.FilterField === 'CommunityId'" :data="getRule(rule.FilterTable, rule.FilterField)" ></wt-dropdown> <!-- 值 --> <wt-multi-dropdown class="rule-item-long" v-if="rule.type === 'Dropdown'" :disabled="inputStatus && rule.FilterField === 'CommunityId'" v-model="rule.FilterValue" :data="getData(rule.FilterTable, rule.FilterField)" ></wt-multi-dropdown> <wt-number class="rule-item-long" :disabled="inputStatus && rule.FilterField === 'CommunityId'" v-else-if="['DateTime', 'Number', 'Decimal'].includes(rule.type)" v-model="rule.FilterValue" ></wt-number> <wt-text class="rule-item-long" v-else v-model="rule.FilterValue" :disabled="inputStatus && rule.FilterField === 'CommunityId'"></wt-text> <el-button size="mini" @click="delRule(index)">删除</el-button> </li> <CreateRule :key="index" v-else :data="rule" :parent="data" :fieldList="fieldList" :operatorList="operatorList" ></CreateRule> </template> </li> </li> </li> </template>
2.3 对不同数据类型的字段定义不同的条件
const rules = { string: [ { value: '==', label: '等于', }, { value: '<>', label: '不等于', }, { value: '⊂', label: '包含', }, { value: '⊄', label: '不包含', }, { value: 'in', label: '其中之一', }, { value: 'ni', label: '非其中之一', }, { value: 'mc', label: '多包含', }, ], number: [ { value: '==', label: '等于', }, { value: '<>', label: '不等于', }, { value: '≥', label: '大于等于', }, { value: '≤', label: '小于等于', }, ], dict: [ { value: 'in', label: '其中之一', }, { value: 'ni', label: '非其中之一', }, ], date: [ { value: 'sdiff', label: '几天前', }, { value: 'ediff', label: '几天后', }, ], }
2.4 定义方法操作组\规则
主要的操作涉及到添加\删除 组和规则。
getRule(table, field) { let data = (rules && rules.string) || [] let theField = this.getCurrentField(table, field) if (theField && theField.ControlType) { if (['Dropdown'].includes(theField.ControlType)) { return rules.dict } else if (['DateTime'].includes(theField.ControlType)) { return rules.date } else if (['Number', 'Decimal'].includes(theField.ControlType)) { return rules.number } else { return rules.string } } return data }, // 添加规则 addRule(data) { let rule = { type: 'Text', FilterTable: this.firstTable, FilterField: this.firstField, Operator: '==', FilterValue: '', } data.rules.push(rule) }, // 删除规则 delRule(index) { this.data.rules.splice(index, 1) }, // 添加分组 addGroup(data) { let group = { condition: 'OR', rules: [ { type: 'Text', FilterTable: this.firstTable, FilterField: '', Operator: '', FilterValue: '', }, ], } data.rules.push(group) }, // 删除分组 delGroup(data, parent) { let index = parent.rules.findIndex((item) => item === data) parent.rules.splice(index, 1) },
2.5 定义组件名
该组件命名为 CreateRule
,定义代码很简单了。
export default { name: 'CreateRule', props: { parent: { type: Object, }, data: { type: Object, }, fieldList: { type: Array, default() { return [] }, }, operatorList: { type: Array, default() { return [] }, }, }, }
vue中使用组件只需引用并增加到组件列表中即可。
import CreateRule from './CreateRule' export default { name: 'NewRuleForm', components: { CreateRule, }, }
模板内增加引用
<template> <li class="new-rule-form"> <CreateRule v-if="!loading" :data="data" :fieldList="FilterTable" :operatorList="operatorList" ></CreateRule> <li v-if="!loading" class="discription-wrap" v-html="discription"></li> </li> </template>
这是截取的实际效果.
在界面中,作为搜索条件或过滤条件效果均不错,可以做到非常灵活。
5.小结在vue开发应用中,可以多参考下windows软件的某些界面,偶尔能给我们很大的灵感和启发的。
到此这篇关于Vue实现动态查询规则生成组件的文章就介绍到这了,更多相关Vue 动态查询规则生成组件内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
您可能感兴趣
- vue虚拟dom如何转换成真实dom的(vue中对虚拟dom的理解知识点总结)
- vue 实现吸顶效果(vue实现水波涟漪效果的点击反馈指令)
- vueelementui组件生成页面(Vue Element前端应用开发之树列表组件)
- electronvue最新版本(Vue3和Electron实现桌面端应用详解)
- vue时间转换(vue如何动态实时的显示时间浅析)
- vue数据改变页面不刷新(vue列表数据删除后主动刷新页面及刷新方法详解)
- vue引用js库报错(Vue插件报错:Vue.js is detected on this page.问题解决)
- vue3兼容的插件多吗(关于vue3编写挂载DOM的插件问题)
- vue实现商品详情讲解(京东 Vue3 组件库支持小程序开发的详细流程)
- vue端口号是什么原理(解决vue前后端端口不一致的问题)
- vue用于动态切换组件的内置组件(Vue 可拖拽组件Vue Smooth DnD的使用详解)
- vue中的定时函数(vue计时器的实现方法)
- vue中怎么触发复选框的点击事件(vue点击弹窗自动触发点击事件的解决办法模拟场景)
- vue实现双向绑定原理(vue实现双向数据绑定)
- vue 为什么使用虚拟dom(Vue虚拟Dom到真实Dom的转换)
- vue验证码(vue_drf实现短信验证码)
- ()
- SCI检索 SSCI检索 EI检索 ISTP检索 CSCD检索简介(SCI检索SSCI检索EI检索)
- 参考文献里期刊名称的写法,你知道吗(参考文献里期刊名称的写法)
- 硕博期刊 SCI SSCI CSSCI分不清 一文带你看懂主流期刊分类(硕博期刊SCISSCI)
- 辱华品牌新百伦官宣新代言人IU,个别粉丝希望get爱豆同款(辱华品牌新百伦官宣新代言人IU)
- 巅峰时期被爆床照,曾被选国民最讨厌女星,IU不为人知的黑历史(巅峰时期被爆床照)
热门推荐
- centos下ftp服务器搭建(CentOS搭建FTP文件服务的步骤)
- mysql exists的用法(Mysql exists用法小结)
- sw2018安装图解教程(WHMCS V7.4.2 图文安装教程)
- python 模式识别(python实现全盘扫描搜索功能的方法)
- zabbix数据库解析(zabbix agent2 监控oracle数据库的方法)
- sed命令删除某行(如何利用sed命令高效删除文件的特定行)
- python中的pass是干嘛的(总结python中pass的作用)
- 如何看http状态码(10个常见的HTTP状态码详解)
- pythonnumpy求行列式的值(Python numpy中矩阵的基本用法汇总)
- ASP.NET List 集合操作
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9