Select 选择器

类似 Select2 的选择器。

何时使用

  • 弹出一个下拉菜单给用户选择操作,用于代替原生的选择器,或者需要一个更优雅的多选器时。
  • 当选项少时(少于 5 项),建议直接将选项平铺,使用 Radio 是更好的选择。

代码演示

基本

基本使用。

  1. <template>
  2. <v-select placeholder="请选择人员" style="width: 120px;" :data="options" @change="change"></v-select>
  3. <v-select placement="top" style="width: 120px;" dropdown-width="240px" :data="options" v-model="value"></v-select>
  4. <v-select disabled style="width: 120px;"></v-select>
  5. </template>
  6. <script>
  7. export default {
  8. data: ()=> ({
  9. options: [{
  10. value: '1',
  11. label: 'lady'
  12. }, {
  13. value: '2',
  14. label: '小强',
  15. disabled: true
  16. }, {
  17. value: '3',
  18. label: '小明'
  19. }],
  20. value: '3'
  21. }),
  22. watch: {
  23. value(val){
  24. console.log(val)
  25. }
  26. },
  27. methods: {
  28. change(val) {
  29. console.log(val)
  30. }
  31. }
  32. }
  33. </script>

自定义选项

通过默认scopedSlot自定义选项显示内容

  1. <template>
  2. <v-select style="width: 100%" :data="options" v-model="value">
  3. <template slot-scope="{data}">
  4. {{data.label}}-{{data.value}}
  5. </template>
  6. </v-select>
  7. </template>
  8. <script>
  9. export default {
  10. data: ()=> ({
  11. options: [{
  12. value: '1',
  13. label: 'lady'
  14. }, {
  15. value: '2',
  16. label: '小强',
  17. disabled: true
  18. }, {
  19. value: '3',
  20. label: '小明'
  21. }],
  22. value: '3'
  23. }),
  24. watch: {
  25. value(val){
  26. console.log(val)
  27. }
  28. }
  29. }
  30. </script>

三种大小

三种大小的选择框,当 size 分别为lgsm时,输入框高度为32px22px,默认高度为28px

  1. <template>
  2. <v-select size="lg" style="width: 200px;" :data="options" v-model="value"></v-select>
  3. <v-select style="width: 200px;" :data="options" v-model="value"></v-select>
  4. <v-select size="sm" style="width: 200px;" :data="options" v-model="value"></v-select>
  5. </template>
  6. <script>
  7. export default {
  8. data: ()=> ({
  9. options: [{
  10. value: '1',
  11. label: 'lady'
  12. }, {
  13. value: '2',
  14. label: '小强',
  15. disabled: true
  16. }, {
  17. value: '3',
  18. label: '小明'
  19. }],
  20. value: '3'
  21. }),
  22. watch: {
  23. value(val){
  24. console.log(val)
  25. }
  26. }
  27. }
  28. </script>

多选

多选,从已有条目中选择(scroll the menu)

  1. <template>
  2. <v-select style="width: 100%;" multiple :data="options" :value="['3']"></v-select>
  3. </template>
  4. <script>
  5. export default {
  6. data: ()=> ({
  7. options: [{
  8. value: '1',
  9. label: 'lady'
  10. }, {
  11. value: '2',
  12. label: '小强',
  13. disabled: true
  14. }, {
  15. value: '3',
  16. label: '小明'
  17. }]
  18. })
  19. }
  20. </script>

带搜索框

展开后可对选项进行搜索。

  1. <template>
  2. <v-select search style="width: 120px;" :data="options"></v-select>
  3. <br><br>
  4. <v-select search multiple style="width: 100%" :data="options"></v-select>
  5. </template>
  6. <script>
  7. export default {
  8. data: ()=> ({
  9. options: [{
  10. value: '1',
  11. label: 'lady'
  12. }, {
  13. value: '2',
  14. label: '小强',
  15. disabled: true
  16. }, {
  17. value: '3',
  18. label: '小明'
  19. }]
  20. })
  21. }
  22. </script>

搜索过滤

使用 filter 进行自定义的搜索

  1. <template>
  2. <v-select search style="width: 120px;" :filter="filter" :data="filterOptions"></v-select>
  3. <br><br>
  4. <v-select search multiple style="width: 100%" :filter="filter" :data="filterOptions"></v-select>
  5. </template>
  6. <script>
  7. export default {
  8. data: ()=> ({
  9. filterOptions: [{
  10. value: '1',
  11. label: '河北',
  12. jp: 'HB',
  13. qp: 'HeiBei',
  14. }, {
  15. value: '2',
  16. label: '河南',
  17. jp: 'HN',
  18. qp: 'HeiNan',
  19. }, {
  20. value: '3',
  21. label: '海南',
  22. jp: 'HN',
  23. qp: 'HaiNan',
  24. }],
  25. }),
  26. methods: {
  27. filter(val, item) {
  28. const input = val.toLocaleUpperCase();
  29. return item.label.startsWith(input) ||
  30. item.jp.startsWith(input) ||
  31. item.qp.startsWith(input);
  32. },
  33. }
  34. }
  35. </script>

