利用element-ui封装地址输入的组件
我们前端做项目时,难免会遇到地址输入,多数情况下,我们都是提供一个省市三级联动,加上具体地址输入的Input输入框给用户,用以获取用户需要输入的真实地址。在需要对用户输入的数据进行校验的时候,我们会单独针对省市的三级联动和具体地址栏单独校验。也基本上能够完成项目需求。
然而当我们转向vue+element做项目时,会产生一个比较尴尬的问题。在element组件库当中,对需要校验的字段是通过在el-form-item这一组件标签名上添加prop属性来校验的,如果依然按照以前的方法对省市联动和地址栏分别校验的话,就得把省市选择和地址输入分成两个el-form-item组件内蓉来写,我们可以看一下,实际形成的布局。
这就比较难受了,用户本来也就是需要输入个地址,我们提供给用户级联选择器的目的是方便用户进行省市区的选择,然而现在的情况确是,用户必须进行二次验证。
转换思路,用户也可以把两栏并成一栏,展示会比较好看一点。
这么来看布局似乎没问题了,但是另一个问题又产生了,element本省提供的校验方案是通过el-form-item的属性prop对用户传入的参数进行校验。
也就是说prop必须是字符串,那么这时候,就没办法对两个字段同时校验了,唯一的方案似乎就变成了:把这两个字段变成一个对象,通过自定义校验方法来校验该对象内的数据的值。类似于:
address:{
district:[],
address:''
}
在el-form-item上写上prop='address',然后自定义校验方法,通过validator进行校验。
想法已经完成了,那么如果项目当中不仅仅一处用到地址输入的话,我们是不是就有必要对该组件进行封装,让他成为我们的常备组件之一了。
好吧!那就开始封装组件了。
我们的组件封装的仅仅是级联选择器和Input输入框,并不包含校验规则,毕竟是还有其他需要校验的组件。
组件的内容可能就很简单了。
一个.vue文件, template:
<el-row
:gutter="16"
type="flex"
justify="space-between"
>
<el-col :span="12">
<el-cascader
v-model="dis"
:options="regionData"
@change="handleAddressChange"
style="width: 100%"
filterable
/>
</el-col>
<el-col :span="12">
<el-input
v-model="address"
placeholder="请输入地址"
@change="handleChange"
/>
</el-col>
</el-row>
script:
import { regionData, CodeToText, TextToCode } from 'element-china-area-data'
export default {
name: 'VAddress',
props: {
value: {
type: Object,
default () {
return {
address: '',
areaCity: '',
areaCode: '',
areaDistrict: '',
areaProvince: ''
}
}
}
},
model: {
prop: 'value',
event: 'change'
},
data () {
return {
dis: [],
regionData,
mapLabel: TextToCode,
mapCode: CodeToText,
...this.value
}
},
methods: {
handleChange (e) {
let val = {
...this.value,
address: this.address
}
this.$emit('update:value', val)
this.$emit('change', val)
},
handleAddressChange (values) {
console.log(values)
const b = ['areaProvince', 'areaCity', 'areaDistrict']
if (values.length > 0) {
let initialValue = {
...this.value,
'areaProvince': '',
'areaCity': '',
'areaDistrict': '',
'areaCode': values[values.length - 1]
}
const val = values.reduce((acc, curret, index) => {
let value = this.mapCode[curret] return {
...acc,
[b[index]]: value
}
}, initialValue)
this.$emit('change', val)
// sync更新
// this.$emit('update:value', val)
}
},
getCurrentRegion (val) {
let address = val
if (!Array.isArray(val) && typeof val === 'object') {
let { areaProvince, areaCity = '', areaCode } = val
address = [this.mapLabel[areaProvince], this.mapLabel[areaCity], areaCode]
if (address.some(item => item === undefined)) address = []
}
return address
},
initDis (val) {
this.dis = this.dis.length === 0 ? this.getCurrentRegion(val) : this.dis
}
},
created () {
if (this.regionData.length > 0 && this.value.areaCode) {
this.initDis(this.value)
}
},
watch: {
value: {
handler (val) {
this.address = val.address
if (this.regionData.length > 0) {
this.initDis(val)
}
if (Object.values(val).every(item => !item)) this.dis = []
},
deep: true
}
}
}
需要注意的一个是:
model: {
prop: 'value',
event: 'change'
}
具体解释请转到vue.js官方文档,我只简单说一句,就是提供给组件使用时绑定v-model,因为v-model默认传递的是value属性,处理的是input事件,而通过在子组件定义model属性,我们就可以修改v-model处理的事件和传递的属性。因为很正常,我们这里有两个form表单控件的内容,肯定没办法依赖v-model的input事件进行处理。如果实在不喜欢这种写法,也可以在组件使用时,避开v-model的用法,转而通过:value.sync进行属性传递,在事件处理是通过this.$emit('update:value', val)来进行类似处理,这也就是看起来没有v-model那么牛X一样,其实结果是一致的。
我们在组件内分别对级联选择器和Input输入框做change事件处理,从而获取到最新的数据,转换成使用该组件的父组件内,关于级联选择器的change事件,依赖于各个公司后台开发人员需要前端传回什么样的数据,进行处理。
我们的项目当中,后台需要省市区的数据格式为areaProvince, areaCity, areaDistrict, areaCode,所以在级联选择器change的时候,我需要及时的将其获取到的数组(省市区的code值),转换成对应的具体的省份、城市、区,加上区的areaCode,然后传递给后台,具体的得依赖项目需求各自处理。
这是vue+element的地址输入的组件封装,后面还会有一个react+antd关于地址输入的组件封装,相较于element,antd提供了自定义form表单控件的功能,所以封装起来也就更容易一点,也更容易理解。
利用element-ui封装地址输入的组件的更多相关文章
- vue+element ui 的表格列使用组件
前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...
- Vue+element UI实现“回到顶部”按钮组件
介绍 这是一个可以快速回到页面顶部的组件,当用户浏览到页面底部的时候,通过点击按钮,可快速回到页面顶部. 使用方法 由于该组件是基于element-UI进行二次封装的,所以在使用该组件时请务必安装el ...
- Element ui级联地址省市区插件
安装 npm install element-china-area-data -S 使用 import { provinceAndCityData, regionData, provinceAndCi ...
- 利用ant-design封装react的地址输入组件
在上一节利用element-ui封装地址输入的组件留下了个尾巴,说react搭配ant-design封装一下地址输入的组件的.本来应该早早就完成的,但是由于这中间发生了一些事情,导致了突发性的换了工作 ...
- vue组件样式添加scoped属性之后,无法被父组件修改。或者无法在本组件修改element UI样式
在vue开发中,需要使用scoped属性避免样式的全局干扰,但是这样在父组件中是无法被修改的,不仅如此如果项目中用了UI框架比如element Ui,这个时候在本组件也无法修改样式,因为权重问题.但是 ...
- 基于 vue+element ui 的cdn网站(多页面,都是各种demo)
前言:这个网站持续更新中...,有网上预览,github上也有源码,喜欢记得star哦,欢迎留言讨论. 网站地址:我的个人vue+element ui demo网站 github地址:yuleGH g ...
- vue2.0+Element UI 表格前端分页和后端分页
之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...
- element UI Cascader 级联选择器 编辑 修改 数组 路径 问题(转载)
来源:https://segmentfault.com/a/1190000014827485 element UI的Cascader级联选择器编辑时 vue.js element-ui 2 eleme ...
- element ui实现手动上传文件,且只能上传单个文件,并能覆盖上传。
element ui提供了成熟的组件场景,但实际工作中难免会遇到认(sha)真(diao)的产品.比如,最近遇到的,要求实现手动上传特定格式文件(用户点击“上传文件”按钮,确定之后,只是单纯选择了文件 ...
随机推荐
- 数据库groub by分组后,把多行数据合并成一行数据(Oracle、Postgres)
关键字 row_number() over (partition by) 例如,下面的数据, 这是按照name分组后,展示property值. 我们想得到这样的值; 第一步:将每一组的proper ...
- fsLayuiPlugin附件上传使用说明
fsLayuiPlugin 是一个基于layui的快速开发插件,支持数据表格增删改查操作,提供通用的组件,通过配置html实现数据请求,减少前端js重复开发的工作. GitHub下载 码云下载 测试环 ...
- 利用python获取自己的qq群成员信息
利用python获取自己的qq群成员信息! 首先说明一下需要使用的工具以及技术:python3 + selenium selenium安装方法:pip install selenium 前提:获取自己 ...
- docker-compose ELK+Filebeat查看docker及容器的日志
我目前所在公司开发团队比较小,为集团下面的工厂开发了一套小的系统,跑在一台CentOS服务器上,服务器搭建了docker环境,安装了docker-compose,但在日志处理方面,暂时没有一个好的方法 ...
- Linux 时间同步 Chrony
chrony 是网络时间协议(NTP)的通用实现. chrony 包含两个程序:chronyd 是一个可以在启动时启动的守护程序.chronyc 是一个命令行界面程序,用于监视 chronyd 的性能 ...
- docker安装mysql挂载外部配置和数据目录
从docker hub上可以找到mysql外挂配置和数据目录的一些文档说明 https://hub.docker.com/_/mysql 从该文档中可以了解到,mysql的默认配置为/etc/mysq ...
- Flutter移动电商实战 --(20)首页上拉加载更多功能的制作
这节课学习一下上拉加载效果,其实现在上拉加载的插件有很多,但是还没有一个插件可以说完全一枝独秀,我也找了一个插件,这个插件的优点就是服务比较好,作者能及时回答大家的问题.我觉的选插件也是选人,人对了, ...
- ccf 201803-2 碰撞的小球(Python)
问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线 ...
- 例子:Vue 配合 vue-resource 从接口获取数据
vue-resource 是 vue 的一个与服务器端通信的 HTTP 插件,用来从服务器端请求数据. 结合例子——图片列表来写一下 Vue获取接口数据. html : <div id=&quo ...
- OpenStack 虚拟机热迁移流程图
目录 文章目录 目录 源计算节点与目的计算节点之间的交互流程 Nova 和 Neutron 之间的交互流程 源计算节点与目的计算节点之间的交互流程 热迁移主要包括三个阶段: pre_live_migr ...