Vue2移动端(H5项目)项目基于vant实现select单选(支持搜索、回显、自定义下拉label展示功能)

一 最终效果

二、参数配置

1、代码示例:

html 复制代码
<t-select
     v-model="formData.materialNo"
      valueKey="materialNo"
      showLabel="materialName"
      labelKey="label"
      label="判定品级"
      input-align="right"
      placeholder="请选择判定品级"
      right-icon="arrow"
      :list="judgingMaterialList"
        />

2、配置参数(t-select Attributes)继承van-field和van-picker的属性

参数 说明 类型 默认值
v-model 选中的valueKey值,页面展示是:showLabell String -
list 下拉数据源 Array -
valueKey 下拉选择传给后台的key String key
labelKey 下拉选择显示label String label
isSearch 是否显示搜索框 Boolean false
showLabel van-field显示的文本 String -
searchPlaceholder 搜索提示语 String 请输入搜索内容

3、events 事件

事件名 说明 返回值
emitVal 点击确定按钮时触发 选中的对象

三、源码

html 复制代码
<template>
  <div class="t-select">
    <van-field v-bind="fieldAttrs" :value="text" @click="clickField" />
    <van-popup v-model="isShow" position="bottom">
      <van-field
        v-model="searchVal"
        :placeholder="searchPlaceholder"
        @input="search"
        v-if="isSearch"
        clearable
        input-align="left"
      />
      <van-picker
        v-on="$listeners"
        v-bind="$attrs"
        ref="picker"
        @change="changeVal"
        :value-key="labelKey"
        :columns="columnsData"
        show-toolbar
        @confirm="onConfirm"
        @cancel="isShow = false"
      />
    </van-popup>
  </div>
</template>

<script>
export default {
  name: 'TSelect',
  props: {
    // 下拉数据源
    list: {
      type: Array,
      default: () => []
    },
    val: { default: null },
    // 下拉选择传给后台的key
    valueKey: {
      type: String,
      default: 'key',
    },
    // 下拉选择显示label
    labelKey: {
      type: String,
      default: 'label',
    },
    // 是否显示搜索框
    isSearch: {
      type: Boolean,
      default: false
    },
    // van-field显示的文本
    showLabel: {
      type: String
    },
    searchPlaceholder: {
      type: String,
      default: '请输入搜索内容'
    }
  },
  model: {
    prop: 'val',
    event: 'emitVal'
  },
  data() {
    return {
      isShow: false,
      columnsData: this.list,
      searchVal: '',
      text: '',
    }
  },
  watch: {
    val: {
      handler(newVal) {
        // 赋值回显
        if (newVal) {
          const findItem = this.list.find((item) => item[this.valueKey] == newVal)
          this.text = findItem[this.showLabel || this.labelKey]
        }
      },
      deep: true,
      immediate: true
    },
    list: {
      handler(newVal) {
        this.columnsData = newVal
      },
      deep: true,
      immediate: true
    }
  },
  computed: {
    fieldAttrs() {
      return {
        readonly: true,
        clickable: true,
        ...this.$attrs
      }
    }
  },
  methods: {
    clickField() {
      this.isShow = true
      this.$emit('clickField', true)
    },
    onConfirm(value) {
      // console.log('点击确定', value)
      this.$emit('emitVal', value[this.valueKey], value)
      this.text = value[this.showLabel || this.labelKey]
      this.isShow = false
    },
    changeVal() {
      this.$emit('change')
    },
    clear() {
      this.text = ''
      this.$emit('emitVal', null)
    },
    // 搜索
    search(val) {
      // console.log('搜索', val)
      if (val) {
        this.columnsData = this.columnsData.filter(item => {
          return item[this.labelKey].indexOf(val) > -1
        })
      } else {
        this.columnsData = JSON.parse(JSON.stringify(this.list))
      }
    },
  }
}
</script>

相关文章

基于ElementUi再次封装基础组件文档


基于ant-design-vue再次封装基础组件文档


vue3+ts基于Element-plus再次封装基础组件文档

相关推荐
计算机-秋大田5 小时前
基于Spring Boot的兴顺物流管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·spring·课程设计
禾苗种树6 小时前
在 Vue 3 中使用 ECharts 制作多 Y 轴折线图时,若希望 **Y 轴颜色自动匹配折线颜色**且无需手动干预,可以通过以下步骤实现:
前端·vue.js·echarts
小盼江7 小时前
水果生鲜农产品推荐系统 协同过滤余弦函数推荐水果生鲜农产品 Springboot Vue Element-UI前后端分离 代码+开发文档+视频教程
vue.js·spring boot·ui
初遇你时动了情8 小时前
react module.scss 避免全局冲突类似vue中scoped
vue.js·react.js·scss
烂蜻蜓9 小时前
Uniapp 设计思路全分享
前端·css·vue.js·uni-app·html
bin91539 小时前
DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)
前端·javascript·vue.js·ecmascript·deepseek
浪九天14 小时前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
尚学教辅学习资料14 小时前
基于SpringBoot+vue+uniapp的智慧旅游小程序+LW示例参考
vue.js·spring boot·uni-app·旅游
IT、木易15 小时前
跟着AI学vue第五章
前端·javascript·vue.js
薛定谔的猫-菜鸟程序员15 小时前
Vue 2全屏滚动动画实战:结合fullpage-vue与animate.css打造炫酷H5页面
前端·css·vue.js