分组

用嵌套的数据结构进行选项分组。

  1. <template>
  2. <v-select style="width: 200px" :data="groupOpt" :value="'lp'"></v-select>
  3. <v-select style="width: 200px" multiple :data="groupOpt" :value="['lp']"></v-select>
  4. </template>
  5. <script>
  6. export default {
  7. data: ()=> ({
  8. groupOpt: [{
  9. label: '重庆',
  10. options: [{
  11. value: 'lp',
  12. label: '梁平'
  13. }, {
  14. value: 'wz',
  15. label: '万州',
  16. disabled: true
  17. }]
  18. }, {
  19. label: '四川',
  20. options: [{
  21. value: 'cd',
  22. label: '成都'
  23. }, {
  24. value: 'dz',
  25. label: '达州'
  26. }]
  27. }]
  28. })
  29. }
  30. </script>

远程搜索

从服务器搜索数据,输入关键字进行查找

  1. <template>
  2. <v-select style="width: 200px" search :loading="loading" :remote-method="remoteMethod" :data="remoteOption"></v-select>
  3. <br><br>
  4. <v-select style="width: 100%" search multiple :loading="loading2" :remote-method="remoteMethod2" :data="remoteOption"></v-select>
  5. </template>
  6. <script>
  7. export default {
  8. data: ()=> ({
  9. list: [],
  10. states: ["Alabama", "Alaska", "Arizona",
  11. "Arkansas", "California", "Colorado",
  12. "Connecticut", "Delaware", "Florida",
  13. "Georgia", "Hawaii", "Idaho", "Illinois",
  14. "Indiana", "Iowa", "Kansas", "Kentucky",
  15. "Louisiana", "Maine", "Maryland",
  16. "Massachusetts", "Michigan", "Minnesota",
  17. "Mississippi", "Missouri", "Montana",
  18. "Nebraska", "Nevada", "New Hampshire",
  19. "New Jersey", "New Mexico", "New York",
  20. "North Carolina", "North Dakota", "Ohio",
  21. "Oklahoma", "Oregon", "Pennsylvania",
  22. "Rhode Island", "South Carolina",
  23. "South Dakota", "Tennessee", "Texas",
  24. "Utah", "Vermont", "Virginia",
  25. "Washington", "West Virginia", "Wisconsin",
  26. "Wyoming"],
  27. loading: false,
  28. loading2: false,
  29. remoteOption: []
  30. }),
  31. mounted(){
  32. this.list = this.states.map(item => {
  33. return { value: item, label: item };
  34. });
  35. },
  36. methods: {
  37. remoteMethod(query) {
  38. if (query !== '') {
  39. this.loading = true;
  40. setTimeout(() => {
  41. this.loading = false;
  42. this.remoteOption = this.list.filter(item => {
  43. return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
  44. });
  45. }, 200);
  46. } else {
  47. this.remoteOption = [];
  48. }
  49. },
  50. remoteMethod2(query) {
  51. if (query !== '') {
  52. this.loading2 = true;
  53. setTimeout(() => {
  54. this.loading2 = false;
  55. this.remoteOption = this.list.filter(item => {
  56. return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
  57. });
  58. }, 200);
  59. } else {
  60. this.remoteOption = [];
  61. }
  62. }
  63. }
  64. }
  65. </script>

API

Select Props

属性说明类型默认值
value指定默认选中的条目string/array-
default:scopedSlot自定义下拉框选项内容,传入的参数:dataslot node-
clue选项的value的字段名stringvalue
label选项显示的文本的字段名stringlabel
groupLabel分组title的字段名stringlabel
data下拉框的数据array[]
multiple是否支持多选booleanfalse
notFoundContent当下拉列表为空时显示的内容string没有找到
placement下拉框出现的位置(top、bottom)stringbottom
search是否可以搜索booleanfalse
filter搜索过滤函数,返回BooleanFunction(value, item)-
maxHeight下拉框的最大高度number300
dropdownWidth下拉框宽度string-
disabled控件是否禁用booleanfalse
allowClear支持清除, 单选模式有效booleantrue
placeholder选择框默认文字string请选择
size选择框大小,可选 lg smstring-
loading呈现加载样式(一般用于从远程获取数据)booleanfalse
loadingText加载时显示的文字string加载中…
optionOnChange指定change事件返回的数据是否是选中的整个option数据booleanfalse
remoteMethod远程搜索方法function-
position下拉框的定位方式(absolute,fixed)stringabsolute
popupContainer下拉菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。function() => document.body

Data Props

属性说明类型默认值
value选项的值(该字段可通过select的clue属性修改)string/number/object-
label选项的标签或组名(作为标签时可通过select的label属性修改;作为组名时只支持一级,可通过select的groupLabel属性修改)string-
disabled是否禁用booleanfalse
options分组的数据array-

Select Events

事件说明参数
change选择的值发生变化的时候触发,默认返回value,如需返回整个option,请设置optionOnChangevalue
focusfocus事件-
blurblur事件-
search文本框值变化时回调value