|
@@ -3,9 +3,7 @@
|
|
.el-autocomplete {
|
|
.el-autocomplete {
|
|
width: 180px;
|
|
width: 180px;
|
|
}
|
|
}
|
|
- .el-autocomplete__suggestions.my-autocomplete-suggestions {
|
|
|
|
- width: 300px;
|
|
|
|
-
|
|
|
|
|
|
+ .my-suggestions-item {
|
|
& .remark {
|
|
& .remark {
|
|
float: right;
|
|
float: right;
|
|
font-size: 13px;
|
|
font-size: 13px;
|
|
@@ -14,8 +12,28 @@
|
|
}
|
|
}
|
|
</style>
|
|
</style>
|
|
<script>
|
|
<script>
|
|
- var $q = require('q');
|
|
|
|
-
|
|
|
|
|
|
+ var Vue = require('vue');
|
|
|
|
+ Vue.component('my-item', {
|
|
|
|
+ functional: true,
|
|
|
|
+ render: function (h, ctx) {
|
|
|
|
+ var item = ctx.props.item;
|
|
|
|
+ return h('li', {
|
|
|
|
+ attrs: { class: 'my-suggestions-item' }
|
|
|
|
+ }, [
|
|
|
|
+ h('span', { attrs: { class: 'label' } }, ['选项' + ctx.props.index]),
|
|
|
|
+ h('span', { attrs: { class: 'remark' } }, [item.display])
|
|
|
|
+ ]);
|
|
|
|
+ },
|
|
|
|
+ props: {
|
|
|
|
+ item: {
|
|
|
|
+ type: Object,
|
|
|
|
+ required: true
|
|
|
|
+ },
|
|
|
|
+ index: {
|
|
|
|
+ type: Number
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
export default {
|
|
export default {
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
@@ -24,10 +42,7 @@
|
|
state2: '',
|
|
state2: '',
|
|
state3: '',
|
|
state3: '',
|
|
state4: '',
|
|
state4: '',
|
|
- myPartial: {
|
|
|
|
- name: 'my-autocomplete-suggestions',
|
|
|
|
- template: '<span class="label">选项{{$index}}</span><span class="remark">{{item.display}}</span>'
|
|
|
|
- }
|
|
|
|
|
|
+ timeout: null
|
|
}
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
@@ -52,141 +67,57 @@
|
|
|
|
|
|
return result;
|
|
return result;
|
|
},
|
|
},
|
|
- querySearch(query, simulateQuery) {
|
|
|
|
|
|
+ querySearch(queryString, cb) {
|
|
var states = this.states;
|
|
var states = this.states;
|
|
- var results = query ? states.filter(this.createStateFilter(query)) : states,
|
|
|
|
- deferred;
|
|
|
|
|
|
+ var results = queryString ? states.filter(this.createStateFilter(queryString)) : states;
|
|
|
|
|
|
- if (simulateQuery) {
|
|
|
|
- if (!query) { return []; }
|
|
|
|
-
|
|
|
|
- deferred = $q.defer();
|
|
|
|
-
|
|
|
|
- setTimeout(() => {
|
|
|
|
- deferred.resolve(results);
|
|
|
|
- }, Math.random() * 3000, false);
|
|
|
|
-
|
|
|
|
- return deferred.promise;
|
|
|
|
- } else {
|
|
|
|
- return results;
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- createStateFilter(query) {
|
|
|
|
- return (state) => {
|
|
|
|
- return (state.value.indexOf(query.toLowerCase()) === 0);
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- ready() {
|
|
|
|
- this.states = this.loadAll();
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
-</script>
|
|
|
|
-
|
|
|
|
-## 基础使用
|
|
|
|
-
|
|
|
|
-<div class="demo-box">
|
|
|
|
- <el-autocomplete
|
|
|
|
- :value.sync = "state1"
|
|
|
|
- :suggestions = "querySearch(state1)"
|
|
|
|
- placeholder = "请输入内容"
|
|
|
|
- ></el-autocomplete>
|
|
|
|
-</div>
|
|
|
|
-
|
|
|
|
-```html
|
|
|
|
-<template>
|
|
|
|
- <el-autocomplete
|
|
|
|
- :value.sync = "state1"
|
|
|
|
- :suggestions = "querySearch(state1)"
|
|
|
|
- placeholder = "请输入内容"
|
|
|
|
- ></el-autocomplete>
|
|
|
|
-</template>
|
|
|
|
-<script>
|
|
|
|
- export default {
|
|
|
|
- data() {
|
|
|
|
- return {
|
|
|
|
- state1: ''
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- methods: {
|
|
|
|
- loadAll() {
|
|
|
|
- var allStates = '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';
|
|
|
|
- var result = [];
|
|
|
|
-
|
|
|
|
- allStates.split(/, +/g).forEach((state) => {
|
|
|
|
- if (state) {
|
|
|
|
- result.push({
|
|
|
|
- value: state.toLowerCase(),
|
|
|
|
- display: state
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- return result;
|
|
|
|
|
|
+ cb(results);
|
|
},
|
|
},
|
|
- querySearch(query, simulateQuery) {
|
|
|
|
|
|
+ querySearchAsync(queryString, cb) {
|
|
var states = this.states;
|
|
var states = this.states;
|
|
- var results = query ? states.filter(this.createStateFilter(query)) : states,
|
|
|
|
- deferred;
|
|
|
|
-
|
|
|
|
- if (simulateQuery) {
|
|
|
|
- if (!query) { return []; }
|
|
|
|
|
|
+ var results = queryString ? states.filter(this.createStateFilter(queryString)) : states;
|
|
|
|
|
|
- deferred = $q.defer();
|
|
|
|
-
|
|
|
|
- setTimeout(() => {
|
|
|
|
- deferred.resolve(results);
|
|
|
|
- }, Math.random() * 3000, false);
|
|
|
|
-
|
|
|
|
- return deferred.promise;
|
|
|
|
- } else {
|
|
|
|
- return results;
|
|
|
|
- }
|
|
|
|
|
|
+ clearTimeout(this.timeout);
|
|
|
|
+ this.timeout = setTimeout(() => {
|
|
|
|
+ cb(results);
|
|
|
|
+ }, 3000 * Math.random());
|
|
},
|
|
},
|
|
- createStateFilter(query) {
|
|
|
|
|
|
+ createStateFilter(queryString) {
|
|
return (state) => {
|
|
return (state) => {
|
|
- return (state.value.indexOf(query.toLowerCase()) === 0);
|
|
|
|
|
|
+ return (state.value.indexOf(queryString.toLowerCase()) === 0);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
},
|
|
},
|
|
- ready() {
|
|
|
|
|
|
+ mounted() {
|
|
this.states = this.loadAll();
|
|
this.states = this.loadAll();
|
|
}
|
|
}
|
|
};
|
|
};
|
|
</script>
|
|
</script>
|
|
-```
|
|
|
|
|
|
|
|
-## 通过键盘控制下拉的显示
|
|
|
|
|
|
+## 基础使用
|
|
|
|
|
|
<div class="demo-box">
|
|
<div class="demo-box">
|
|
<el-autocomplete
|
|
<el-autocomplete
|
|
- :value.sync = "state2"
|
|
|
|
- :suggestions = "querySearch(state2)"
|
|
|
|
- :show-on-up-down = "true"
|
|
|
|
- placeholder = "请输入内容"
|
|
|
|
|
|
+ v-model="state1"
|
|
|
|
+ :fetch-suggestions="querySearch"
|
|
|
|
+ placeholder="请输入内容"
|
|
></el-autocomplete>
|
|
></el-autocomplete>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
```html
|
|
```html
|
|
<template>
|
|
<template>
|
|
<el-autocomplete
|
|
<el-autocomplete
|
|
- :value.sync = "state2"
|
|
|
|
- :suggestions = "querySearch(state2)"
|
|
|
|
- :show-on-up-down = "true"
|
|
|
|
- placeholder = "请输入内容"
|
|
|
|
|
|
+ v-model="state1"
|
|
|
|
+ :fetch-suggestions="querySearch"
|
|
|
|
+ placeholder="请输入内容"
|
|
></el-autocomplete>
|
|
></el-autocomplete>
|
|
</template>
|
|
</template>
|
|
<script>
|
|
<script>
|
|
export default {
|
|
export default {
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
- state2: ''
|
|
|
|
|
|
+ states: [],
|
|
|
|
+ state1: ''
|
|
}
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
@@ -211,32 +142,19 @@
|
|
|
|
|
|
return result;
|
|
return result;
|
|
},
|
|
},
|
|
- querySearch(query, simulateQuery) {
|
|
|
|
|
|
+ querySearch(queryString, callback) {
|
|
var states = this.states;
|
|
var states = this.states;
|
|
- var results = query ? states.filter(this.createStateFilter(query)) : states,
|
|
|
|
- deferred;
|
|
|
|
|
|
+ var results = queryString ? states.filter(this.createStateFilter(queryString)) : states;
|
|
|
|
|
|
- if (simulateQuery) {
|
|
|
|
- if (!query) { return []; }
|
|
|
|
-
|
|
|
|
- deferred = $q.defer();
|
|
|
|
-
|
|
|
|
- setTimeout(() => {
|
|
|
|
- deferred.resolve(results);
|
|
|
|
- }, Math.random() * 3000, false);
|
|
|
|
-
|
|
|
|
- return deferred.promise;
|
|
|
|
- } else {
|
|
|
|
- return results;
|
|
|
|
- }
|
|
|
|
|
|
+ callback(results);
|
|
},
|
|
},
|
|
- createStateFilter(query) {
|
|
|
|
|
|
+ createStateFilter(queryString) {
|
|
return (state) => {
|
|
return (state) => {
|
|
- return (state.value.indexOf(query.toLowerCase()) === 0);
|
|
|
|
|
|
+ return (state.value.indexOf(queryString.toLowerCase()) === 0);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
},
|
|
},
|
|
- ready() {
|
|
|
|
|
|
+ mounted() {
|
|
this.states = this.loadAll();
|
|
this.states = this.loadAll();
|
|
}
|
|
}
|
|
};
|
|
};
|
|
@@ -247,30 +165,49 @@
|
|
|
|
|
|
<div class="demo-box">
|
|
<div class="demo-box">
|
|
<el-autocomplete
|
|
<el-autocomplete
|
|
- :value.sync = "state3"
|
|
|
|
- :suggestions = "querySearch(state3)"
|
|
|
|
- :partial = "myPartial"
|
|
|
|
- placeholder = "请输入内容"
|
|
|
|
|
|
+ v-model="state2"
|
|
|
|
+ :fetch-suggestions="querySearch"
|
|
|
|
+ custom-item="my-item"
|
|
|
|
+ placeholder="请输入内容"
|
|
></el-autocomplete>
|
|
></el-autocomplete>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
```html
|
|
```html
|
|
<el-autocomplete
|
|
<el-autocomplete
|
|
- :value.sync = "state3"
|
|
|
|
- :suggestions = "querySearch(state3)"
|
|
|
|
- :partial = "myPartial"
|
|
|
|
- placeholder = "请输入内容"
|
|
|
|
|
|
+ v-model="state2"
|
|
|
|
+ :fetch-suggestions="querySearch"
|
|
|
|
+ custom-item="my-item"
|
|
|
|
+ placeholder="请输入内容"
|
|
></el-autocomplete>
|
|
></el-autocomplete>
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
|
+ var Vue = require('vue');
|
|
|
|
+ Vue.component('my-item', {
|
|
|
|
+ functional: true,
|
|
|
|
+ render: function (h, ctx) {
|
|
|
|
+ var item = ctx.props.item;
|
|
|
|
+ return h('li', {
|
|
|
|
+ attrs: { class: 'my-suggestions-item' }
|
|
|
|
+ }, [
|
|
|
|
+ h('span', { attrs: { class: 'label' } }, ['选项' + ctx.props.index]),
|
|
|
|
+ h('span', { attrs: { class: 'remark' } }, [item.display])
|
|
|
|
+ ]);
|
|
|
|
+ },
|
|
|
|
+ props: {
|
|
|
|
+ item: {
|
|
|
|
+ type: Object,
|
|
|
|
+ required: true
|
|
|
|
+ },
|
|
|
|
+ index: {
|
|
|
|
+ type: Number
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
export default {
|
|
export default {
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
- state3: '',
|
|
|
|
- myPartial: {
|
|
|
|
- name: 'my-autocomplete-suggestions',
|
|
|
|
- template: '<span class="label">选项{{$index}}</span><span class="remark">{{item.display}}</span>'
|
|
|
|
- }
|
|
|
|
|
|
+ states: [],
|
|
|
|
+ state2: ''
|
|
}
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
@@ -295,32 +232,19 @@
|
|
|
|
|
|
return result;
|
|
return result;
|
|
},
|
|
},
|
|
- querySearch(query, simulateQuery) {
|
|
|
|
|
|
+ querySearch(queryString, cb) {
|
|
var states = this.states;
|
|
var states = this.states;
|
|
- var results = query ? states.filter(this.createStateFilter(query)) : states,
|
|
|
|
- deferred;
|
|
|
|
|
|
+ var results = queryString ? states.filter(this.createStateFilter(queryString)) : states;
|
|
|
|
|
|
- if (simulateQuery) {
|
|
|
|
- if (!query) { return []; }
|
|
|
|
-
|
|
|
|
- deferred = $q.defer();
|
|
|
|
-
|
|
|
|
- setTimeout(() => {
|
|
|
|
- deferred.resolve(results);
|
|
|
|
- }, Math.random() * 3000, false);
|
|
|
|
-
|
|
|
|
- return deferred.promise;
|
|
|
|
- } else {
|
|
|
|
- return results;
|
|
|
|
- }
|
|
|
|
|
|
+ cb(results);
|
|
},
|
|
},
|
|
- createStateFilter(query) {
|
|
|
|
|
|
+ createStateFilter(queryString) {
|
|
return (state) => {
|
|
return (state) => {
|
|
- return (state.value.indexOf(query.toLowerCase()) === 0);
|
|
|
|
|
|
+ return (state.value.indexOf(queryString.toLowerCase()) === 0);
|
|
};
|
|
};
|
|
}
|
|
}
|
|
},
|
|
},
|
|
- ready() {
|
|
|
|
|
|
+ mounted() {
|
|
this.states = this.loadAll();
|
|
this.states = this.loadAll();
|
|
}
|
|
}
|
|
};
|
|
};
|
|
@@ -331,27 +255,26 @@
|
|
|
|
|
|
<div class="demo-box">
|
|
<div class="demo-box">
|
|
<el-autocomplete
|
|
<el-autocomplete
|
|
- :value.sync = "state4"
|
|
|
|
- :suggestions = "querySearch(state4, true)"
|
|
|
|
- :search-from-server = "true"
|
|
|
|
|
|
+ v-model="state3"
|
|
placeholder = "请输入内容"
|
|
placeholder = "请输入内容"
|
|
|
|
+ :fetch-Suggestions="querySearchAsync"
|
|
></el-autocomplete>
|
|
></el-autocomplete>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
```html
|
|
```html
|
|
-<el-autocomplete
|
|
|
|
- :value.sync = "state4"
|
|
|
|
- :suggestions = "querySearch(state4, true)"
|
|
|
|
- :search-from-server = "true"
|
|
|
|
- placeholder = "请输入内容"
|
|
|
|
-></el-autocomplete>
|
|
|
|
|
|
+<template>
|
|
|
|
+ <el-autocomplete
|
|
|
|
+ v-model="state3"
|
|
|
|
+ placeholder = "请输入内容"
|
|
|
|
+ :fetch-Suggestions="querySearchAsync"
|
|
|
|
+ ></el-autocomplete>
|
|
|
|
+</template>
|
|
<script>
|
|
<script>
|
|
- var $q = require('q');
|
|
|
|
-
|
|
|
|
export default {
|
|
export default {
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
- state4: ''
|
|
|
|
|
|
+ state3: '',
|
|
|
|
+ states: []
|
|
}
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
@@ -376,24 +299,15 @@
|
|
|
|
|
|
return result;
|
|
return result;
|
|
},
|
|
},
|
|
- querySearch(query, simulateQuery) {
|
|
|
|
|
|
+ querySearchAsync(query, callback) {
|
|
var states = this.states;
|
|
var states = this.states;
|
|
- var results = query ? states.filter(this.createStateFilter(query)) : states,
|
|
|
|
- deferred;
|
|
|
|
-
|
|
|
|
- if (simulateQuery) {
|
|
|
|
- if (!query) { return []; }
|
|
|
|
-
|
|
|
|
- deferred = $q.defer();
|
|
|
|
|
|
+ var results = query ? states.filter(this.createStateFilter(query)) : states;
|
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
- deferred.resolve(results);
|
|
|
|
- }, Math.random() * 3000, false);
|
|
|
|
|
|
+ if (!query) { return []; }
|
|
|
|
|
|
- return deferred.promise;
|
|
|
|
- } else {
|
|
|
|
- return results;
|
|
|
|
- }
|
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ callback(results);
|
|
|
|
+ }, 3000 * Math.random());
|
|
},
|
|
},
|
|
createStateFilter(query) {
|
|
createStateFilter(query) {
|
|
return (state) => {
|
|
return (state) => {
|
|
@@ -413,7 +327,6 @@
|
|
|------------- |---------------- |---------------- |---------------------- |-------- |
|
|
|------------- |---------------- |---------------- |---------------------- |-------- |
|
|
| placeholder | 输入框占位文本 | string | | |
|
|
| placeholder | 输入框占位文本 | string | | |
|
|
| disabled | 禁用 | boolean | true, false | false |
|
|
| disabled | 禁用 | boolean | true, false | false |
|
|
-| suggestions | 建议列表 | array,object | | |
|
|
|
|
-| value | 输入绑定值 | string | | |
|
|
|
|
|
|
+| value | 必填值输入绑定值 | string | | |
|
|
| showOnUpDown | 是否通过键盘上下键控制建议列表 | boolean | | |
|
|
| showOnUpDown | 是否通过键盘上下键控制建议列表 | boolean | | |
|
|
-| partial | 建议列表的自定义模板 | object | | |
|
|
|
|
|
|
+| fetch-suggestions | 返回输入建议的方法,组件内部通过调用该方法来获得输入建议的数据,在该方法中,仅当你的输入建议数据 resolve 时再通过调用 callback(data:[]) 来返回它 | Function(queryString, callback) | | |
|