const AutoCompleteComponent = {
data() {
return {
open: false,
current: 0,
/** @type {string[]} **/
suggestions: ["first", "ble", "hello"],
fieldWidth: 0,
}
},
mounted() {
this.fieldWidth = this.$refs.inputField.clientWidth;
},
methods: {
focus() {
console.log("Focus activated");
this.open = true;
},
blur() {
console.log("Focus deactivated")
// when I do this, the suggestions dissappear the frame before they are
// clicked, causing the suggestionClick to not be called
this.open = false;
},
//For highlighting element
isActive(index) {
return index === this.current;
},
//When the user changes input
change() {
this.loadSuggestions();
//console.log("change()");
if (this.open == false) {
this.open = true;
this.current = 0;
}
},
//When one of the suggestion is clicked
suggestionClick(index) {
this.currentText = this.matches[index];
console.log("Clicked suggestion: ", index, this.matches[index]);
this.open = false;
},
},
computed: {
/**
* Filtering the suggestion based on the input
* @this {ReturnType}
*/
matches() {
console.log("computed.matches() str=", this.currentText, " suggestions=", this.suggestions);
return this.suggestions.filter((str) => {
const withoutAccents = str.toLowerCase();
return withoutAccents.indexOf(this.currentText.toLowerCase()) >= 0;
});
},
//The flag
openSuggestion() {
return this.currentText !== "" &&
this.matches.length != 0 &&
this.open === true;
},
copiedWidth() {
return this.fieldWidth + "px";
}
},
template: "#vue-auto-complete-template"
};
< /code>
Das ist es ist eine HTML -Vorlage: < /p>
[list]
[*] @click="suggestionClick(suggestion_index)">
{{ suggestion }}
[/list]
< /code>
Dann erstelle ich es so: < /p>
< /code>
Um es unter dem Feld angezeigt zu werden, wird das folgende CSS angewendet: < /p>
.auto-complete-field {
display:inline-block;
}
.auto-complete-field .suggestions-wrapper {
display:block;
position: relative;
}
.auto-complete-field.open ul {
display:initial;
}
.auto-complete-field ul {
list-style:none;
padding:0;
margin:0;
display: none;
position: absolute;
top:0px;
left: 0px;
border-bottom: 1px solid black;
}
.auto-complete-field ul li {
background-color: white;
border: 1px solid black;
border-bottom: none;
}
Jetzt ist das Problem, wenn Sie auf die Funktion bLUr () schauen, wird die geöffnete auf False festgelegt, was wiederum die Vorschläge ul.field-konstions < /Code> Verwenden des aktiven Klasse-Name. field.open ul Bevor das Klickereignis erstellt wird, wird es stattdessen auf dem aufgerufen, was darunter war. this.open = false}, 100) . Ich denke, dass dies funktioniert, dass die Auszeit zumindest zwei Render -Rahmen sein muss. Es funktionierte weder als Mikrotask noch als RequestAnimationFrame . Ich möchte keine Zeitüberschreitung verwenden, insbesondere einen großen, da es zu einem flackernden GUI mit schnellen Klicks flackert. < /P>
Ich suche eine solide Lösung dafür. Ich würde hoffen, dass Vue etwas dafür hat. Eine einfache JS -Lösung hierfür ist in der Regel das Neuauflagen des Blur -Ereignisses durch Anhören mehrerer Ereignisse im Fenster und überprüft, wo sie aufgetreten sind. Ich würde das lieber vermeiden.
blur() { console.log("Focus deactivated") // when I do this, the suggestions dissappear the frame before they are // clicked, causing the suggestionClick to not be called this.open = false; },
//For highlighting element isActive(index) { return index === this.current; },
//When the user changes input change() { this.loadSuggestions(); //console.log("change()"); if (this.open == false) { this.open = true; this.current = 0; } },
//When one of the suggestion is clicked suggestionClick(index) { this.currentText = this.matches[index]; console.log("Clicked suggestion: ", index, this.matches[index]); this.open = false; }, }, computed: {
/** * Filtering the suggestion based on the input * @this {ReturnType} */ matches() { console.log("computed.matches() str=", this.currentText, " suggestions=", this.suggestions); return this.suggestions.filter((str) => { const withoutAccents = str.toLowerCase(); return withoutAccents.indexOf(this.currentText.toLowerCase()) >= 0; }); },
< /code> Um es unter dem Feld angezeigt zu werden, wird das folgende CSS angewendet: < /p> .auto-complete-field { display:inline-block; } .auto-complete-field .suggestions-wrapper { display:block; position: relative; }
.auto-complete-field.open ul { display:initial; }
.auto-complete-field ul { list-style:none; padding:0; margin:0;
display: none;
position: absolute; top:0px; left: 0px;
border-bottom: 1px solid black; } .auto-complete-field ul li { background-color: white; border: 1px solid black; border-bottom: none; } [/code] Jetzt ist das Problem, wenn Sie auf die Funktion bLUr () schauen, wird die geöffnete auf False festgelegt, was wiederum die Vorschläge ul.field-konstions < /Code> Verwenden des aktiven Klasse-Name. field.open ul Bevor das Klickereignis erstellt wird, wird es stattdessen auf dem aufgerufen, was darunter war. this.open = false}, 100) . Ich denke, dass dies funktioniert, dass die Auszeit zumindest zwei Render -Rahmen sein muss. Es funktionierte weder als Mikrotask noch als RequestAnimationFrame . Ich möchte keine Zeitüberschreitung verwenden, insbesondere einen großen, da es zu einem flackernden GUI mit schnellen Klicks flackert. < /P> Ich suche eine solide Lösung dafür. Ich würde hoffen, dass Vue etwas dafür hat. Eine einfache JS -Lösung hierfür ist in der Regel das Neuauflagen des Blur -Ereignisses durch Anhören mehrerer Ereignisse im Fenster und überprüft, wo sie aufgetreten sind. Ich würde das lieber vermeiden.
Dies ist ein unvollständiges Website-Design, mit dem ich gearbeitet habe. Das Problem besteht darin, dass, wenn ich die Breite des Browsers verkleinere, der dreifache Strich erscheint, das...
Dies ist ein unvollständiges Website-Design, mit dem ich gearbeitet habe. Das Problem besteht darin, dass, wenn ich die Breite des Browsers verkleinere, der dreifache Strich erscheint, das...
Dies ist ein unvollständiges Website-Design, mit dem ich gearbeitet habe. Das Problem besteht darin, dass, wenn ich die Breite des Browsers verkleinere, der dreifache Strich erscheint, das...
Ich versuche, eine Einschränkungsprogrammierlösung für die Elementallokation im Regal zu formulieren. Das Ziel ist, dass einfache Gegenstände derselben Marke so nah wie möglich gehalten werden und...