Element-UI中Select选择器详解

image

前言

最近开发的后台管理系统项目采用Vue+Element-UI技术架构,在使用Elment-UI中Select组件的时候遇到了比较多的操作难题,官网上关于这个组件的使用文档介绍的不是很详细,仅仅提供了一些基本用法,很多拓展场景都没有涉及到,在查阅了大量资料之后终于将目前的需求都完美解决了,这里整理一些Select组件的使用方案,希望能帮到有同样需求的同学。

项目已上传github,欢迎大家下载交流。

前端项目地址:https://github.com/Hanxueqing/Element-select

项目运行

# 克隆到本地
git clone git@github.com:Hanxueqing/Element-select.git

# 安装依赖
npm install

# 开启本地服务器localhost:8080
yarn serve

# 发布环境
yarn build

使用场景

局部引入Select组件

注意这里引入Select组件的时候还需要引入Option,不然下拉列表渲染不出来,他们是两个单独的组件。

import { Select, Option} from 'element-ui'
Vue.use(Select)
Vue.use(Option)

使用下拉菜单展示数据项

v-model的值为当前被选中的el-option的 value 属性值,输入框中显示的为label属性值。

            <el-select v-model="value" placeholder="请选择">
              <el-option
                v-for="item in options"
                :key="item.value"
                :label="item.label"
                :value="item.value"
                :disabled="item.disabled">
              </el-option>
          </el-select>

我们将要显示在下拉菜单中的数据写在options数组中,给label属性赋值姓名,让输入框显示我们选中的姓名。

<script>
  export default {
    data() {
      return {
        options: [{
          value: '选项1',
          company: '腾讯',
          label: '马化腾',
          school: '深圳大学'

        }, {
          value: '选项2',
          company: '美团',
          label: '王兴',
          school: '清华大学'

        }, {
          value: '选项3',
          company: '小米',
          label: '雷军',
          school: '武汉大学'

        }, {
          value: '选项4',
          company: '今日头条',
          label: '张一鸣',
          school: '南开大学'

        }, {
          value: '选项5',
          company: '红杉资本',
          label: '沈南鹏',
          school: '耶鲁大学'

        }],
        value: ''
      }
    }
  }
</script>

效果演示:

image

为select设定默认值

将默认值赋给v-model绑定的数据即可,此处我们给v-model绑定的是value,所以在data中给value赋值为"马化腾"为默认值。

value: '马化腾'

在输入框按下回车,选择第一个匹配项

el-select标签中添加default-first-option属性,需配合 filterableremote 使用。

在下拉菜单中,展示多项数据

目前我们在options数组中为每一个数据定义了三个字段,分别是公司、姓名和毕业院校,但是下拉列表中只能显示姓名,所以我们要自定义HTML模板,插入el-option中的slot。

<el-option
  v-for="item in options"
  :key="item.value"
  :label="item.label"
  :value="item.value"
  :disabled="item.disabled">
  <span style="float: left">{{ item.company }}</span>
  <span style="float: left">{{ item.label }}</span>
  <span style="float: left">{{ item.school }}</span>
</el-option>

效果演示:

image

给el-select添加唯一class名

我们修改了列表项的样式,但是页面中可能会使用多个select组件,直接修改会影响全局样式,在页面渲染的时候,el-select总是会被渲染为仅次于body层级的div,我们没有办法通过父级限制它,所以我们需要给它自身添加一个class名。

  .el-select-dropdown__item span{
    width:100px;
    text-align:center;
  }

在el-select上按照常规方法添加class = "optionsContent",不生效,给el-select加父标签<div class = "optionsContainter">来包裹el-select也没用。

            <div class = "optionsContainter">
              <el-select v-model="value" placeholder="请选择" class = "optionsContent">
                <el-option
                  v-for="item in options"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                  :disabled="item.disabled"
                >
                  <span style="float: left">{{ item.company }}</span>
                  <span style="float: left">{{ item.label }}</span>
                  <span style="float: left">{{ item.school }}</span>
                </el-option>
            </el-select>
            </div>

在控制台中查看渲染结果可以看到,class名和div根本没有被渲染出来。

image

这里需要将class改为propper-class

<el-select v-model="value" placeholder="请选择" popper-class = "optionsContent">

通过popper-class来自定义一个类,这样子在控制台可以看到,自定义的类渲染到页面上的效果,class名已经添加成功了:

