easy-element-ui
Version:
base on Element-UI
1,264 lines (1,150 loc) • 31.5 kB
Markdown
# easy-element-ui
#### Author: Shinn
#### Email: 164888051@qq.com
<br>
#### This package was based on Element-UI.2.5.10
<br>
## Make sure you understand Element-UI before using it
For easy and fast Html page development, <br>
This library refers to the design idea of E-charts Options, <br>
Now, you can use the library by configuring Json parameters, <br>
To render your background application page,
And monitor the Change and Click events of each component in real time,<br>
Don't worry about component configuration of Element-UI <br>
When you develop background level pages in the future, you will often have less than 100 lines of page code, <br>
You only need to introduce one component to render the entire page, <br>
If the page is long, you can put the prop json object information of the form or table, <br>
Put it into a separate js file and import it via import. <br>
Easy to adjust layout and modify page elements.
<br>
## 使用前请确认您对 Element-UI 有所了解
<br>
为了方便和快速开发 Html 页面,<br>
本库参考了 E-charts Options 的设计思想,<br>
现在,你可以使用本库通过配置Json参数的方式,<br>
来渲染您的后台级应用页面,
并实时监听每个组件的 Change 及 Click 事件,<br>
无需去关心 Element-UI 的组件配置<br>
当你未来开发后台级页面时,往往可让你页面代码不足 100 行,<br>
只需要引入一个组件即可渲染整个页面,<br>
如果页面很长,可以将 form 或 table 的 prop json 对象信息,<br>
放到一个单独的 js 文件,通过 import 引入即可,<br>
方便调整布局,和修改页面元素。
<br>
#### 目前已封装进 CommonForm 的组件为:
#### 如果有特殊需求,可配合 slot 组件进行自定义开发,slot 可以嵌套任何组件,理论上满足一切需求,若使用 slot 组件,change 和 click 事件监听需要自己实现
<br>
<pre>
Radio 单选框
Checkbox 多选框
Input 输入框
InputNumber 计数器
Select 选择器
Cascader 级联选择器
Switch 开关
Slider 滑块
TimePicker 时间选择器
DatePicker 日期选择器
DateTimePicker 日期时间选择器
Upload 上传
Text 文本组件
Slot 自定义组件
</pre>
<br>
## For Update Info
<br>
<details>
<summary>Version Update Notes</summary>
```javascript
v1.2.7
CommonForm
修复在日期组件中,disabledDate不填写报错的问题
v1.2.6
CommonForm
所有组件show属性现在可以为函数类型,用于判断是否显示
date相关组件中的data属性里新增disabledDate:(item, index, time)=>boolean,用于判断日历显示的每一个时间点是否禁止点击,true为禁止,false为可点击
CommonTable
type=button时
button新增show,show可以为boolean类型,也可以为(btnItem,tableIndex,tableItem)=>boolean函数类型,用于判断按钮是否显示
button新增disabled,disabled可以为boolean类型,也可以为(btnItem,tableIndex,tableItem)=>boolean函数类型,用于判断按钮是否禁用
button删除condition属性
v1.2.5
CommonForm
select组件添加远程搜索功能
v1.2.4
CommonForm
修改组件错别字
v1.2.2
CommonForm
select组件 新增filteralbe auto_create属性
v1.2.1
CommonForm
每个子组件的id值 不在需要必填,不填时将默认生成随机id
v1.1.9
CommonTable
prop 补充相关说明文档
v1.1.8
CommonTable
新增show_overflow_tooltip,用于设置column文字是否单行显示
v1.1.7
CommonTable
新增empty_text,设置没有数据时显示的提示文字,
新增fixed,用于固定某个列的位置
新增sort_method,用于自定义排序方法
新增resizable,用于控制是否可以手动改变列的宽度
新增align,设置对齐方式
v1.1.5
CommonTable
新增column_key,用于配合onFilterChange,监听事件触发对应的列
v1.1.4
CommonTable
新增table_rate控制table的尺寸大小 medium,small,mini
新增filters
新增filter-method
新增filter-multiple
新增事件onFilterChange
v1.1.1
CommonForm
Input组件新增show_password属性,用于显示/隐藏密码
v1.1.0
CommonForm
新增方法values() =>返回form_prop数组中以value为key的对象,方便操作每一个元素的具体属性,调用方式为this.$refs["common-form"].values()
v1.0.26
CommonForm
新增组件类型datetime_picker
v1.0.25
CommonForm
prop新增属性show 控制组件的显示和隐藏
v1.0.24
CommonTableView新增方法
clearAll() //清除所有已选状态
refreshTableSelectState() //更新当前页的选中状态
v1.0.21
Select组件 添加multiple,调整data结构,请重新调整Select data数据结构
v1.0.20
CommonTableView 添加 sortable属性,支持默认排序
修复Select组件 options disabled失效的问题
v1.0.19
调整ReadMe document
v1.0.10
所有组件支持自定义Style,
但不是所有Style都会生效,
某些样式仍需要通过::v-deep or /deep/ or >>> 等命令
通过样式穿透强制修改
删除了部分设置,统一都有Style配置
All components support custom Style,
But not all styles work,
Some styles still require the command ::v-deep or /deep/ or >>>
Force changes through style penetration
Deleted some Settings, unified all have the Style configuration
```
</details>
<br>
## How to use?
<br>
```
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import EasyElementUI from "easy-element-ui"
Vue.use(ElementUI);
Vue.use(EasyElementUI)
```
<br/>
## CommonForm
<br>
<details>
<summary>Event Listener Detals</summary>
```javascript
changeUploadState(obj); //obj=>{item_id,obj,value}上传组件各状态监听
changeValue(obj); //obj=>{item_id,obj,value}组件中 value 改变的事件
clickButton(obj); //obj=>{item_id,child_id,obj}组件中按钮的点击事件
```
</details>
<br>
<details>
<summary>Methods Details</summary>
```javascript
validate();
values(); //获取form_prop数组以value为key的对象,方便操作对应元素
//example:
this.$refs[your_common_form_ref_name].validate().then((res) => {
console.log(res); //res is- true or false
});
```
</details>
<br>
<details>
<summary>Props Details</summary>
```javascript
form_ref_name: {
//默认form的ref名称
type: String,
default: "common-form",
},
form_item_span: {
//默认一个组件占据的span的大小
type: Number,
default: 12,
},
label_position: {
//form_label的显示位置
type: String,
default: "left", //left right top
},
label_end: {
//form_label的结尾添加字符
type: String,
default: "",
},
label_width: {
//form_label的默认宽度 默认70 可修改
type: Number,
default: 70,
},
form_value: {
//整个页面对应的value,与form_prop一一对应
type: Object,
default: () => {},
},
form_prop: {
//整个页面的组件结构树及参数列表,必填
type: Array,
default: [],
}
form_column_style: {
//自定义Style
type: Object,
default: () => {},
}
```
</details>
<br>
<details>
<summary>FormProp Details</summary>
```javascript
//数组中的每个对象都是一个组件,最外层属性是所有组件通用的属性,
//data是组件特有的属性
//所有id改为非必填 不填id时将自动生成id
[
{
//输入框 通用属性 Common propertys
id: 1, //【非】必填 不可重复 可以是任何数据类型 id不存在时 将自动生成id
label: "name",//form_label_name
type: "input", //必填
value: "name", //对应 form_value 里的 key
place_holder: "",//默认提示文字
span: 12,//宽度,采用24栅格模式
offset: 0,//间隔多少格
show:true,//不传或者true 为显示组件 否则隐藏组件
show:()=>{//show属性也可以是函数 用于判断是否显示
/**
* 判断逻辑
*/
return true
},
label_width: 100,//form_label的宽度
required: false,//if require=true, then rule will be unused
rule: [
//当你配置了rule,require属性将失效
//配置方法请参考标准化rule配置规则,自行搜索寻找教程
{
required:true.
trigger: "change",
validator: (rule, value, callback) => {
if (value.length == 2) {
callback(new Error("error"));
} else {
callback();
}
},
},
],
rule_description:"",//require=true时,修改默认错误提示文案
break: true, //true 代表之后的组件需要另起一行 newline
style: {
//自定义style,将作用于组件本身
border: "1px solid #f00",
"padding-bottom": "20px",
},
form_item_style:{
//form-item-style,将作用于form_item,也就是form_label+组件
"margin-bottom": "20px",
"padding-bottom": "20px",
border: "1px solid #0f0",
},
//data里的所有属性都是,该组件独享属性,后续组件都如此
data: {
type: "text",
show_password:false,//是否显示密码
autosize: true, //{ minRows: 2, maxRows: 6 }
pre_icon: "el-icon-search",
disabled: false,
max_length: 200, //输入长度
clearable: false,
slot_custom_append: true, //自定义组件样式
slot_custom_prepend: true,
slot_custom_append_name: "",
slot_custom_prepend_name: "",
//如果自定义组件样式,下面属性全部失效
slot_append: true, //后面添加组件 默认button
slot_prepend: true, ///前面添加组件 默认button
slot_append_icon: "el-icon-search",
slot_append_name: "Search",
slot_append_style:{},
slot_prepend_icon: "el-icon-search",
slot_prepend_name: "Search",
slot_prepend_style:{},
press_action: "", //点击事件发起方 append或prepend
},
},
{
//选择框
id: 2,
label: "state",
value: "state",
type: "select",
data: [
remote_method: //远程搜索方法
(query) => {
this.$refs["common-form"].values()["state"].data.list = [
{ id: 1, label: "1", value: "1" },
{ id: 2, label: "2", value: "2" },
{ id: 3, label: "3", value: "3" },
];
},
remote: true,//是否开启远程搜索
disabled:false,
list: [
{ id: 1, label: "true", value: "true" },
{ id: 2, label: "false", value: "false", disabled: false },
],
filterable:true,//是否支持搜索
allow_create:false,//是否支持创建
multiple: true,
],
},
{
//开关选择器
id: 3,
label: "switch",
value: "switch",
type: "switch",
data: {
disabled: false,
},
},
{
//按钮
id: 4,
type: "button",
data: [
{
id: 1,
label: "Search",
type: "primary", //primary danger warning info null
disabled: false,
style:{'font-size':'20px'}
},
{ id: 2, label: "Reset" },
],
},
{
//时间范围选择器
id: 5,
label: "time",
value: "datetimerange",
type: "datetimerange",
data: {
start: "Start Time",
end: "End Time",
separator: "-",
disabled: false,
disabledDate:(item, index, time)=>boolean,//判断日历上的是否可点击,true为禁止点击
},
},
{
//日期范围选择器
id: 6,
label: "time",
value: "daterange",
type: "daterange",
data: {
start: "Start Time",
end: "End Time",
separator: "-",
disabled: false,
disabledDate:(item, index, time)=>boolean,//判断日历上的是否可点击,true为禁止点击
},
},
{
//日期选择器
id: 7,
label: "time",
value: "date",
type: "date",
disabled: false,
data:{
disabledDate:(item, index, time)=>boolean,//判断日历上的是否可点击,true为禁止点击
}
},
{
//插槽
id: 8,
type: "slot",
slot_name: "slot1",
data:{
//custom value
}
},
{
//单选-圆钮
id: 9,
label: "radio",
type: "radio",
data: [
{ id: 1, label: "option 1", value: "1", style: {}, disabled: false },
],
},
{
//单选-按钮
id: 9,
label: "radiobutton",
type: "radiobutton",
data: [
{ id: 1, label: "option 1", value: "1", style: {}, disabled: false },
],
},
{
//多选-圆钮
id: 10,
label: "checkbox",
type: "checkbox",
value:[],
data: [{ id: 1, label: "option 1", value: "1", disabled: false ,style: {} }],
},
{
//多选-按钮
id: 11,
label: "checkboxbutton",
type: "checkboxbutton",
value:[],
data: [{ id: 1, label: "option 1", value: "1", disabled: false,style: {} }],
},
{
//数字选择器
id: 12,
type: "number",
data: {
disabled: false,
min: 1,
max: 10,
step: 2,
precision: 3, //小数点 精度
position: "right", //加减号位置
},
},
{
//输入框-输入建议
id: 13,
label: "auto-complete",
type: "input-auto-complete",
data: {
disabled: false,
trigger_on_focus: false,
placement: "top",
pre_icon: "el-icon-search",
clearable: false,
max_length: 10,
list: [
{ value: "1" },
{ value: "2" },
{ value: "4" },
{ value: "5" },
],
},
},
{
//多层级单/多选框
id: 14,
label: "cascader",
type: "cascader",
data: {
clearable: true,
trigger: "click", //层级展现方式 click|hover
show_all_levels: true, //是否选中节点显示完整路径
multiple: true, //是否启动多选
collapse_tags: false, //是否折叠显示结果
strict: true, //是否启动单选
disabled: false,
list: [
{
value: "zhinan",
label: "指南",
disabled: true,
children: [
{
disabled: true,
value: "1",
label: "1",
},
{
value: "2",
label: "2",
},
],
},
],
},
},
{
id: 15,
type: "slider",
label: "test",
value: "test",
data: {
disabled: false,
min: 0,
max: 100,
step: 10, //步长
disabled: false,
show_tooltip: true, //是否显示提示框
show_stops: true, //是否显示停顿点
show_input: false, //是否显示输入框
vertical: false, //横竖模式
range: true, //范围模式
height: 200, //如果是范围模式 此值必填
marks: {
0: "0°C",
8: "8°C",
37: "37°C",
50: {
style: {
color: "#1989FA",
},
label: this.$createElement("strong", "50%"),
},
},
format_tooltip: (val) => val * 10, //tooltip显示文字的格式化
},
},
{
//时间选择器(hour:minute:second)
id:16,
type: "time",
label: "Time",
value: new Date(2022, 11, 22, 18, 0),
data:{
disabled: false,
selectableRange:'00:00:00 - 23:59:59',
}
},
{
//文本组件
id:17,
type: "text",
label: "text",
value: "",
},
{
//上传组件
id:18,
type:"upload",
label:"upload",
data:{
disabled: false,
auto_upload:true,
action:"url",
multiple:true,
disabled:false,
limit:1,
file_list:""
button_name:"",
button_style:{},
tip:"",
tip_style:{}
}
},
{
id:19,
type: "time_picker",
label: "time_picker",
value: "",
data: {
disabled: false,
selectableRange: {
start: "00:00",
step: "00:01",
end: "24:00",
},
},
},
{
id:20,
type: "time_picker_range",
label: "time_picker_range",
value: "",
data: {
start: "Start Time",
end: "End Time",
separator: "-",
disabled: false,
},
},
{
id:21,
type: "datetime_picker",
label: "datetime_picker",
value: "",
data: {
disabledDate:(item, index, time)=>boolean,//判断日历上的是否可点击,true为禁止点击
picker_options:{
//详见element-ui官方文档
},
disabled: false,
},
},
]
```
</details>
<br>
<details>
<summary>CommmonForm Example</summary>
```javascript
<template>
<CommonForm
ref="common-form"
:form_prop="form_prop"
:form_value="form_value"
:form_item_span="7"
label_position="left"
label_end=":"
>
</CommonForm>
</template>
form_value = {
name: "",
number: "",
state: "",
text: "",
cascader: "",
auto: "",
date: "",
checkbox: [],
datetime: [],
daterange: [],
radio: "",
switch: true,
time: "", //new Date(2022, 11, 22, 18, 0)
}
form_prop: [
{
id: 1,
type: "input",
label: "Name",
value: "name",
label_width: 70,
required: true,
form_item_style: {
"margin-bottom": "20px",
},
style: {
"font-size": "20px",
},
data: [
{ id: 1, label: "true", value: "true" },
{ id: 2, label: "false", value: "false" },
],
},
{
id: 2,
type: "select",
label: "State",
value: "state",
required: true,
offset: 1,
form_item_style: {
border: "1px solid #f00",
"padding-bottom": "20px",
},
data: [
list: [
{ id: 1, label: "true", value: "true" },
{ id: 2, label: "false", value: "false", disabled: false },
],
multiple: true,
],
},
{
id: 3,
type: "button",
break: true,
required: true,
style: {
position: "relative",
left: "-20px",
},
data: [
{
id: 1,
label: "Search",
type: "primary",
style: { "font-weight": "bold" },
},
{
id: 2,
label: "Reset",
type: "default",
style: { color: "#f00" },
},
],
},
{
id: 4,
type: "datetimerange",
label: "Alert Time",
value: "datetime",
label_width: 100,
required: true,
data: {
separator: "-",
},
},
{
id: 5,
type: "time",
label: "Time",
value: "time",
offset: 1,
required: true,
},
{
id: 8,
type: "daterange",
label: "Date Range",
value: "daterange",
label_width: 120,
offset: 1,
required: true,
data: {
separator: "-",
},
},
{
id: 6,
type: "text",
label: "Text",
style: {
"font-size": "20px",
},
value:
"This is a paragraph,This is a paragraph,This is a paragraph,This is a paragraph,This is a paragraph,This is a paragraph,",
},
{
id: 7,
type: "switch",
label: "switch",
value: "switch",
offset: 1,
required: true,
},
{
id: 9,
type: "date",
label: "date",
value: "date",
offset: 1,
required: true,
},
{
id: 10,
label: "radio",
type: "radio",
value: "radio",
offset: 1,
required: true,
data: [
{
id: 1,
label: "option 1",
value: "1",
style: {},
},
{
id: 2,
label: "option 2",
value: "2",
style: {},
},
],
},
{
id: 11,
label: "checkbox",
type: "checkbox",
value: "checkbox",
offset: 1,
label_width: 100,
required: true,
break: true,
data: [
{
id: 1,
label: "option 1",
value: "1",
disabled: false,
style: {},
},
{
id: 2,
label: "option 2",
value: "2",
disabled: false,
style: {},
},
],
},
{
id: 12,
type: "number",
value: "number",
required: true,
label: "number",
data: {
min: 1,
max: 10,
step: 2,
precision: 3, //小数点 精度
position: "right", //加减号位置
},
},
{
id: 13,
label: "auto-complete",
type: "input-auto-complete",
value: "auto",
label_width: 150,
offset: 1,
required: true,
data: {
disabled: false,
trigger_on_focus: false,
placement: "top",
pre_icon: "el-icon-search",
clearable: false,
max_length: 10,
list: [
{ value: "1" },
{ value: "2" },
{ value: "4" },
{ value: "5" },
],
},
},
{
//多层级单/多选框
id: 14,
label: "cascader",
type: "cascader",
value: "cascader",
offset: 1,
required: true,
label_width: 100,
data: {
clearable: true,
trigger: "click", //层级展现方式 click|hover
show_all_levels: true, //是否选中节点显示完整路径
multiple: true, //是否启动多选
collapse_tags: false, //是否折叠显示结果
strict: true, //是否启动单选
disabled: false,
list: [
{
value: "zhinan",
label: "指南",
disabled: true,
children: [
{
disabled: true,
value: "1",
label: "1",
},
{
value: "2",
label: "2",
},
],
},
],
},
},
],
```
</details>
<br>
## CommonTableView
<br>
<details>
<summary>Event Listener Details</summary>
```javascript
onClickButton(obj); //obj->{id,row} 按钮点击事件监听
onPageChange(v); //页面切换事件
onFilterChange(obj); //筛选菜单事件监听
onRowClick(obj); //某一行被点击的事件
```
</details>
<br>
<details>
<summary>Methods Details</summary>
```javascript
init(array); //set select values
clearAll(); //清除所有已选状态
setCurrentRow(row); //设置table的单选状态,不传row则取消当前高亮选中
refreshTableSelectState(); //更新当前页的选中状态
```
</details>
<br>
<details>
<summary>Props Details</summary>
```javascript
table_page: {
//当前页码
type: Number,
default: 1,
},
table_size: {
//每页条数
type: Number,
default: 10,
},
table_total: {
//总条数
type: Number,
default: 0,
},
empty_text: {
type: String,
default: "",
},
page_button_count: {
//翻页组件 最多显示几个页码按钮
type: Number,
default: 7, //center left right
},
page_position: {
//翻页组件的显示位置
type: String,
default: "center", //center left right
},
show_page: {
//是否显示page组件
type: Boolean,
default: false,
},
table_highlight_current_row: {
//是否高亮当前行
type: Boolean,
default: false,
},
key_name: {
//多选,收集的值 对应list里的key
type: String,
default: "id",
},
table_select_list: {
//默认选择数据 内容需与key_name的值对应 用于自动更新
type: Array,
default: [],
},
table_rate: {
//表格的尺寸大小
type: String,
default: "medium",
},
table_ref_name: {
//默认table的ref名称
type: String,
default: "base-common-table",
},
table_max_height: {
//最大高度 默认auto
type: String,
default: "auto",
},
table_stripe: {
//是否显示stripe
type: Boolean,
default: true,
},
table_border: {
//是否显示Tableview的边框
type: Boolean,
default: true,
},
table_list: {
//list数据
type: Array,
default: [],
},
table_prop: {
//table渲染list
type: Array,
default: [],
},
```
</details>
<br>
<details>
<summary>TableProp Details</summary>
```javascript
{
id: 1,
label: "Operation",//form_label_name
type: "button",//button select text slot 4种组件类型 一般设置属性只对text和slot生效
min_width:200,
width:200,
sortable:false,//是否开启排序
resizable:true,//是否可以拖动列的宽度
column_key:"test",//一般这个值配合filter相关功能使用
fixed:"left",// true, left, right
align:"",//left/center/right
show_overflow_tooltip:false,//文字过多时,显示tooltip
slot_name: "slot1",//if you want to use slot, please set its name 如果使用了type=slot 需要设置slot_name 区分column
filters: [ //当前列 弹出的筛选菜单数组
{ text: "2016-05-01", value: "2016-05-01" },
{ text: "2016-05-02", value: "2016-05-02" },
{ text: "2016-05-03", value: "2016-05-03" },
{ text: "2016-05-04", value: "2016-05-04" },
],
filterMultiple: false, //是否支持多选
filterHandler: (value, row, column) => {
//选中后 的处理逻辑
return true;
},
sort_method:(a,b)=>{
return true
},
data: {
style: {
//单元格Style样式
"font-size": "14px",
"margin-right": "10px",
},
list: [
//type=button,设置按钮及其样式
{
id: 1,
label: "Manager",
font_size: "14px",
show:true,//是否显示
show:(btnItem,tableIndex,tableItem)=>{//是否显示
return true;
},
disabled:true,//是否禁用
disabled:(btnItem,tableIndex,tableItem)=>{//是否禁用
return true;
},
style: {},
},
{ id: 2, label: "Ignore" },
{ id: 3, label: "Delete", type: "delete" },
],
}
}
```
</details>
<br>
<details>
<summary>CommonTableView Example</summary>
```javascript
<template>
<CommonTableView
ref="common-table"
style="margin-top: 20px"
:table_prop="table_prop"
:table_list="table_list"
:table_select_list.sync="table_select_list"
:table_page="table_page"
:table_total="table_total"
:table_size="table_size"
:show_page="true"
>
<template v-slot:slot1="scope">
<div>{{ scope }}</div>
</template>
<template v-slot:slot2="scope">
<div>{{ scope }}</div>
</template>
</CommonTableView>
</template>
table_page: 1,
table_size:10,
table_total: 0,
table_select_list: [],
table_list: [
{ id: 1, name: "name", test: "a" },
{ id: 2, name: "name", test: "dfdffdf" },
{ id: 3, name: "name", test: "<font color='#ff0000'>tecst</font>" },
{
id: 4,
name: "name",
test: "123",
},
],
table_prop: [
{ id: 0, type: "select" },
{ id: 1, prop: "test", label: "Alert Time" },
{ id: 2, prop: "test", label: "Alert Content", min_width: 200 },
{ id: 3, prop: "test", label: "Level" },
{ id: 4, prop: "test", label: "Device Ip" },
{ id: 5, prop: "name", label: "Project" },
{ id: 6, prop: "test", label: "Group" },
{
id: 7,
prop: "test",
label: "Type",
type: "slot",
slot_name: "slot2",
},
{
id: 8,
prop: "test",
label: "Log File",
type: "slot",
slot_name: "slot1",
},
{
id: 9,
label: "Operation",
type: "button",
width: 190,
data: {
style: {
"font-size": "14px",
"margin-right": "10px",
},
list: [
{
id: 1,
label: "Manager",
style: {
color: "#ff0000",
},
},
{ id: 2, label: "Ignore" },
{ id: 3, label: "Delete" },
],
},
}
],
```
</details>
<br>
## Other Methods
<br>
<details>
<summary>Methods</summary>
```javascript
setLang("cn") //cn中文 en英文
setLog(true or false) // show Log
```
</details