ant弹窗_vue ant design 封装弹窗表单用法

:visible="true"

:title='title'

@ok="handleOk('ok')"

@cancel="handleOk('return')"

:centered="true"

:confirmLoading="confirmLoading"

:width="width">

:label="itme.label"

v-if="itme.type === 'input'"

:label-col="{ span: itme.labelCol ? itme.labelCol : 5 }"

:wrapper-col="{ span: itme.wrapper ? itme.wrapper : 17 }">

v-decorator="[itme.value, { rules: [{

required: itme.required?itme.required:false,

message: itme.message?itme.message:' ' },

{validator: itme.validator}]}]"

:placeholder="!itme.placeholder ? itme.label : itme.label"

allowClear>

v-if="itme.select && itme.select.length>0"

slot="addonBefore"

v-decorator="[ itme.header ]"

style="width: 90px">

{ {select.label}}

:placeholder="!itme.placeholder ? itme.label : itme.placeholder"

showTime

:style="`width: ${!itme.wrapper?'320':itme.wrapper}px;`"

v-decorator="[itme.value, { rules: [{ required: itme.required?itme.required:false, message: itme.message?itme.message:' ' }]}]" />

:label="itme.label" v-if="itme.type === 'datePicker'">

:style="`width: ${!itme.wrapper?'180':itme.wrapper}px;`"

v-decorator="[ itme.value, { rules: [{ required: itme.required?itme.required:false, message: itme.message?itme.message:' ' }]}]"

showTime

:placeholder="!itme.placeholder ? itme.label : itme.placeholder" />

:label="itme.label"

v-if="itme.type === 'select'"

:label-col="{ span: itme.labelCol ? itme.labelCol : 5 }"

:wrapper-col="{ span: itme.wrapper ? itme.wrapper : 8 }">

allowClear

v-decorator="[ itme.value, { rules: [{

required: itme.required?itme.required:false,

message: itme.message?itme.message:' ' }]}]"

:placeholder="!itme.placeholder ? itme.label : itme.placeholder">

{ {optionItme.label}}

v-decorator="[ itme.value, { rules: [{ required: itme.required?itme.required:false, message: itme.message?itme.message:' ' }]}]">

{ {radioItme.label}}

:label="itme.label"

v-if="itme.type === 'upload'"

:label-col="{ span: itme.labelCol ? itme.labelCol : 5 }"

:wrapper-col="{ span: itme.wrapper ? itme.wrapper : 20 }">

v-decorator="[ itme.value, { valuePropName: 'fileList', getValueFromEvent: normFile, }]"

:action="itme.action?itme.action:'https://www.mocky.io/v2/5cc8019d300000980a055e76'"

listType="picture-card"

@preview="handlePreview">

点击上传图片

example

import { Component, Vue, Prop, Emit, Watch } from 'vue-property-decorator';

import Moment from 'moment'

function getBase64(file) {

return new Promise((resolve, reject) => {

const reader = new FileReader();

reader.readAsDataURL(file);

reader.onload = () => resolve(reader.result);

reader.onerror = error => reject(error);

});

}

@Component({

data() {

return {

formState: this.$form.createForm(this),

previewVisible: false,

previewImage: ''

};

},

})

export default class FormForm extends Vue {

[x: string]: any;

// 弹出框宽度

@Prop({type: String, default: '500px'}) width!: string;

// 接收表单渲染内容数据

@Prop({type: Object, default: () => {console.log()}}) form!: {};

// 接收弹窗窗口标题

@Prop({type: String, default: '操作窗口'}) title!: string;

// 接收表单渲染内容格式

@Prop({type: Array, default: () => []}) formData!: [];

// 返出取消和确定按钮

@Emit('handleOk')

handleOk(e) {

if (e === 'return') {

return 'true';

} else if (e === 'ok') {

let stateType: object | boolean = false;

this.formState.validateFields((err, value) => {

if (!err) {

this.confirmLoading = true;

stateType = value;

}

})

return stateType;

}

}

// 监听表单渲染内容数据接入 + 转换多余传入问题

@Watch('form', {immediate: true, deep: false})

onForm(e) {

let obj: object = {};

Object.keys(e).forEach(key => {

Array.from(this.formData).forEach((res: any | object) => {

if (key === res.value || key === res.header) {

if (res.type === 'rangePicker' && e[key].length > 0) {

e[key] = [ Moment(e[key][0]), Moment(e[key][1]) ]

}

if (res.type === 'datePicker' && e[key]) {

e[key] = Moment(e[key])

}

obj[key] = e[key]

}

})

})

this.$nextTick(() => {

this.formState.setFieldsValue(obj)

})

}

// 监听是否弹窗属性

public visibleOff: boolean = false;

// 确定按钮loading

public confirmLoading: boolean = false;

// --------- methods ------------

async handlePreview(file) {

if (!file.url && !file.preview) {

file.preview = await getBase64(file.originFileObj);

}

this.previewImage = file.url || file.preview;

this.previewVisible = true;

}

normFile(e) {

if (Array.isArray(e)) {

return e;

}

return e && e.fileList;

}

}

.ant-form-item-label{

white-space: pre-wrap;

line-height: 25px;

}

.ant-row{

display: flex;

align-items: center;

}

.ant-form{

max-height: 60vh;

overflow: auto;

&::-webkit-scrollbar {

display: none;;

}

}

.ant-form-item{

margin-bottom: 10px;

}

.ant-form-item-control{

left: 10px;

max-height: 225px;

overflow: auto;

&::-webkit-scrollbar{

display: none;

}

}

.ant-upload-select-picture-card i {

font-size: 32px;

color: #999;

}

.ant-upload-select-picture-card .ant-upload-text {

margin-top: 8px;

color: #666;

}

你可能感兴趣的:(ant弹窗)