vant2下拉列表组件封装

达里尔
• 阅读 871

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

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

组件内容

<template>
  <div class="pickerPop">
    <van-field
      readonly
      clickable
      :required="required"
      :name="fieldName"
      :value="fieldValueText"
      :label="fieldLabel"
      :rules="rules"
      placeholder="请选择"
      @click="showPicker = true"
    />
    <van-popup v-model="showPicker" position="bottom">
      <van-picker
        :title="defaultTitle"
        v-model="selectedValue"
        :default-index="selectedIndex"
        show-toolbar
        value-key="text"
        :columns="columns"
        @confirm="(value) => onConfirm(fieldType, value)"
        @cancel="showPicker = false"
      />
    </van-popup>
  </div>

</template>

<script>
/*
* 1、这是个封装的下拉列表组件,
* 如果需要显示默认值需要在组件上写 v-if="isDictRender" defaultValue="你的默认显示的下拉框的值"
* v-if是必须的,否则赋值和获取列表数据是异步,无法回显
* 2、如果一个页面多次需要这个组件,可以传入fieldType="你的下拉框类型"
* 这样的话需要复用的下拉框的确定事件就可以写一个如 @confirm="onConfirm"
* 共用onConfirm()方法,根据返回值返回的type字段进行区分
*
* */
export default {
  name: 'pickerPop',
  props: {
    // 如果有多个下拉框存在的时候可以用这个判断
    fieldType: {
      type: String,
      default: ''
    },
    // 前面红色*号
    required: {
      type: Boolean,
      default: false
    },
    // 验证
    rules: {
      type: Array,
    },
    // 提交表单的标识符 // 根据你的需求,可以不传
    fieldName: {
      type: String,
      default: ''
    },
    // 标题
    defaultTitle: {
      type: String,
      default: ''
    },
    // label显示的文字
    fieldLabel: {
      type: String,
      default: ''
    },
    // 传进来的默认值
    defaultValue: {
      type: [String, Number], // 根据你的需求定义类型
      default: null,
    },
    // 要显示的文字 如果要做回显就给这个值赋值
    fieldValueText: {
      type: String,
      default: ''
    },
    // 下拉列表数据
    columns: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      showPicker: false,
      selectedValue: this.defaultValue, // 使用 prop 的默认值来初始化 selectedValue
      selectedIndex: '',  // 默认回显
    };
  },
  created(){

  },
  mounted(){
    // 根据默认值获取当前数据所在字典表数组的索引
    this.selectedIndex = this.columns.findIndex((item) => item.value == this.defaultValue)
  },
  computed: {},
  methods: {
    onConfirm(type, value) {
      // console.log('Type:', type); // 输出 'Type'
      // console.log('Value:', value); // 输出选中的值
      /*
      * 返回的这个type是根据组件传入的参数,
      * 当有多个下拉框存在的时候用这个组件可以用一个confirm方法通过type进行判断,
      * 不用再多写很多确定事件了
      * */
      this.$emit('confirm', {
        type: type?type:null,
        text: value.text,
        value: value.value
      });
      this.showPicker = false;
    }
  }
};
</script>
<style scoped lang="less">
.van-cell--borderless:after, .van-cell:last-child:after {
  display: initial;
}
</style>

父组件这样使用:

<template>
  <div class="box">
    <pickerPop
      v-if="isDictRender"
      defaultValue="O"
      fieldName="bloodTypeText"
      fieldLabel="血型"
      :fieldValueText="bloodTypeText"
      :columns="columns_blood"
      defaultTitle="血型"
      @confirm="onConfirm"
    />
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDictRender: false,
      bloodValue: '',  // 血型
      bloodTypeText: '',  // 血型-文字
      // 血型字典表
      columns_blood: [
        { text: 'A型', value: 'A' },
        { text: 'B型', value: 'B' },
        { text: 'AB型', value: 'AB' },
        { text: 'O型', value: 'O' },
      ]
    }
  },
  methods: {
    // 血型确定
    onConfirm(value) {
      console.log(value)
      this.bloodTypeText = value.text;
      this.bloodValue = value.value;
    },
  },
  created() {

  }
}
</script>

<style scoped>

</style>
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Easter79 Easter79
3年前
vue 使用mint
解决了官网中下拉刷新存在的问题<template<divclass"tmpl"<navbartitle"商品列表"</navbar<divclass"mainbody"ref"wrapper":style"{height:(wrapperHeight
Chase620 Chase620
3年前
Vue组件(30)封装一下数据列表的控件
UI库的table好像前端喜欢叫table,而后端喜欢叫grid。就是现实数据的列表。当然table还有其他的含义,UI库的table也是有其他的功能的。而数据列表控件其实也没啥好封装的,各种功能UI库都提供了,一般使用也是很方便的,只是为了我的那种想法还是需要小小的封装一下。功能锁定行列(UI库自带)多选(整理)
Stella981 Stella981
3年前
Android如何实现一个上拉刷新下拉加载的ListView
20191220关键字:自定义上下拉ListView在APK开发中,一个具备在列表顶部下拉刷新、在列表尾部上拉加载功能的ListView的需求还是比较多的。具备这种功能的优秀开源代码同样也有很多。但今天,笔者就非要自己实现一个这样的控件不可。以下是成品效果图:!(https://oscimg.oschin
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
2020.8.07 微信小程序(组件封装)
今天说一下微信小程序组件的封装…为什么要封装组件?写组件的目的就是为了复用,它的好处太多了a.写更少的代码。b.减少开发时间。c.代码的bug更少。d.占用的字节更少。…组件复用使我们的代码组织变得非常灵活。那么组件到底怎么封装,其实就和vue组件封装的思
Wesley13 Wesley13
3年前
(selenium+python)_UI自动化05_定位select下拉列表
前言web网页大多选择功能使用下拉列表方式实现,在selenium进行自动化过程中,可通过Select类实现下拉列表的多种操作。Select常用方法select_by_index()通过索引定位选项select_by_value()通过value值定位选项select_by_visib
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
达里尔
达里尔
Lv1
大部分都是自己工作中遇到的问题,懒得用脑子记就写下来,主要是给自己看的,遇到的时候直接复制粘贴,如果对他人有帮助的话就更好了
文章
31
粉丝
3
获赞
13