作为一名刚接触vue不到一个月的菜鸟,思想还没有从操作DOM转变为数据驱动,看vue的代码处处别扭。组里为了让我熟悉vue交给了我一个将element 表单封装成组件的练手任务。由于开发过程中遇到的表单需求千奇百怪,我们不能直接将表单封装成一个组件。所以我尝试把输入框,下拉菜单,滑块,时间选择器,单选,多选等功能各封一个组件(感觉很蠢),但这毕竟是练手任务嘛,最后开发时也不会用我的这个。在封装的过程中遇到了很多问题和疑惑,以下记录我的收获与尚未解决的问题。

 <template>
<el-form :model="ruleForm" ref="ruleForm" label-width="100px" class="demo-ruleForm">
<commonformtext
prop="biao"
placeholder="这个是测试的"
label="活动区域"
v-model="ruleForm.biao"
:rules="[{ required: true, message: '请输入活动名称', trigger: 'blur' }]"
>
</commonformtext>
<commonformselect
prop="select"
placeholder="这个是测试的下拉框"
label="下拉框"
v-model="ruleForm.select"
:rules="{ required: true, message: '请选择活动区域', trigger: 'change' }"
:selectdata='selectdata'
>
</commonformselect>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</template>
<script>
import commonformtext from "@/components/common/formtext.vue";
import commonformselect from "@/components/common/formselect.vue";
export default {
data() {
return {
ruleForm: {
biao:"",
select:""
},
selectdata:[
{lable:"区域1",value:"1"},
{lable:"区域2",value:"2"},
{lable:"区域3",value:"3"},
{lable:"区域4",value:"4"},
{lable:"区域5",value:"5"}
]
};
},
components:{
commonformtext,
commonformselect,
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert('submit!');
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
}
</script>

以上是父组件,本篇先传输入框,下拉菜单两个子组件

/*
* @property { rules : {String Object} 表单验证 一种验证传对象 一种以上把对象组成数组 }
* @property { prop : {String} input的name 传回的字段名与html中input标签name值一样。 }
* @property { placeholder : {String} 提示语,与html中input标签placeholder值一样。 }
* @property { label : {String} 标签文本。 }
* @property { v-model : {String} 语法糖,利用value接值父子组件相互传值 当前表单填写的内容 }
* @version 1.0.0
* @edit: 2018/7/30
*/
<template>
<el-form-item :label="label" :prop="prop" :rules="rules">
<el-input v-model="myValue" :placeholder="placeholder" name="biao"></el-input>
</el-form-item>
</template>
<script>
export default {
props: {
prop: {
type: String
},
placeholder:{
type: String
},
label:{
type: String
},
value:{
type: String
},
rules:[Object,Array]
},
data() {
return {
activeIndex: '',
menuIndex: 0,
myValue:""
};
},
mounted(){
this.myValue = this.value;
},
watch:{
myValue(val){
this.$emit("input",val)
}
}
}
</script>

上面的是输入框子组件

/*
* @property { rules : {String Object} 表单验证 一种验证传对象 一种以上把对象组成数组 }
* @property { prop : {String} input的name 传回的字段名与html中input标签name值一样。 }
* @property { placeholder : {String} 提示语,与html中input标签placeholder值一样。 }
* @property { label : {String} 标签文本。 }
* @property { v-model : {String} 语法糖,利用value接值父子组件相互传值 当前表单填写的内容 }
* @property { selectdata: {Array} option中的数据 }
* @version 1.0.0
* @edit: 2018/7/30
*/
<template>
<el-form-item :label="label" :prop="prop" :rules="rules">
<el-select v-model="myValue" :placeholder="placeholder" v-on:change="change">
<el-option v-for="item in selectdata" :key="item.id" :label="item.lable" :value="item.value"></el-option>
</el-select>
</el-form-item>
</template>
<script>
export default {
props: {
selectdata: {
type: Array
},
prop: {
type: String
},
placeholder:{
type: String
},
label:{
type: String
},
value:{
type: String
},
rules:[Object,Array]
},
data() {
return {
myValue:""
};
},
mounted(){
this.myValue = this.value;
},
methods:{
change(){
this.$emit("input",this.myValue)
}
}
}
</script>

这个是下拉框子组件

首先是一个语法糖的知识点,父组件属性中加入v-model子组件需要在props中使用value来接值,然后子组件中用  this.$emit("input",val) 来把值返回父组件,这样父组件中就可以获得当前输入框的内容了。

在输入框子组件中我们采用的是监听输入框中的值的变化,每当输入的值变化我们都会 this.$emit("input",val)  将值返回父组件,但是在下拉栏中我们同样用此方法监听的时候会出现bug

我们明明选择了区域2表单检测却给我们报了错,然后当我们再次选择的时候就好使了

此时我们做一个假设,表单检测值事件运行时我们还没有将已改变的值发给父组件,所以在父组件进行检测的时候没有值,那我们不用watch改用methods来传值会不会变快呢,我们给select绑上change事件?

接下来我们来验证它

    methods:{
change(){
console.log(this.myValue,"aaa")
}
},
watch:{
myValue(val){
console.log(this.myValue,"bbb")
this.$emit("input",val)
}
}

我们在子组件中加入这两句话,来比一比监听值的变化快还是change事件快

先打印出aaa再打印出bbb,所以change事件比较快,那我们可以试试用change将值传给父组件,看看表单检测的时候 this.$emit("input",val) 有没有运行过。

结果change事件确实在表单检测之前将值塞了进去,bug解决了。

vue+element 表单封成组件(1)的更多相关文章

  1. vue+element 表单封成组件(2)

    今天我们继续把时间选择器,多选框和单选框加上 父组件(在昨天的基础上增加): <template> <el-form :model="ruleForm" ref= ...

  2. vue element 表单验证不通过,滚动到固对应位置

    我们在使用elementIUI实现表单验证,内容比较多的时候,提示内容会被遮挡,这时候用户不清楚什么情况,还会连续点击提交按钮.这个时候需求来啦:我们需要在表单验证不通过的时候,页面滚动到对应的位置. ...

  3. vue+element表单校验功能

    要实现这个功能其实并不难,element组件直接用就可以, 但是我在使用过程中碰到了几个坑,就记录下来,分享给大家,避免落坑,话不多说,直接上过程...... 表单校验功能:   实现这个功能,总共分 ...

  4. vue+element 表单验证

    效果图 <template> <div class="formValidator"> <div v-for="(item,index) in ...

  5. vue element 表单多个验证时,滚动到验证提示的位置

    最近项目有个下单的过程,需要输入很多信息,每次提交都要往下滑,还要去验证,测试后发现体验也不好,element框架也没提供这种滚动方法, 不过提供了一个验证的方法 validate (两个参数:是否校 ...

  6. 第四节:Vue表单标签和组件的基本用法,父子组件间的通信

    vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset=&q ...

  7. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  8. Vue Element-ui表单校验规则,你掌握了哪些?

    1.前言   Element-ui表单校验规则,使得错误提示可以直接在form-item下面显示,无需弹出框,因此还是很好用的.   我在做了登录页面的表单校验后,一度以为我已经很了解表单的校验规则. ...

  9. vue的表单编辑删除,保存取消功能

    过年回来第一篇博客,可能说的不是很清楚,而且心情可能也不是特别的high,虽然今天是元宵,我还在办公室11.30在加班,但就是想把写过的代码记下来,怕以后可能真的忘了.(心将塞未塞,欲塞未满) VUE ...

随机推荐

  1. 在Linux中#!/usr/bin/python之后把后面的代码当成程序来执行。 但是在windows中用IDLE编程的话#后面的都是注释,之后的代码都被当成文本了。 该怎么样才能解决这个问题呢?

    本文转自:http://bbs.csdn.net/topics/392027744?locationNum=6&fps=1 这种问题是大神不屑于解答,小白又完全不懂的问题... 同遇到这个问题 ...

  2. linux清除cache的方法

    1  Linux下内存占用多的原因 当linux第一次读取一个文件运行时,一份放到一片内存中cache起来,另一份放入运行程序的内存中,正常运行,当程序运行完,关闭了,cache中的那一分却没有释放, ...

  3. 吴裕雄--天生自然 HADOOP大数据分布式处理:使用XShell远程连接主机与服务器并配置它们之间SSH免密登录

  4. VS2010 常用的快捷键

    1.强迫智能感知:Ctrl+J:2.强迫智能感知显示参数信息:Ctrl-Shift-空格:3.格式化整个块:Ctrl+K+F4.检查括号匹配(在左右括号间切换): Ctrl +]5.选中从光标起到行首 ...

  5. spring-boot jpa mysql emoji utfmb4 异常处理

    spring-boot jpa mysql utf8mb4 emoji 写入失败 mysql database,table,column 默认为utf8mb4 Caused by: java.sql. ...

  6. Angular开发者指南(五)服务

    服务 AngularJS服务是使用依赖注入(DI)连接在一起的可替代对象. 可以使用服务在整个应用程式中整理和分享程式码. AngularJS服务有: 延迟初始化 - AngularJS只在应用程序组 ...

  7. 用Hutton32玩转数字电路(一):逻辑门

    最近看到有人用Minecraft里面的红石电路制作出了计算器,还有一篇神文:<基于Minecraft实现的计算机工程>,视频在此,好像还能算浮点数.三角函数.我对红石不是太了解,那能不能用 ...

  8. Mybatis工作流程及其原理与解析

    Mybatis简介:    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBat ...

  9. python django ORM

    1.在models.py中创创建类 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db imp ...

  10. AVFoundation Programming Guide(官方文档翻译4)Editing - 编辑

    新博客:完整版 - AVFoundation Programming Guide 分章节版:- 第1章:About AVFoundation - AVFoundation概述- 第2章:Using A ...