Files
pda-cli/src/common/remoteSelectMixin.js
T
2026-09-04 15:57:46 +08:00

55 lines
1.6 KiB
JavaScript

import { isRemoteSelectType } from '@/common/remoteSelect';
/**
* 表单页远程下拉搜索。
* 使用方需实现 fetchRemoteSelectOptions(type, keyword),返回 { value, label }[]。
*
* 注意:不要用 `_` / `$` 前缀的 data 字段名——Vue2 不会代理到 this,
* `++this._xxx` 会得到 NaN,导致列表不更新、loading 不关。
*/
export default {
data() {
return {
selectSearching: false,
selectSearchSeq: 0,
};
},
computed: {
isRemoteSelect() {
return isRemoteSelectType(this.selectType);
},
},
methods: {
isRemoteSelectType,
openSelectPicker(type, cachedList) {
this.selectType = type;
this.selectList = Array.isArray(cachedList) ? cachedList.slice() : [];
this.selectShow = true;
},
onSelectSearch(keyword) {
if (!isRemoteSelectType(this.selectType)) return;
if (typeof this.fetchRemoteSelectOptions !== 'function') return;
const seq = ++this.selectSearchSeq;
this.selectSearching = true;
const finish = () => {
if (seq === this.selectSearchSeq) this.selectSearching = false;
};
Promise.resolve()
.then(() => this.fetchRemoteSelectOptions(this.selectType, keyword))
.then((list) => {
if (seq !== this.selectSearchSeq) return;
this.selectList = Array.isArray(list) ? list.slice() : [];
})
.catch((e) => {
if (seq !== this.selectSearchSeq) return;
if (typeof this.showError === 'function') {
this.showError((e && e.message) || '搜索失败');
} else {
uni.showToast({ title: (e && e.message) || '搜索失败', icon: 'none' });
}
})
.then(finish, finish);
},
},
};