万能表单生成器

GformCreator下

{this.$slots.default ? this.$slots.default :(
<div>
	<el-button type="primary" onClick={ e => this.doSubmit() } > 提交 </el-button>
	<el-button  onClick={ e => this.reset() } > 重置</el-button>
</div>
)}

两个事件,一个是提交事件doSubmit,一个是reset事件。

doSubmit() {

}

create.vue下
submit绑定doSubmit方法,绑定子组件

<GformCreator  @submit = "doSubmit" />

doSubmit(data) {
		console.log('提交事件触发',data
)}

GformCreator下

doSubmit() {
		let { submit } = this.$listeners;
		console.log(submit)
}

在这里插入图片描述
或者

this.$emit('submit',''数据2222)

在这里插入图片描述
在这里插入图片描述

两种组件间通信方式:一种是 e m i t , 一种是 emit,一种是 emit,一种是listener绑定很多东西,可以取

renderItem(item) {
		switch(item.type) {
				case 'input':
				case 'password':
				case 'textarea':
							return <el-input  type={item.type} > </el-input>
}}

把字段绑定在form上

data() {
	return {
			form: {}
	}
}
created() {
		const {items} = this.conf;
		items.forEach(rowArr => {
				rowArr.forEach(item => {
						this.$set(this.form,item.key,item.value)
})
})
}

挂载成功
在这里插入图片描述

renderItem(item) {
		switch(item.type) {
				case 'input':
				case 'password':
				case 'textarea':
							return <el-input  type={item.type} v-model ={this.form[item.key]} > </el-input>
}}

能写字了
在这里插入图片描述
获取表单数据

deepClone(data) {
	return JSON.parse(JSON.stringify(data));
}
doSubmit() {
	this.$emit('submit',this.deepClone(this.form))
}

在这里插入图片描述
model在jsx不能传递

const {title,items,rules} = this.conf
const {form} = this
<el-form  attrs={{model:form}}  rules = {rules} >

renderColums下

<el-form-item  prop={item.key}>

重置 render下的给一个ref

<el-form ref = "form" >

reset()函数

this.$refs.form.resetFields();

重置生效。
在这里插入图片描述

获取表单数据的另一种组件传值方法

dosubmit() {
	let { submit } = this.$listeners;
	submit(this.deepClone(this.form));
}
submit() {
	return this.deepClone(this.form)
}

submit() 改名为getData()
create.vue下的docreate()

doCreate() {
	let res = this.$refs.getData();
}

验证

validate(fn) {
		this.$refs.form.validate((valid) => {
				if(valid) {
					fn(this.getData() )
				} else {
					fn(false);
}})}

create下的docreate方法留下之前的部分

在这里插入图片描述
验证规则做如下修改:
在这里插入图片描述
下面的代码报错了,因为 this.ruleForm.pass
在这里插入图片描述改成this.form.passwordcreated 取出 rules

改变this取向

const {items,rules } = this.conf;

for(let key in rules ) {
		let valArr = rules[key];
		valArr.forEach( item => {
			if(item.validator) {
					item.validator = ite,.validator.bind(this);
		}})}

freeze做了改变
![在这里插入图片描述](https://img-blog.csdnimg.cn/fb9e266cdb9e4911a7e0ee43b9b888d5.png#pic_center将 validatePass2 改成非箭头函数

funtion(rule,value,callback) {		
}

在这里插入图片描述
GFormCreator

dosubmit() {
	let { submit } = this.$listeners;
	this.validate(submit);
}
case 'radio' :
	return  item.options.map((opt,i)=>{
				return <el-radio key={i} v-model={this.form[item.key]} label={opt.label}>opt.text</el-radio>
}})
[{type:'radio',label:'权限分配',key:'permission',value:'2',options:[
	{label:'2',text:'销售人员',},
	{label:'1',text:'初审人员',},

]}]

接口文档 和数据相关
apis 下的user.js

export const createUser = ({username,password,permission})=> {
		return request.post('/permission/createUser',{
			account:username,
			password,
			role_id:permission
})
})

create.vue