image

根据输入条件模糊查询

有的时候我们需要根据用户在input框中输入的内容提供对应的列表项。这时候需要为el-select添加filterable属性即可启用搜索功能。

效果演示:

image

当我们想实现输入拼音首字母检索的时候,就需要使用filter-method给它传入一个函数方法。

默认情况下,Select 会找出所有label属性包含输入值的选项。如果希望使用其他的搜索逻辑,可以通过传入一个filter-method来实现。filter-method为一个Function,它会在输入值发生变化时调用,参数为当前输入值。

给options中的每一个数据项添加szm字段,赋值为姓名拼音首字母

{
          value: '选项1',
          company: '腾讯',
          label: '马化腾',
          school: '深圳大学',
          szm:'mht'

        }

el-select标签中给filter-method绑定filter方法

<el-select v-model="value" placeholder="请选择" popper-class = "optionsContent" filterable :filter-method="filter">

在method中编写filter方法

filter(v) {
        // 对绑定数据赋值
        this.options = this.copy.filter((item) => {
          // 如果直接包含输入值直接返回true
          const val = v.toLowerCase()
          if (item.label.indexOf(val) !== -1) return true
          if (item.szm.substring(0, 1).indexOf(val) !== -1) return true
          if (item.szm.indexOf(val) !== -1) return true
        })
      }

在mounted中给copy数据赋值,保留数据源

mounted () {
      // 保留数据源
      this.copy = Object.assign(this.options)
    }

效果演示:

image

在Select 组件头部插入内容

当你需要在select的input框中插入内容时就需要用到组件提供的slot具名插槽,name值为:prefix。

              <template slot = "prefix">
                <span class = 'prefixSlot'>互联网大佬</span>
              </template>
image

在Option 下拉列表插入内容

如果我们需要在Option下拉列表中插入内容,官方也给我们提供了slot匿名插槽。比如,我们在数据项之前添加一个表头:

          <template>
            <div class = "optionHeader" v-show = 'optionVisible'>
              <span style="float: left">姓名</span>
              <span style="float: left;">卡号</span>
              <span style="float: left;">手机号</span>
            </div>
          </template>
image

外部组件获得下拉列表选中项数据

我们需要将下拉列表中选中的数据展示在外部页面中,在el-option标签中给value值绑定item.value,那么v-model里的value将会得到选中对象的value,如果赋值为item,那将会得到选中的对象,可以在change事件里将返回的值分别赋值给需要的变量。

我们给el-select的chage事件绑定showMessage方法,参数是$event

<el-select v-model="value" placeholder="请选择" popper-class = "optionsContent" filterable :filter-method="filter" @change="showMessage($event)">

我们先打印一下获得的参数,可以获取到选中的对象

image

在methods中定义showMessage方法,给对应的数据赋值

      showMessage(e){
        console.log(e)
        this.v_company = e.company;
        this.v_label = e.label;
        this.v_school = e.school
      }

在页面中展示我们获得的数据

          <div class = "title">
            <span>公司:{{v_company}}</span>
            <span>姓名:{{v_label}}</span>
            <span>毕业院校:{{v_school}}</span>
          </div>

效果演示:

image

当输入框为空的时候不显示下拉列表,输入数据的时候根据输入内容显示对应列表项

现在默认是输入框获取焦点的时候就显示全部列表项,但是当我们涉及到一些保密功能时,不希望显示全部的列表项,比如选择会员,我们不能一开就将会员信息全部展示出来,所以一开始需要在data中设置一个数据optionVisible:false,控制下拉列表的显示与隐藏。

下拉列表的默认样式也需要做一些修改,去掉小尖头、边框、最小宽度和盒子阴影。

  .popper__arrow{
    display: none!important;
  }
  .el-select-dropdown{
    box-shadow: none!important;
    min-width: 0px;
    border:0!important;
  }

el-selectel-option添加v-show指令v-show = 'optionVisible',在el-select标签上绑定@keyup.native = "showOption"方法,编写showOption方法,判断输入框中的数据长度不为0时,显示下拉列表。

showOption(){
        let inputContent = document.getElementsByClassName('el-input__inner')[0].value
        console.log(inputContent.length)
        if(inputContent.length != 0){
          this.optionVisible = true;
        }
      }

效果演示:

image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349