vant2下拉列表组件封装

因为vant2的下拉列表需要input框和弹框组合使用,所以自己封装了一下,点击确定可以返回选择的对象,并且支持多个下拉列表共用一个确定方法。 组件的特点:

  1. 点击显示下拉列表的弹框,点击确定给父组件返回选中的内容,包括 text(选中的文字内容)和 value (选中的值);
  2. 当页面有多个下拉框的时候,可以共用 confirm 方法,从而简化代码;
  3. 支持下拉列表默认回显功能

组件内容

1<template> 2 <div class="pickerPop"> 3 <van-field 4 readonly 5 clickable 6 :required="required" 7 :name="fieldName" 8 :value="fieldValueText" 9 :label="fieldLabel" 10 :rules="rules" 11 placeholder="请选择" 12 @click="showPicker = true" 13 /> 14 <van-popup v-model="showPicker" position="bottom"> 15 <van-picker 16 :title="defaultTitle" 17 v-model="selectedValue" 18 :default-index="selectedIndex" 19 show-toolbar 20 value-key="text" 21 :columns="columns" 22 @confirm="(value) => onConfirm(fieldType, value)" 23 @cancel="showPicker = false" 24 /> 25 </van-popup> 26 </div> 27 28</template> 29 30<script> 31/* 32* 1、这是个封装的下拉列表组件, 33* 如果需要显示默认值需要在组件上写 v-if="isDictRender" defaultValue="你的默认显示的下拉框的值" 34* v-if是必须的,否则赋值和获取列表数据是异步,无法回显 35* 2、如果一个页面多次需要这个组件,可以传入fieldType="你的下拉框类型" 36* 这样的话需要复用的下拉框的确定事件就可以写一个如 @confirm="onConfirm" 37* 共用onConfirm()方法,根据返回值返回的type字段进行区分 38* 39* */ 40export default { 41 name: 'pickerPop', 42 props: { 43 // 如果有多个下拉框存在的时候可以用这个判断 44 fieldType: { 45 type: String, 46 default: '' 47 }, 48 // 前面红色*号 49 required: { 50 type: Boolean, 51 default: false 52 }, 53 // 验证 54 rules: { 55 type: Array, 56 }, 57 // 提交表单的标识符 // 根据你的需求,可以不传 58 fieldName: { 59 type: String, 60 default: '' 61 }, 62 // 标题 63 defaultTitle: { 64 type: String, 65 default: '' 66 }, 67 // label显示的文字 68 fieldLabel: { 69 type: String, 70 default: '' 71 }, 72 // 传进来的默认值 73 defaultValue: { 74 type: [String, Number], // 根据你的需求定义类型 75 default: null, 76 }, 77 // 要显示的文字 如果要做回显就给这个值赋值 78 fieldValueText: { 79 type: String, 80 default: '' 81 }, 82 // 下拉列表数据 83 columns: { 84 type: Array, 85 required: true 86 } 87 }, 88 data() { 89 return { 90 showPicker: false, 91 selectedValue: this.defaultValue, // 使用 prop 的默认值来初始化 selectedValue 92 selectedIndex: '', // 默认回显 93 }; 94 }, 95 created(){ 96 97 }, 98 mounted(){ 99 // 根据默认值获取当前数据所在字典表数组的索引 100 this.selectedIndex = this.columns.findIndex((item) => item.value == this.defaultValue) 101 }, 102 computed: {}, 103 methods: { 104 onConfirm(type, value) { 105 // console.log('Type:', type); // 输出 'Type' 106 // console.log('Value:', value); // 输出选中的值 107 /* 108 * 返回的这个type是根据组件传入的参数, 109 * 当有多个下拉框存在的时候用这个组件可以用一个confirm方法通过type进行判断, 110 * 不用再多写很多确定事件了 111 * */ 112 this.$emit('confirm', { 113 type: type?type:null, 114 text: value.text, 115 value: value.value 116 }); 117 this.showPicker = false; 118 } 119 } 120}; 121</script> 122<style scoped lang="less"> 123.van-cell--borderless:after, .van-cell:last-child:after { 124 display: initial; 125} 126</style> 127

父组件这样使用:

1<template> 2 <div class="box"> 3 <pickerPop 4 v-if="isDictRender" 5 defaultValue="O" 6 fieldName="bloodTypeText" 7 fieldLabel="血型" 8 :fieldValueText="bloodTypeText" 9 :columns="columns_blood" 10 defaultTitle="血型" 11 @confirm="onConfirm" 12 /> 13 </div> 14</template> 15 16<script> 17export default { 18 data() { 19 return { 20 isDictRender: false, 21 bloodValue: '', // 血型 22 bloodTypeText: '', // 血型-文字 23 // 血型字典表 24 columns_blood: [ 25 { text: 'A型', value: 'A' }, 26 { text: 'B型', value: 'B' }, 27 { text: 'AB型', value: 'AB' }, 28 { text: 'O型', value: 'O' }, 29 ] 30 } 31 }, 32 methods: { 33 // 血型确定 34 onConfirm(value) { 35 console.log(value) 36 this.bloodTypeText = value.text; 37 this.bloodValue = value.value; 38 }, 39 }, 40 created() { 41 42 } 43} 44</script> 45 46<style scoped> 47 48</style> 49
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

Vue组件(30)封装一下数据列表的控件

UI库的table好像前端喜欢叫table,而后端喜欢叫grid。就是现实数据的列表。当然table还有其他的含义,UI库的table也是有其他的功能的。而数据列表控件其实也没啥好封装的,各种功能UI库都提供了,一般使用也是很方便的,只是为了我的那种想法还是需要小小的封装一下。功能锁定行列(UI库自带)多选(整理)

Android如何实现一个上拉刷新下拉加载的ListView

20191220关键字:自定义上下拉ListView在APK开发中,一个具备在列表顶部下拉刷新、在列表尾部上拉加载功能的ListView的需求还是比较多的。具备这种功能的优秀开源代码同样也有很多。但今天,笔者就非要自己实现一个这样的控件不可。以下是成品效果图:!(https://oscimg.oschin

Django中Admin中的一些参数配置

设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable

2020.8.07 微信小程序(组件封装)

今天说一下微信小程序组件的封装…为什么要封装组件?写组件的目的就是为了复用,它的好处太多了a.写更少的代码。b.减少开发时间。c.代码的bug更少。d.占用的字节更少。…组件复用使我们的代码组织变得非常灵活。那么组件到底怎么封装,其实就和vue组件封装的思