手动实现一个form组件
最近研究了一下element-ui,想着手动实现一下里面的form组件,贴个组件里面的代码
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
<el-form-item label="密码" prop="pass">
<el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="checkPass">
<el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input v-model.number="ruleForm.age"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
该组件可以细分为三个组件form,formItem以及input组件,首先介绍input组件
- input组件:任务一是实现一个v-model的数据双绑定,即包含value的动态绑定以及input的实现
任务二是值发生改变的时候通知formItem组件
<template>
<div>
<input type="text" :value="value" @input="input">
</div>
</template> <script>
export default {
props: {
value: {
type: String,
default: ""
}
},
methods: {
input(e) {
let inputValue = e.target.value;
this.$emit("input", inputValue);
this.$parent.$emit('validate');
}
}
};
</script> <style lang="scss" scoped>
</style>
2. FormItem组件: 任务一实现一个插槽
任务二显示label以及校验信息
任务三 对数据进行校验
<template>
<div>
<label :prop="prop">{{label}}</label>
<slot></slot>
<p>{{error}}</p>
</div>
</template> <script>
//需要知道何时去校验
import Schema from "async-validator";
export default {
inject: ["form"],
props: {
prop: {
type: String,
default: ""
},
label: {
type: String,
default: ""
}
},
data() {
return {
error: ''
}
},
methods: {
validate() {
const rules = this.form.rules[this.prop]; //数组
const value = this.form.model[this.prop];
const descriptor = { [this.prop]: rules };
const schema = new Schema(descriptor);
schema.validate({ [this.prop]: value }, errors => {
if (errors) {
this.error = errors[0].message;
} else {
this.error = "";
}
});
}
},
mounted() {
this.$on("validate", this.validate);
}
};
</script> <style lang="scss" scoped>
</style>
3. Form组件: 任务实现rules和model的传递,预留插槽
<template>
<div>
<form>
<slot></slot>
</form>
</div>
</template> <script>
export default {
provide() {
return {
form: this
};
},
props: {
rules: {
type: Object
},
model: {
type: Object
}
}
};
</script> <style lang="scss" scoped>
</style>
完整代码可以访问https://github.com/LinNigo/FormComponent
手动实现一个form组件的更多相关文章
- Angular写一个Form组件-TagInput
前端开发少不了和表单打交道; Angular中, 提供了强大的表单的支持, 响应式表单(Reactive Form) 和 模板驱动的表单(Template-driven Form) 的双向数据流给我们 ...
- day85 ModuleForm Form组件
1 forms组件与modelform组件 forms组件: https://www.cnblogs.com/yuanchenqi/articles/9036474.htmlmodelForm组件:h ...
- Django2.0——Form组件简单总结
Django提供了一个Form组件来配和前端的表单进行使用,Form有两个强大的功能,分别是生成HTML代码和验证数据的合法性.通常我们不会用其第一个功能,因为前端的设计可以做出更加精美且多样的表单页 ...
- django form和form组件
form介绍: 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是 ...
- day58_9_24多对多建表手动,form组件(判断类型),cookies和session
一.多对多建表关系之手动添加. 1.全自动 像之前讲过的一样,我们可以通过manytomanyField的字段来建立多对多关系: class Book(models.Model): title = m ...
- 使用form 组件写一个用户注册,并用 bootstrap渲染
需求:使用form组件,写一个用户注册系统,包含用户名, 密码, 确认密码,手机号,性别,爱好,注册.并用bootsrap渲染,成果如下: 首先创建一个django 项目.然后在连接pymysql数据 ...
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...
- Django的model form组件
前言 首先对于form组件通过全面的博客介绍,对于form我们应该知道了它的大致用法,这里我们需要明确的一点是,我们定义的form与model其实没有什么关系,只是在逻辑上定义form的时候字段名期的 ...
- day75 form 组件(对form表单进行输入值校验的一种方式)
我们的组件是什么呢 select distinct(id,title,price) from book ORM: model.py class Book(): title=model.CharFiel ...
随机推荐
- Hadoop集群中有哪些节点类型
- nfs服务安装配置
一.准备阶段 配置解析主机 检查版本及内核 二.服务端安装 1) 配置yum把下载好的软件留着,下次备用,不用再下载 cachedir=/var/cache/yum/$basearch/$releas ...
- 系统io统计
$ cat /proc/diskstats sda sda1 sda2 gg- gg- gg- 主号 次号 名称 成功读 合并读 扇区读 读时间 每一列的含义分别为: 第一列为 设备号 (nu ...
- bzoj 1266 [AHOI2006] 上学路线
传送门 传说中的经典容斥+卢卡斯定理+中国剩余定理 题解传送门 //Achen #include<algorithm> #include<iostream> #include& ...
- Spring MVC中获取当前项目的路径
Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--> <context-param> <param-name>web ...
- Jquery 判断值是否存在于数组之内
var strArray=str.split(","); var fixed_init=function(v){ if($.inArray(v,strArray)==-1){ // ...
- [BZOJ3990][SDOI2015][LOJ#2181]-排序
说实话,这个题真好(?) <BZOJ题面> <LOJ题面> 看到这个题,一时没有思路 但是 我想到了一个错解:归并 这个题真的有一点把我们的思路往归并上引 于是WA10 诶?我 ...
- oracle习题集-高级查询2
1.列出员工表中每个部门的员工数和部门编号 Select deptno,count(*) from emp group by deptno; 2.列出员工表中,员工人数大于3的部门编号和员工人数 ; ...
- Zookeeper 扫盲
Zookeeper 扫盲 :disappointed_relieved: 配置文件详解: tickTime:基本事件单元,以毫秒为单位,这个时间作为 Zookeeper 服务器之间或客户端之间维持心跳 ...
- Codefroces 213E. Two Permutations
E. Two Permutations time limit per test 3 seconds memory limit per test 256 megabytes input standard ...