Select 选择器
使用模拟的增强下拉选择器来代替浏览器原生的选择器。
选择器支持单选、多选、搜索,以及键盘快捷操作。
注意:非 template/render 模式下,需使用 、i-option
。
基础用法
基本用法。可以使用 v-model 双向绑定数据。
单选时,value 只接受字符串和数字类型,多选时,只接受数组类型,组件会自动根据Option
的value
来返回选中的数据。
可以给Select
添加 style 样式,比如宽度。
在展开选择器后,可以使用键盘的up
和down
快速上下选择,按下Enter
选择,按下Esc
收起选择器。
通过设置size
属性为large
和small
将输入框设置为大和小尺寸,不设置为默认(中)尺寸。
<template>
<Select v-model="model2" size="small" style="width:100px">
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
<Select v-model="model3" style="width:100px">
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
<Select v-model="model4" size="large" style="width:100px">
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</template>
<script>
export default {
data () {
return {
cityList: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
model2: '',
model3: '',
model4: ''
}
}
}
</script>
禁用
通过给Select
设置属性disabled
禁用整个选择器。
通过给Option
设置属性disabled
可以禁用当前项。
<template>
<Select v-model="model5" disabled style="width:200px">
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
<Select v-model="model6" style="width:200px">
<Option value="beijing">New York</Option>
<Option value="shanghai" disabled>London</Option>
<Option value="shenzhen">Sydney</Option>
</Select>
</template>
<script>
export default {
data () {
return {
cityList: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
model5: '',
model6: ''
}
}
}
</script>
通过设置属性clearable
可以清空已选项,仅适用于单选模式。
<template>
<Select v-model="model8" clearable style="width:200px">
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</template>
<script>
export default {
data () {
return {
cityList: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
model8: ''
}
}
}
</script>
使用OptionGroup
可将选项进行分组。
自定义模板
对选项内容可以进行自定义。注意在Option
中使用label
属性,可以让选择器优先读取该属性的值以显示,否则选中时显示的内容会和自定义的一样,这往往不是我们想要的。
对于选项显示内容的逻辑:优先显示 slot 内容,如果没有定义 slot,则显示label
的值,如果没有设置 label,则显示value
的值。
<template>
<Select v-model="model9" style="width:200px">
<Option value="New York" label="New York">
<span>New York</span>
<span style="float:right;color:#ccc">America</span>
</Option>
<Option value="London" label="London">
<span>London</span>
<span style="float:right;color:#ccc">U.K.</span>
</Option>
<Option value="Sydney" label="Sydney">
<span>Sydney</span>
</Select>
</template>
<script>
export default {
data () {
return {
model9: ''
}
}
}
</script>
通过设置属性multiple
可以开启多选模式。多选模式下,model 接受数组类型的数据,所返回的也是数组。
<template>
<Select v-model="model10" multiple style="width:260px">
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</template>
<script>
export default {
data () {
return {
cityList: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
model10: []
}
}
}
</script>
前缀图标
设置 prefix
属性或 slot 可以在 Select 内显示前缀图标。
<template>
<Select v-model="model15" prefix="ios-home" style="width:200px">
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
<Select v-model="model15" style="width:200px">
<Avatar src="https://dev-file.iviewui.com/userinfoPDvn9gKWYihR24SpgC319vXY8qniCqj4/avatar" slot="prefix" size="small" />
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</template>
<script>
export default {
data () {
return {
cityList: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
model15: ''
}
}
}
</script>
设置属性 max-tag-count
可指定最多显示的 tag 数量,超出后折叠。
设置属性 max-tag-placeholder
可以自定义 tag 超出后折叠的显示内容。
3.4.0
版本开始支持。
可搜索
通过设置属性filterable
可以开启搜索模式。单选和多选都支持搜索模式。多选搜索时,可以使用键盘Delete
快捷删除最后一个已选项。
<template>
<Row>
<Col span="12" style="padding-right:10px">
<Select v-model="model11" filterable>
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</Col>
<Col span="12">
<Select v-model="model12" filterable multiple>
<Option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</Col>
</Row>
</template>
<script>
export default {
data () {
return {
cityList: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
model11: '',
model12: []
}
}
}
</script>
远程搜索需同时设置 filterable
、remote
、remote-method
、loading
四个 props,其中 loading 用于控制是否正在搜索中,remote-method 是远程搜索的方法。
注意:需要给 Option 设置 key。
设置初始显示值,需设置 label
属性。
本例为美国州名,尝试输入一些字母。
<template>
<Row>
<Col span="12" style="padding-right:10px">
<Select
v-model="model13"
filterable
remote
:remote-method="remoteMethod1"
:loading="loading1">
</Col>
<Col span="12">
<Select
v-model="model14"
multiple
filterable
remote
:remote-method="remoteMethod2"
:loading="loading2">
<Option v-for="(option, index) in options2" :value="option.value" :key="index">{{option.label}}</Option>
</Select>
</Col>
</Row>
</template>
<script>
export default {
data () {
return {
model13: '',
loading1: false,
options1: [],
model14: [],
loading2: false,
options2: [],
list: ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New hampshire', 'New jersey', 'New mexico', 'New york', 'North carolina', 'North dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode island', 'South carolina', 'South dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West virginia', 'Wisconsin', 'Wyoming']
}
},
methods: {
remoteMethod1 (query) {
if (query !== '') {
this.loading1 = true;
setTimeout(() => {
this.loading1 = false;
const list = this.list.map(item => {
return {
value: item,
label: item
};
});
this.options1 = list.filter(item => item.label.toLowerCase().indexOf(query.toLowerCase()) > -1);
}, 200);
} else {
this.options1 = [];
}
},
remoteMethod2 (query) {
if (query !== '') {
this.loading2 = true;
setTimeout(() => {
this.loading2 = false;
const list = this.list.map(item => {
return {
value: item,
label: item
};
});
this.options2 = list.filter(item => item.label.toLowerCase().indexOf(query.toLowerCase()) > -1);
}, 200);
} else {
this.options2 = [];
}
}
}
}
</script>
创建条目
4.0.0 在 filterable 模式下,开启属性 allow-create
可以通过在输入框中输入文字来创建新的条目。
输入新条目后,按下回车键即可新建条目。
需配合 @on-create
事件使用。
<template>
<Row>
<Col span="12" style="padding-right:10px">
<Select v-model="model17" filterable allow-create @on-create="handleCreate1">
<Option v-for="item in cityList3" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</Col>
<Col span="12">
<Select v-model="model18" filterable multiple allow-create @on-create="handleCreate2">
<Option v-for="item in cityList4" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select>
</Col>
</Row>
</template>
<script>
export default {
data () {
return {
cityList3: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
cityList4: [
{
value: 'New York',
label: 'New York'
},
{
value: 'London',
label: 'London'
},
{
value: 'Sydney',
label: 'Sydney'
},
{
value: 'Ottawa',
label: 'Ottawa'
},
{
value: 'Paris',
label: 'Paris'
},
{
value: 'Canberra',
label: 'Canberra'
}
],
model17: '',
model18: []
}
},
methods: {
handleCreate1 (val) {
this.cityList3.push({
value: val,
label: val
});
},
handleCreate2 (val) {
this.cityList4.push({
value: val,
label: val
});
}
}
}
Select events
事件名 | 说明 | 返回值 |
---|---|---|
on-change | 选中的Option 变化时触发,默认返回 value,如需返回 label,详见 label-in-value 属性 | 当前选中项 |
on-query-change | 搜索词改变时触发 | query |
on-clear | 点击清空按钮时触发 | 无 |
on-open-change | 下拉框展开或收起时触发 | true / false |
on-create 4.0.0 | 新建条目时触发 | query |
Select slot
名称 | 说明 |
---|---|
prefix 3.4.0 | 自定义 Select 内头部图标 |
OptionGroup props
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 分组的组名 | String | 空 |