我正在使用el-select构建一个选择组件。像这样的东西:
<template>
//omitted code
<el-select v-model="filterForm.client"
filterable
remote
placeholder="Please enter a keyword"
:remote-method="filterClients"
:loading="loading">
<el-option
v-for="item in clientCandidates"
:key="item._id"
:label="item.name"
:value="item._id">
</el-option>
</el-select>
</template>
<scripts>
export default {
data() {
filterForm: {
client: ''
},
clientCandidates: [],
loading: false
},
methods: {
filterClients(query) {
if (query !== '') {
this.loading = true;
setTimeout(() => {
this.loading = false;
this.clientCandidates = [{_id: '1', name: 'foo'}, {_id: '2', name: 'bar'}];
}, 200);
} else {
this.clientCandidates = [];
}
}
}
}
</scripts>
到目前为止一切都很好,但是由于组件会出现在不同的页面中,所以我想提取一个自定义组件以避免重复。
根据指引,
v-model="fullName"
相当于
v-bind:value="fullName"
v-on:input="$emit('input', $event)"
所以我像这样提取了选择组件:
<template>
<el-select
v-bind:value="clientId"
v-on:input="$emit('input', $event)"
placeholder="Filter by short name"
filterable="true"
remote="true"
:remote-method="filter"
:loading="loading">
<el-option
v-for="item in clients"
:key="item._id"
:label="item.name"
:value="item._id">
</el-option>
</el-select>
</template>
<scripts>
export default {
props: {
clientId: {
type: String,
required: true
}
},
data() {
return {
clients: [],
loading: false,
}
},
methods: {
filter(query) {
if (query !== '') {
this.loading = true;
setTimeout(() => {
this.loading = false;
this.clients = [{_id: '1', name: 'foo'}, {_id: '2', name: 'bar'}];
}, 200);
} else {
this.clients = [];
}
}
}
}
</scripts>
父组件如下所示:
<select-client v-model="filterForm.clientId"></select-client>
选择下拉菜单工作正常,但不幸的是,选择没有显示我选择的选项,在我选择一个选项后它仍然是空的。我怀疑也许我应该切换v-on:input
到'v-on:change',但它也不起作用。
更新我创建了一个简单的例子,你可以在这里
克隆它,请检查el-select-as-component
分支。跑
npm install
npm run dev
您将看到一个包含 3 种选择的简单页面:
左侧是一个用原始选择编写的自定义组件,它工作正常。
中间一个是用 编写的自定义组件el-select
,下拉列表保持为空,但是单击按钮filterForm.elClientId
后您可以在控制台中看到 。Filter
这就是我提出这个问题的原因。
右边的是普通的el-select
,效果很好。