# 目的
> 我们期望通过一些预定成熟的参数,来动态的显示表单布局。通过简单的参数发挥最大的功能,做更多的事情。
# 整体效果图

> 当前布局的配置参数详见[附录1](#附录1)
>
>详细代码,请查看源码,详细布局配置请查看 `HelloWorld.vue`
-----
# `ld-forms` 的属性
|关键字|类型|解释|默认值|是否必须|说明|
|-|-|-|-|-|-|
|form|Object|布局参数的数据值|{}|√|在编辑等情况下,需要打开页面就显示组件相关数据值,此时需要通过form来初始化表单数据值|
|layout|Array[Object]|布局参数|[]|√|整个表单需要显示的布局参数。是数组包含一组对象的集合,形如[{...},{...}...]|
|is-overflow-y|Boolean|是否显示纵向(y)滚动条|false|-|form表单的主体是否显示纵向(y)滚动条|
|show-tip-button|Boolean|是否显示提示按钮|false|-|位于表单的右上角提示按钮|
|show-default-tip|Boolean|是否显示默认tip文字|false|-|是否显示位于每个表单子元素组件上的解释说明文字信息|
|label-position|String|左侧文字位置|right|-|组件文字的位置;可选址为:left,right,top|
|label-width|String|左侧文字大小|100px||左侧文字大小|
|is-row|Boolean|是否是行模式|false||true:行模式,通常组件数量较少,且开启后会忽略label-position的值,通常用作布局界面的查询条件|
|cols|Number|form表单的列数|1||可选址为:1,2,3,4|
|save-forms-data-before|Function(data)|保存数据之前的修饰方法|||也可以通过全局配置。优先使用参数,如果该参数为空,则会使用全局配置函数|
|save-forms-data-after|Function(data)|保存数据之后的处理方法|||也可以通过全局配置。优先使用参数,如果该参数为空,则会使用全局配置函数|
|editor-forms-init-api|Object|编辑数据时配置参数|||详情见如下[editor-forms-init-api](##editor-forms-init-api)|
|editor-forms-init-after|Function|拉去编辑数据完成后触发事件||||
|auto-save|Boolean|是否自动保存|true|||
|auto-save-api|Object|自动保存时配置参数|||详情见如下[auto-save-api](##auto-save-api)|
|is-more-level-update-el-date|Boolean|是否强制刷新Date组件|false||【待定】当前组件封装层数过多时,element-date日期控件会出现不能及时刷新的问题,此时需要设置该属性为 true|
## editor-forms-init-api
> 在编辑数据时,通过该参数 ,可以自动加载表单初始值。比如通过di=3查询test/getById中的一条数据作为表单的初始值,配置如下
```javascript
{
//请求路径
remotePath: 'test/getUserById',
//请求参数
remoteParam: {id:3},
//请求方法
remoteMethodType: "get",
//得到数据后对数据的预处理
getDataAfter: (data) => {
return data.data;
}
}
```
## auto-save-api
> 在编辑数据时,通过该参数 ,可以使用内置方法调用保存
```javascript
{
//请求路径
remotePath: 'test/save',
//请求参数
remoteParam: {id:3},
//请求方法
remoteMethodType: "get",
//得到数据后对数据的预处理
getDataAfter: (data) => {
return data.data;
}
}
```
# 如何构建一个form表单 代码如下
```javascript
```
>如上,只需要简单的几行代码,就可以构建一个form表单,当然目前这个表单还很稚嫩,我们需要通过设置`layout`参数值进行健壮它。
## `layout` 数据结构
```javascript
//格式
data(){
return {
layout:[
{},//组件属性
{},//组件属性
// ...
]
};
}
```
> 布局文件是 多个子项对象的集合,每个子项包含许多属性,通过属性控制布局显示。
## 通常`ld-forms`的子元素的每个对象都支持如下属性(见下表):
```javascript
//格式
data(){
return {
layout:[
{
//必填属性
prop:'name', //[String]
label:'姓名',//[String]
type:'text',//[String(`tip`|`datakey`|`slot`|`text`|`textarea`|`select`|`radio`|`checkbox`|`date`|`icon`|`tag`|`address`|`sysdate`|`image`|`number`|`switch`|`slider`|`rate`|`color`|`transfer`|`param`)]
//可选属性
visabled:true,//[Boolean?]true;
readonly:true,//[Boolean?]false;
//.....
}
]
};
}
```
### `ld-forms`的`子元素`通用属性说明
|关键字|类型|解释|默认值|是否必须|说明|
|-|-|-|-|-|-|
|prop |String|数据字段 | | √ |关键字,将会成为获取组件值的key,通常和数据库表中的字段名相同|
|label |String|左侧文字 | | √ |显示在表单组件左侧的说明文字|
|type |String|类型 | | √ |组件类型;当前支持21中组件`tip`,`datakey`,`slot`,`text`,`textarea`,`select`,`radio`,`checkbox`,`date`,`icon`,`tag`,`address`,`sysdate`,`image`,`number`,`switch`,`slider`,`rate`,`color`,`transfer`,`param`|
|require |Boolean|是否不为空 |false | |是否为空。true:不为空,false:可为空|
|placeholder|String|输入提示文字 | | |组组件输入提示文字。不设置,则会根据配置类型和`label`设置相关的值。如:'请输入xxx'和'请选择xxx'等|
|msg |String|错误提示文字 | | |组件校验错误提示文字。当非空校验通过时,不满足其他校验条件时显示|
|visabled |Boolean|是否显示 |true | |是否显示;true:显示,false:隐藏|
|readonly |Boolean|是否只读 |false | |是否只读;true:只读,false:可操作|
|disabled |Boolean|是否禁用 |false | |是否禁用;true:禁用,false:可操作;作用和readonly作用相同,通常只需设置一个属性即可|
|regex |RegExp,String,function |数据校验 | | |校验当前组件值;RegExp:如`/^[1][0-9]{10}$/`校验手机号码;String:如`"/^[1][0-9]{10}$/"`会被断定为正则表达式,"abc"会被断定为字符串,进行值比较;function:如`function(val){ return true }`设置函数,在函数中会获得当前组件的值`val`,需要返回一个true或者false |
|tip |String|辅助提示文字 | | |显示在当前组件顶部的辅助解释内容,可以使html字符串|
|tipClass |String|辅助提示文字样式 | | |通常配置`tip`使用,多个class名称,中间用空格隔开|
|css |String|class样式 | | |设置当前组件的class样式|
|style |String|style样式 | | |设置当前组件的style样式|
|prepend |String|前缀| | |设置输入数据的前缀,长度不宜过长,控制在1-3个字符。如果字符过多则推荐使用插槽处理|
|append |String|后缀| | |设置输入的单位等,长度不宜过长,控制在1-3个字符。如果字符过多则推荐使用插槽处理|
|width |String|宽度| | |整个子组件的宽度|
# `ld-forms`支持的组件类型(`v1.0.0`)
> 当前支持21种组件类型,且每种的组件类型都支持`通用属性`(见上表)
## tip
- type=`tip`:文字提示内容;可以在from表单中独居一个form子元素,也可用来说明某一个元素相关信息;
```javascript
//格式
data(){
return {
layout:[
{
//必填属性
prop:'tip', //[String]
label:'提示文字',//[String]
type:'tip',
tip:`
这是一段测试文字
`,
tipClass:'tip-p b-p1',//可为空,默认为当前样式
}
//....更多组件内容
]
};
}
```

----
## slot
- type=`slot`:插槽;通过指定定`prop`值,来自定义表单内容
```javascript
```

> 通过自定义插槽实现个性化内容;
----
## text
- `text`:文本输入框;
```javascript
data() {
return {
layout: [{
//必填属性
prop:'userName', //[String]
label:'姓名',//[String]
type:'text'
},
//....更多组件内容
],
forms: {},
}
}
```

### type=`text` 特有属性
|关键字|类型|解释|默认值|是否必须|说明|
|-|-|-|-|-|-|
|password|Boolean|是否密码输入框|false|||
----
----
## textarea
- `textarea`:文本域;
```javascript
data() {
return {
layout: [{
//必填属性
prop:'remake', //[String]
label:'备注',//[String]
type:'textarea',
rows:4
},
//....更多组件内容
],
forms: {},
}
}
```

### type=`textarea` 特有属性
|关键字|类型|解释|默认值|是否必须|说明|
|-|-|-|-|-|-|
|rows|Number|文本域行数|4||文本域显示的行数,只是显示在界面上的可输入的行数,当超过设定的行数后会出现滚动条|
----
## select
- `select`:下拉框;
```javascript
data() {
return {
layout: [{
//必填属性
prop:'select', //[String]
label:'下拉框',//[String]
type:'select',
//方式一
options:[
{label:'文本一',value:'1'},
{label:'文本二',value:'2'},
{label:'文本三',value:'3'},
{label:'文本四',value:'4'},
],
//方式二.动态加载数据
getOptions:{
remotePath: 'test/getUserInfo', //请求方法
remoteMethodType: "get",//请求类型
remoteParam:{},//参数
label:'${nickName}(${phone})',//下拉框显示文字;比如有数据[{id:1,nickName:'张三',phone:'18888888888'}] => '张三(18888888888)'
value:'${id}', //此处的'${id}'<=>'id' 下拉框选项值;比如有数据[{id:1,nickName:'张三',phone:'18888888888'}] => '1'
}
},
//....更多组件内容
],
forms: {},
}
}
```

### type=`select` 特有属性
|关键字|类型|解释|默认值|是否必须|说明|
|-|-|-|-|-|-|
|options|Array[Object]|下拉框选项值|||下拉框options的选项值,object:{label:'',value:''},label:是现实出现的文字,value:是选择后获取到的值|
|getOptions|Object|远程加载下拉框选项值|||下拉框options的选项值[详情查看select的getOptions的示例代码](##select)|
|allowCreate |Boolean|是否允许用户创建新条目,需配合 filterable 使用|false||详情参考[Element-UI select的相关属性](https://element.eleme.cn/#/zh-CN/component/select)|
|filterable |Boolean|是否可搜索|false||详情参考[Element-UI select的相关属性](https://element.eleme.cn/#/zh-CN/component/select)|
|multiple |Boolean|是否多选|false||详情参考[Element-UI select的相关属性](https://element.eleme.cn/#/zh-CN/component/select)|
----
## radio
- `radio`:单选组;

### type=`radio` 特有属性
|关键字|解释|类型|默认值|是否必须|说明|
|-|-|-|-|-|-|
|options|Array[Object]|选项值|||options的选项值,object:{label:'',value:''},label:是现实出现的文字,value:是选择后获取到的值|
|getOptions|Object|远程加载选项值|||options的选项值,options的选项值与select值配置方式一致。[详情查看select的getOptions的示例代码](##select)|
|isButton |Boolean|是否按钮样式|false||上图左侧是按钮样式,有测试默认样式|
> 通过`isButton`来控制显示类型
----
## checkbox
- `checkbox`:复选组;

### type=`checkbox` 特有属性
|关键字|解释|类型|默认值|是否必须|说明|
|-|-|-|-|-|-|
|options|Array[Object]|选项值|||options的选项值,object:{label:'',value:''},label:是现实出现的文字,value:是选择后获取到的值|
|getOptions|Object|远程加载框选项值|||options的选项值与select值配置方式一致。[详情查看select的getOptions的示例代码](##select)|
----
## date
- `date`:日期组件;支持`Element-ui`中常见的日期类型

### type=`date` 特有属性
|关键字|类型|解释|可选址|默认值|是否必须|说明|
|-|-|-|-|-|-|-|
|align|String|对齐方式|left, center, right|left||对齐方式|
|dateType|String|日期类型|year/month/date/dates/ week/datetime/datetimerange/ daterange/monthrange|date||日期类型|
|pickerOptions|Object|当前时间日期选择器特有的选项参考下表||||想起参考[Element-UI的日期选择器picker-options](https://element.eleme.cn/#/zh-CN/component/date-picker)|
#### Picker Options
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|shortcuts|设置快捷选项,需要传入 { text, onClick } 对象用法参考 demo 或下表 |Object[]| —| —|
|disabledDate| 设置禁用状态,参数为当前日期,要求返回Boolean| Function |—| —|
|cellClassName| 设置日期的 className |Function(Date) |— |—|
|firstDayOfWeek| 周起始日 |Number |1 到 7| 7|
|onPick| 选中日期后会执行的回调,只有当 daterange 或 datetimerange 才生效 |Function({ maxDate, minDate })| —| —|
> 可以通过 `dateType`控制日期类型。
> 支持`year/month/date/dates/week/datetime/datetimerange/daterange/monthrange`
----
## icon
- `icon`:图标组件;使用上文提到的`ld-icon`实现图标选取


> 仅支持 通用属性
----
## tag
- `tag`:标签组;使用上文提到的`ld-tag`实现标签设置和录入

> 仅支持 通用属性
----
## address
- `address`:地址选择组件;使用上文提到的`id-address`实现标签设置和录入


> 仅支持 通用属性
----
## sysdate
- `sysdate`:系统日期;在使用创建日期和修改日期时非常有用;

### type=`sysdate` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|update|是否更新,true:会动态更新,false:只会在没有值得情况下获取数据|Boolean| true,false| —|
|dateType|日期类型 ,date:yyy-MM-dd ; time:HH:mm:ss ; datetime:yyyy-MM-dd HH:mm:ss |string| date,time,datetime| datetime|
> 创建日期会判断数据是否已经存在值,如果不存在则获取当前日期
> 修改日期会动态更新,保持获取最新的日期。
----
## image
- `image`:图片上传组;


### type=`image` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|limit|图片最大选择数量|Number|| 1|
|accept|文件类型|String||"image/x-png,image/gif,image/jpeg,image/jpg,image/bmp" |
|is-split|是否对图片进行分割处理。即:value字符串是否是多个图片地址|String|||
|split-chart|多个图片链接时的分割字符|String||,|
|getImagePath|获取图片的路径;对图片路径进行修改和补充,可通过全局设置`this.$ld.getImagePath`|function(image)||
|value|默认图片路径,如果为字符串,且为多个地址,则使用`split-chart`进行图片分割|String,Array||
### 当单独使用`ld-images`时,选中图片会触发`image`方法
```html
```
```javascript
//...
data(){
return {
images:['1.jpg','2.jpg'], //使用方式1
images2:'1.jpg,2.jpg',//使用方式2, 必须设置is-split=true;splitChart=',';
};
},
methods:{
image(e){
//选择图片后处理事件
}
}
```
---
## number
- `number`:计数器;

### type=`number` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|max|最大值|Number|| 1000|
|min|最小值|Number|| 0|
|precision|精度,小数点后保留位数|Number|| 0|
|step|步长|Number||1|
|stepStrictly|是否只能输入 step 的倍数[Element-UI计数器的step-strictly](https://element.eleme.cn/#/zh-CN/component/input-number)|Boolean||faslse|
---
## switch
- `switch`:开关;

### type=`switch` 特有属性
|参数|说明 |类型|可选值|默认值|是否必须|
|-|-|-|-|-|-|
|activeText|switch 打开时的文字描述|string|-|-|可为空|
|inactiveText|switch 关闭时的文字描述|string|-|-|可为空|
---
## slider
- `slider`:滑块;

### type=`slider` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|max|最大值|Number|| 1000|
|min|最小值|Number|| 0|
|showStops|显示间断点|Boolean||true|
|formatTooltip| 格式化 tooltip message|function(value)|-|-|
|marks|标记, key 的类型必须为 number 且取值在闭区间 [min, max] 内,每个标记可以单独设置样式[Element-UI滑块的marks](https://element.eleme.cn/#/zh-CN/component/slider)|object|-|-|
---
## rate
- `rate`:评分;

### type=`rate` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|showText|是否显示辅助文字,若为真,则会从 texts 数组中选取当前分数对应的文字内容|boolean|| false|
|showScore|是否显示当前分数,show-score 和 show-text 不能同时为真|boolean|| false|
|texts|辅助文字数组|array||['极差', '失望', '一般', '满意', '惊喜']|
|colors|icon 的颜色。若传入数组,共有 3 个元素,为 3 个分段所对应的颜色;若传入对象,可自定义分段,键名为分段的界限值,键值为对应的颜色|array/object||['#F7BA2A', '#F7BA2A', '#F7BA2A']|
---
## color
- `color`:颜色选择器;

### type=`color` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|showAlpha|是否支持透明度|boolean||true|
|predefine|预定义颜色|Array||['#ff4500','#ff8c00','#ffd700','#90ee90','#00ced1','#1e90ff','#c71585','rgba(255, 69, 0, 0.68)','rgb(255, 120, 0)','hsv(51, 100, 98)','hsva(120, 40, 94, 0.5)','hsl(181, 100%, 37%)','hsla(209, 100%, 56%, 0.73)','#c7158577']|
---
## transfer
- `transfer`:穿梭框;

### type=`transfer` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|title|标题,字符串是需要根据配置的分隔字符隔开|String,Array||['原数据','设置数据']或者'原数据\|设置数据'|
|options|预定义值|Array|||
|title|标题,字符串是需要根据配置的分隔字符隔开|String,Array||['原数据','设置数据']或者'原数据\|设置数据'|
|leftDefaultChecked|初始状态下左侧列表的已勾选项的 key 数组|array||[]|
|rightDefaultChecked|初始状态下右侧列表的已勾选项的 key 数组|array||[]|
---
## param
- `param`:参数;

### type=`param` 特有属性
|参数|说明 |类型|可选值|默认值|
|-|-|-|-|-|
|dataType|数据类型,注意是`dataType`,不是`dateType`和日期没有关系|String|object,array|-|
---
## datakey
- `datakey`:数据键;只用来在某些特定情况下显示数据;

> 用来显示表单主键,又不想用户能够直接看到主键值;
>
> 仅支持 通用属性
----
# `ld-forms`插槽
|slot name|类型|说明|插槽值|
|-|-|-|-|
|buttons|作用域插槽|表单的最后插槽,同来用来插入操作按钮|{Array}:layout布局信息;{Object}:form表单输入值|
|custom |作用域插槽|自定义表单所有子项内容,配置。这意味着,你需要自己来完成许多的表单内容|{Array}:layout布局信息;{Object}:form表单输入值|
|rowCustom |作用域插槽|对表单的整个行进行自定义。这意味着你需要自己来完成表单的每个子项|{Object}:item 表单子项布局信息|
|在布局中使用type=slot,插槽名=prop,如{type:'select',prop:'testInfo',label:'测试信息'},则插槽名为:'testInfo' |作用域插槽|对表单行的输入部分进行自定义|{Array}:layout布局信息;{Object}:form表单输入值;{Object}:item 表单子项布局信息|
|在布局中使用type=select,插槽名=options_${prop值},如{type:'select',prop:'testInfo',label:'测试信息'},则插槽名为:'options_testInfo'|作用域插槽|对表单行的下拉框选项值部分进行自定义|{Object}:option,下拉框的option信息|
[回首页](./README.md)
# `ld-forms`事件
## 组件联动和联动后的数据更改
> 通过在`layout`布局参数的子项中设置 `change`事件,来控制联动或联动后更新相关数据;
- 联动控制组件
```javascript
data(){
return {
layout:[
{
prop: 'testRadio',
type: 'radio',
label: '特殊资源',
options: [{
label: '线下场地免费',
value: '1'
},
{
label: '线上品牌商赞助',
value: '0'
}
],
//联动事件
change:(val,event)=>{
return {
//prop:{元素具备的属性}
addressName:{
visabled:val==1 //当 val==1时,将组件prop='addressName'组件的visabled(可见)设为true(显示)
},
sponsorship:{
visabled:val==0 //当 val==0时,将组件prop='sponsorship'组件的visabled(可见)设为true(显示)
},
}
}
},
{
prop: 'addressName',
type: 'textarea',
label: '场地名称',
visabled:true,
},
{
prop: 'sponsorship',
type: 'text',
label: '赞助商名称',
visabled:false,
},
]
};
}
```
- 联动控制整个表单的数据
```javascript
data(){
return {
layout:[
{
prop: 'testRadio',
type: 'radio',
label: '特殊资源',
options: [{
label: '线下场地免费',
value: '1'
},
{
label: '线上品牌商赞助',
value: '0'
}
],
//联动事件
change:(val,event)=>{
return {
/**
* 通过form关键字进行操作
* 可使用Function(value,event)函数 或者 Object对象进行操作
*
*/
//方式1: 通过Object进行设置
form:{
//prop:value
textInfo:value==1 ? '123456' : 'abcde'
},
//方式2;使用function(value,event)函数设置元素的值
form:(value,event)=>{
let form=event['form'];
form['textInfo']=val==1 ? '123456' : 'abcde';
return form;
}
}
}
},
{
prop: 'textInfo',
type: 'text',
label: '场地名称',
visabled:true,
},
]
};
}
```
- 联动控制整个表单的布局
```javascript
data(){
return {
layout:[
{
prop: 'testRadio',
type: 'radio',
label: '特殊资源',
options: [{
label: '线下场地免费',
value: '1'
},
{
label: '线上品牌商赞助',
value: '0'
}
],
//联动事件
change:(val,event)=>{
return {
/**
* 通过layout关键字进行操作
* 与from相似,同样可使用Function(value,event)函数 或者 Array对象进行操作
*
*/
//方式1: 通过Object进行设置
layout:[
//{}
{prop:'textInfo',type:'select',options:[{label:'测试1',value:'1'},{label:'测试2',value:'2'}],label:'修改为select'}
],
//方式2;使用function(value,event)函数设置元素的值
layout: (value, event) => {
let layout = event['layout'];
let item = layout.filter(item => item.prop == 'textInfo');
if (item.length <= 0) {
return layout;
}
let index = layout.indexOf(item[0]);
item=item[0];
//重新修改textInfo结构
item['type'] = val != 1 ? 'text' : 'select';
item['label'] = val != 1 ? '文本框': '修改为select';
item['readonly'] = false;
item['options'] = val != 1 ? [] : [{
label: '测试1',
value: '1'
}, {
label: '测试2',
value: '2'
}];
layout[index] = item;
return layout;
}
}
}
},
{
prop: 'textInfo',
type: 'text',
label: '场地名称',
visabled:true,
},
]
};
}
```
> 可以使用代码实现下图的效果

```javascript
```
## 自动保存数据所触发事件
### `saveFormsDataBefore` 保存数据之前修饰数据的方法
> 在自动保存数据之前,通过该函数,可以修改需要保存数据
> 可以通过重写`this.$ld.saveFormsDataBefore`(全局) 或者 通过`save-forms-data-before`参数设置函数
```javascript
this.$ld.saveFormsDataBefore=function(data){
data['createBy']="1";//为所有的保存数据添加创建人
return data;
}
```
### `saveFormsDataAfter` 保存完数据之后处理数据的方法
> 在自动保存数据之后,通过结果处理信息
> 可以通过重写`this.$ld.saveFormsDataAfter`(全局) 或者 通过`save-forms-data-after`参数设置函数
```javascript
this.$ld.saveFormsDataAfter=function(result){
if(result.code==0){
this.$message.success("保存成功!");
return;
}
this.$message.error("保存失败!");
return;
}
```
## 联动参数动态注入
> 当有一个远程加载数据和当前联动值相关时。需要改方法。
> 比如有如下场景。动态加载学生信息,且学生信息和用户选择的班级息息相关,即:只动态加载用户选择班级的学生信息。此时可以通过如下配置进行
```javasript
layout:[
//班级下拉框
{
prop:'classId',label:'班级',type:'select',
//班级数据动态获取
getOptions:{
remotePath: '/clzss/get', //请求方法
remoteMethodType: "get",//请求类型
remoteParam:{},//参数
label:'${names}(${id})',//下拉框显示文字;比如有数据[{id:1,nickName:'张三',phone:'18888888888'}] => '张三(18888888888)'
value:'${id}', //此处的'${id}'<=>'id' 下拉框选项值;比如有数据[{id:1,nickName:'张三',phone:'18888888888'}] => '1'
},
//联动事件
change:(val)=>{
return {
//当班级改变时,联动调用远程加载数据,加载 studentId的数据
changeOptions:{
prop:'studentId'
}
}
}
},
//学生下拉框
{
prop:'studentId',label:'学生名称',type:'select',
//学生数据动态获取
getOptions:{
remotePath: '/clzss/get',
remoteMethodType: "get",
//此时需要在这里指定需要注入的参数名称'${classId}',使用${xxx}来让系统识别是需要注入的内容,而注入的值则会从this.forms对象中获取
remoteParam:{'${classId}':''},//参数
label:'${names}',
value:'${id}',
},
}
]
```
# 附录1
```html
```
```javascript
layouts: [{
prop: 'id',
type: 'tip',
tip: `这是一段测试文字!`,
tipClass: 'tip-p b-p1',
label: 'tip',
showLabel: true
}, {
prop: 'id2',
type: 'datakey',
label: 'id'
}, {
prop: 'name',
type: 'text',
label: '姓名',
css: 'c-d',
style: 'color:red;',
tip: `姓名必须是3-6个字符
`,
tipClass: 'tip-d b-d1 p1 fs12',
require: true
}, {
prop: 'password',
type: 'text',
password: true,
tip: `密码必须是6-12个字符
`,
label: '密码'
}, {
prop: 'testSlot',
type: 'slot',
label: '测试插槽',
}, {
prop: 'testSelect',
type: 'select',
label: '下拉框',
options: [{
label: '男',
value: '1'
},
{
label: '女',
value: '0'
},
],
change: (val, event) => {
return {
height: {
label: val == '1' ? '男生身高' : '女生身高'
},
birthday: {
require: val == '1'
}
}
},
value: '1',
regex: (val) => {
return val == 1
},
require: true
},
{
prop: 'height',
type: 'text',
label: '身高',
},
{
prop: 'testSlider',
type: 'slider',
label: '滑块',
value: 50,
},
{
prop: 'rateTest',
type: 'rate',
label: '评分',
value: 3,
showScore: true
},
{
prop: 'birthday',
dateType: 'date',
type: 'date',
label: '出生日期',
value: "1994-3-25",
pickerOptions: {
shortcuts: [{
text: '去年',
onClick(picker) {
const start = new Date();
start.setFullYear(start.getFullYear() - 1);
picker.$emit('pick', start);
}
}, {
text: '今年',
onClick(picker) {
const date = new Date();
picker.$emit('pick', date);
}
}, {
text: '最近六个月',
onClick(picker) {
const start = new Date();
start.setMonth(start.getMonth() - 6);
picker.$emit('pick', start);
}
}]
},
require: true,
},
{
prop: 'menuIcon',
type: 'icon',
label: '菜单图标',
require: true,
},
{
prop: 'textNumber',
type: 'number',
label: '计数器',
placeholder: '折扣',
min: '1',
max: '10',
value: '1',
}, {
prop: 'switchTest',
type: 'switch',
label: '是否提醒',
value: 'true',
activeText: "开启",
inactiveText: "不开启",
}, {
prop: 'tagList',
type: 'tag',
label: '姓氏',
parseType: 'split',
value: '张|王|李|赵| 钱 |孙',
require: true,
},
{
prop: 'addressPath',
type: 'address',
label: '活动地址',
require: true,
},
{
prop: 'createdTime',
dateType: 'dateTime',
type: 'sysdate',
label: '创建日期',
update: false,
value: '2021-03-26 09:28:00'
},
{
prop: 'updatedTime',
dateType: 'dateTime',
type: 'sysdate',
label: '修改日期',
update: true,
value: '2021-03-26 09:28:00'
},
{
prop: 'testRadio',
type: 'radio',
label: '特殊资源',
isButton: true,
options: [{
label: '线下场地免费',
value: '1'
},
{
label: '线上品牌商赞助',
value: '0'
}
],
value: '1',
require: true,
change:(val,event)=>{
return {
addressName:{
visabled:val==1
},
sponsorship:{
visabled:val==0
},
}
}
},
{
prop: 'addressName',
type: 'textarea',
label: '场地名称',
visabled:true,
},
{
prop: 'sponsorship',
type: 'text',
label: '赞助商名称',
visabled:false,
},
{
prop: 'testRadio2',
type: 'radio',
label: '特殊资源2',
options: [{
label: '线下场地免费',
value: '1'
},
{
label: '线上品牌商赞助',
value: '0'
}
],
value: '1',
require: true,
},
{
prop: 'colorTest',
type: 'color',
label: '色板',
},
{
prop: 'testCheckBox',
type: 'checkbox',
label: '活动性质',
options: [{
label: '美食/餐厅线上活动',
value: '1'
},
{
label: '地推活动',
value: '2'
},
{
label: '线下主题活动',
value: '3'
},
{
label: '单纯品牌曝光',
value: '4'
},
],
parseType: 'split',
require: true,
value: "1|2 |4 "
}, {
prop: 'orderBy',
type: 'param',
label: '排序列',
dataType: 'object',
parseType: 'json',
value: JSON.stringify({
"sort": "asc"
})
}, {
prop: 'likeys',
type: 'param',
label: '数组',
dataType: 'arra',
parseType: 'json',
value: JSON.stringify(["参数。。。", "参数1"])
}, {
prop: 'remake',
type: 'textarea',
password: true,
label: '备注信息',
regex: /^.{4,}$/,
rows: 5
}, {
prop: 'photo',
type: 'image',
label: '头像',
limit: 4,
}, {
prop: 'dataInfo',
type: 'slot',
label: '表单数据',
},
{
prop: 'transferTest',
type: 'transfer',
label: '穿梭框',
parseType: 'split', //-------------
options: [{
label: '菜单编辑',
value: '1'
},
{
label: '菜单修改',
value: '2'
},
{
label: '菜单新增',
value: '3'
},
],
splitChart: ','
}
]
```