import {createUser} from '@/apis/user'
this.$refs.createForm.validate(async data => {
		if (data) {
				console.log('验证成功’, data);
				let [data,res] = await createUser();
				if (err) return this.$message('创建失败');
				this.$message('创建成功')
}
})

在这里插入图片描述

贷款申请页面
1 导入数据
loan-input 下新建inputPageConf.js 导入数据

//性别
const sexOptions = [
    { value: "man", label: "男" },
    { value: "woman", label: "女" }
  ];
  //行业
  const companyOptions = [
    { value: "education", label: "教育" },
    { value: "finance", label: "金融" }
  ];
  //婚否
  const marriageOptions = [
    { value: "married", label: "已婚" },
    { value: "unmarried", label: "未婚" }
  ];
  //学历
  const educationOptions = [
    { value: "college", label: "大学" },
    { value: "highschool", label: "高中" }
  ];

export default Object.freeze({
    cards: [
        {
            name: "个人基本信息",
            children: [
                [
                    { label: "姓名", key: "name", type: "input" },
                    { label: "出生日期", key: "birthday", type: "datetime" },
                    {
                        label: "性别",
                        key: "sex",
                        type: "select",
                        options: sexOptions
                    }
                ],
                [{ label: "身份证", key: "identity_card", type: "input" }],
                [
                    {
                        label: "婚姻状态",
                        key: "marriage",
                        type: "select",
                        options: marriageOptions
                    },
                    {
                        label: "教育程度",
                        key: "education",
                        type: "select",
                        options: educationOptions
                    },
                    { label: "居住地址", key: "address1", type: "input" }
                ],
                [
                    { label: "户籍地址", key: "address2", type: "input" },
                    { label: "居住电话", key: "phone", type: "input" },
                    { label: "手机号", key: "mobile_phone", type: "input" }
                ]
            ].map(row => row.map(item => ({ colspan: 8, ...item })))
        },
        {
            name: "职业信息",
            children: [
                [   // element原生属性
                    {    label: "现职公司", key: "company", type: "input" },
                    {
                        label: "所属行业",
                        attrs:{ placeholder:'请选择Green' },
                        key: "trade",
                        type: "select",
                        options: companyOptions
                    },
                    { label: "职位", key: "position", type: "input" },
                    { label: "公司地址", key: "address3", type: "input" }
                ].map(item => ({ colspan: 6, ...item })),
                [
                    { label: "公司类型", key: "company_type", type: "input" },
                    { label: "公司邮箱", key: "company_email", type: "input" },
                    { label: "公司电话", key: "company_phone", type: "input" }
                ].map(item => ({ colspan: 8, ...item }))
            ]
        },
        {
            name: "收支情况",
            children: [[{ label: "收支情况", key: "income", type: "input" }]]
        },
        {
            name: "家庭联系人",
            children: [
                [
                    { label: "关系1", key: "contact", type: "input" },
                    { label: "姓名", key: "contact_name", type: "input" },
                    { label: "手机", key: "contact_phone", type: "input" }
                ]
            ]
        },
        {
            name: "工作证明人",
            children: [
                [
                    { label: "关系2", key: "contact2", type: "input" },
                    { label: "姓名", key: "contact2_name", type: "input" },
                    { label: "手机", key: "contact2_phone", type: "input" }
                ],
                [
                    { label: "部门", key: "contact2_dep", type: "input" },
                    { label: "职位", key: "contact2_pos", type: "input" }
                ],
                [{ label: "备注", key: "remark", type: "textarea" }]
            ]
        }
    ],
    rules: {
        name: [
            { required: true, message: "请输入姓名", trigger: "blur" },
            {
                min: 2,
                max: 5,
                message: "长度在 2 到 5 个字符",
                trigger: "blur"
            }
        ],
        identity_card: [
            { required: true, message: "请输入身份证", trigger: "change" }
        ],
        birthday: [
            {
                type: "date",
                required: true,
                message: "请选择日期",
                trigger: "change"
            }
        ],
        sex: [{ required: true, message: "请选择性别", trigger: "change" }],
        marriage: [
            { required: true, message: "请选择婚姻状态", trigger: "change" }
        ],
        education: [
            { required: true, message: "请选择教育程度", trigger: "change" }
        ],
        trade: [
            { required: true, message: "请选择所属行业", trigger: "change" }
        ],

        address1: [
            { required: true, message: "请输入居住地址", trigger: "blur" }
        ],
        address2: [
            { required: true, message: "请输入户籍地址", trigger: "blur" }
        ],
        phone: [{ required: true, message: "请输入居住电话", trigger: "blur" }],
        mobile_phone: [
            { required: true, message: "请输入手机号", trigger: "blur" }
        ],
        company: [
            { required: true, message: "请输入现职公司全称", trigger: "blur" }
        ],
        position: [{ required: true, message: "请输入职位", trigger: "blur" }],
        address3: [
            { required: true, message: "请输入公司地址", trigger: "blur" }
        ],
        company_type: [
            { required: true, message: "请输入公司类型", trigger: "blur" }
        ],
        company_email: [
            { required: true, message: "请输入公司邮箱", trigger: "blur" }
        ],
        company_phone: [
            { required: true, message: "请输入公司电话", trigger: "blur" }
        ],
        income: [
            { required: true, message: "请输入收支情况", trigger: "blur" }
        ],
        contact: [{ required: true, message: "请输入关系1", trigger: "blur" }],
        contact_name: [
            { required: true, message: "请输入姓名", trigger: "blur" }
        ],
        contact_phone: [
            { required: true, message: "请输入手机", trigger: "blur" }
        ],
        contact2: [{ required: true, message: "请输入关系2", trigger: "blur" }],
        contact2_name: [
            { required: true, message: "请输入姓名", trigger: "blur" }
        ],
        contact2_phone: [
            { required: true, message: "请输入手机", trigger: "blur" }
        ],
        contact2_dep: [
            { required: true, message: "请输入部门", trigger: "blur" }
        ],
        contact2_pos: [
            { required: true, message: "请输入职位", trigger: "blur" }
        ]
    },
}
)

2 cards兼容
在这里插入图片描述

GformCreator下

const {items,cards,rules} = this.conf;
this.rulesHandler(rules);
if(items) {
	this.reactiveFileds(items)
}else if(cards) {
cards.forEach(card => {
		if(card.children) {
					this.reactiveFileds(card.children)
} })}
reactiveFileds(items,rules) {
		items.forEach(rowArr => {
				rowArr.forEach(item => {
						this.$set(this.form,item.key,item.value)

})})}
rulesHandler(rules) {

}

具体代码如下图
在这里插入图片描述
render下

const {title,items,rules,cards} = this.conf;

return 下

<el-form ref="form" attrs = {{model:form}} rules = {rules} label-width = "80px">
{cards ? this.renderCards(cards) : this.renderRow(items)
}

renderCards
在这里插入图片描述

在这里插入图片描述
select datatime

case 'select':
	return <el-select v-model={this.form[item.key]} attrs={item.attrs}>
	{ item.options.map( opt => {
			return <el-option 
			key = { opt.value}
			label = { opt.label}
			value = { opt.value}
			</el-option>
})}
	</el-select>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值