Mithilfe der Vue-Sprache und Elementkomponenten müssen wir einen Online-Code-Editor erstellen, der die Eingabe von Codeinhalten erfordert, die hervorgehoben werden können, zwischen verschiedenen Sprachen wechseln können, die Schlüsselwortvervollständigung unterstützen und einen Links-Rechts-Vergleich von Code zwischen verschiedenen Versionen ermöglichen. Das ist die Anforderung. Warum Monaco gewählt wurde, erfahren Sie im umfassenden Vergleich der Code-Hervorhebungs-Plugins in Vue (Element). Okay, jetzt legen wir los! Zuerst müssen Sie die Komponenten monaco-editor und monaco-editor-webpack-plugin herunterladen. npm installiere Monaco-Editor npm installiere Monaco-Editor-Webpack-Plugin Natürlich sind npm-Downloads sehr langsam, wechseln Sie also zu einem inländischen Mirror wie beispielsweise Taobao. Tatsächlich nahm die Geschwindigkeit rasch zu. npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm installieren cnpm installiere Monaco-Editor cnpm installiere Monaco-Editor-Webpack-Plugin Sie können die Verzeichnisstruktur unter node_modules sehen. Der Kerncode lautet wie folgt Schreiben Sie zunächst eine Komponente, die andere Seiten importieren und aufrufen können. CodeEditor.vue <Vorlage> <div Klasse = "Code-Container" ref = "Container"></div> </Vorlage> <Skript> * als Monaco aus „Monaco-Editor“ importieren; let sqlStr = "ADD EXCEPT PERCENT ALL EXEC PLAN ALTER EXECUTE PRECISION AND EXISTS PRIMARY ANY EXIT PRINT AS FETCH PROC ASC FILE PROCEDURE AUTHORIZATION FILLFACTOR PUBLIC BACKUP FOR RAISERROR BEGIN FOREIGN READ BETWEEN FREETEXT READTEXT BREAK FREETEXTTABLE RECONFIGURE BROWSE FROM REFERENCES BULK FULL REPLICATION BY FUNCTION RESTORE CASCADE GOTO RESTRICT CASE GRANT RETURN CHECK GROUP REVOKE CHECKPOINT HAVING RIGHT CLOSE HOLDLOCK ROLLBACK CLUSTERED IDENTITY ROWCOUNT COALESCE IDENTITY_INSERT ROWGUIDCOL COLLATE IDENTITYCOL RULE COLUMN IF SAVE COMMIT IN SCHEMA COMPUTE INDEX SELECT CONSTRAINT INNER SESSION_USER CONTAINS INSERT SET CONTAINSTABLE INTERSECT SETUSER CONTINUE INTO SHUTDOWN CONVERT IS SOME CREATE JOIN STATISTICS CROSS KEY SYSTEM_USER CURRENT KILL TABLE CURRENT_DATE LEFT TEXTSIZE CURRENT_TIME LIKE THEN CURRENT_TIMESTAMP LINENO TO CURRENT_USER LOAD TOP CURSOR NATIONAL TRAN DATABASE NOCHECK TRANSACTION DBCC NONCLUSTERED TRIGGER DEALLOCATE NOT TRUNCATE DECLARE NULL TSEQUAL DEFAULT NULLIF UNION DELETE OF UNIQUE DENY OFF UPDATE DESC OFFSETS UPDATETEXT DISK ON USE DISTINCT OPEN USER DISTRIBUTED OPENDATASOURCE VALUES DOUBLE OPENQUERY VARYING DROP OPENROWSET VIEW DUMMY OPENXML WAITFOR DUMP OPTION WHEN ELSE OR WHERE END ORDER WHILE ERRLVL OUTER WITH ESCAPE OVER WRITETEXT"; Standard exportieren { Name: "CodeEditor", Requisiten: { Optionen: Typ: Objekt, Standard() { zurückkehren { Sprache: "Java", // Shell, SQL, Python readOnly: true // kann nicht bearbeitet werden}; } }, Wert: { Typ: Zeichenfolge, Standard: "" } }, Daten() { zurückkehren { monacoInstance: null, Anbieter: null, Hinweise: [ "WÄHLEN", "EINFÜGEN", "LÖSCHEN", "AKTUALISIEREN", "TABELLE ERSTELLEN", "Tabelle löschen", "ALTER TABLE", "ANSICHT ERSTELLEN", "DROP-ANSICHT", "INDEX ERSTELLEN", "INDEX VERRINGERN", "VERFAHREN ERSTELLEN", „DROP-VERFAHREN“, "TRIGGER ERSTELLEN", "Abzug fallen lassen", "SCHEMA ERSTELLEN", "DROP SCHEMA", "DOMAIN ERSTELLEN", "ALTER DOMAIN", "DOMAIN LÖSCHEN", "GEWÄHREN", "LEUGNEN", "WIDERRUFEN", "BEGEHEN", "ROLLBACK", "Transaktion festlegen", "ERKLÄREN", "ERKLÄREN", "OFFEN", "BRINGEN", "SCHLIESSEN", "VORBEREITEN", "AUSFÜHREN", "BESCHREIBEN", "BILDEN", "BESTELLEN NACH" ] }; }, erstellt() { dies.initHints(); }, montiert() { dies.init(); }, vorZerstören() { dies.entsorgen(); }, Methoden: { entsorgen() { wenn (diese.monacoInstance) { wenn (this.monacoInstance.getModel()) { dies.monacoInstance.getModel().dispose(); } diese.monacoInstance.dispose(); this.monacoInstance = null; wenn (dieser.Anbieter) { dieser.Anbieter.entsorgen(); dieser.Anbieter = null } } }, initHints() { let sqlArr = sqlStr.split(" "); this.hints = Array.from(neues Set([...this.hints, ...sqlArr])).sort(); }, init() { lass das = dies; dies.entsorgen(); let createCompleters = textUntilPosition => { //Sonderzeichen filtern let _textUntilPosition = textUntilPosition .replace(/[\*\[\]@\$\(\)]/g, "") .replace(/(\s+|\.)/g, " "); //In Array schneiden let arr = _textUntilPosition.split(" "); //Den aktuellen Eingabewert abrufen let activeStr = arr[arr.length - 1]; //Länge des Eingabewerts abrufen let len = activeStr.length; //Den vorhandenen Inhalt im Bearbeitungsbereich abrufen let rexp = new RegExp('([^\\w]|^)'+activeStr+'\\w*', "gim"); lass match = dieser.Wert.match(rexp); lass _hints = !match ? [] : match.map(ele => { Lassen Sie rexp = neuer RegExp(activeStr, "gim"); lass Suche = ele.search(rexp); returniere ele.substr(Suche) }) // Elemente finden, die dem aktuellen Eingabewert entsprechen let hints = Array.from(new Set([...that.hints, ..._hints])).sort().filter(ele => { let rexp = neuer RegExp(ele.substr(0, len), "gim"); returniere Übereinstimmung && Übereinstimmungslänge === 1 && Element === activeStr || Elementlänge === 1 ? FALSCH : activeStr.match(rexp); }); //Inhaltshinweise hinzufügen let res = hints.map(ele => { zurückkehren { Bezeichnung: Element, Art: that.hints.indexOf(ele) > -1 ? monaco.languages.CompletionItemKind.Keyword : monaco.languages.CompletionItemKind.Text, Dokumentation: ele, insertText:ele }; }); Rückgabewert; }; dieser.Anbieter = monaco.languages.registerCompletionItemProvider("sql", { provideCompletionItems(Modell, Position) { var textUntilPosition = model.getValueInRange({ startLineNumber: position.lineNumber, Startspalte: 1, endLineNumber: position.lineNumber, endColumn: position.spalte }); var Vorschläge = createCompleters(textUntilPosition); zurückkehren { Vorschläge: Vorschläge }; returniere createCompleters(textUntilPosition); } }); // Initialisiere die Editorinstanz this.monacoInstance = monaco.editor.create(this.$refs["container"], { Wert: dieser.Wert, Thema: "vs-dark", autoIndex: true, …diese.Optionen }); // Auf Inhaltsänderungsereignisse des Editors warten this.monacoInstance.onDidChangeModelContent(() => { dies.$emit("contentChange", dies.monacoInstance.getValue()); }); } } }; </Skript> <style lang="scss" scope> .code-container { Breite: 100 %; Höhe: 100%; Überlauf: versteckt; Rand: 1px durchgezogen #eaeaea; .monaco-editor .scroll-decoration { Kastenschatten: keiner; } } </Stil> Seite zur Verwendung auf dieser Seite importieren index.vue <Vorlage> <div Klasse="Container"> <Code-Editor :Optionen="Optionen" :Wert="Inhalt" @contentChange="Inhaltsänderung" Stil="Höhe: 400px; Breite: 600px;" ></Codeeditor> </div> </Vorlage> <Skript> CodeEditor aus "@/components/CodeEditor" importieren; Standard exportieren { Name: "SQLEditor", Komponenten: CodeEditor }, Daten() { zurückkehren { Inhalt: "", Optionen: Sprache: "SQL", Thema: 'vs', schreibgeschützt: false } }; }, erstellt() {}, Methoden: { // Änderungen im Wert des Bindungseditors contentChange(val) { dieser.Inhalt = Wert; } } }; </Skript> <style scoped lang="scss"> .container { Textausrichtung: links; Polsterung: 10px; } </Stil> Die Wirkung ist wie folgt Der Code löst automatisch den Effekt aus, wie unten gezeigt Der Codehervorhebungseffekt, der Codesegmentfaltungseffekt und der Vorschaueffekt rechts sind wie folgt Oben sind die Details, wie Vue Monaco verwendet, um Code-Hervorhebung zu erreichen. Weitere Informationen zur Vue-Code-Hervorhebung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Grafisches Tutorial zum Konfigurieren eines Protokollservers unter Linux
>>: CentOS 6.5 Installations-Tutorial zu MySQL 5.7
In diesem Artikel erfahren Sie, wie Sie mit Vue e...
Konfigurationsbeispiel Upstream-Backend { Server ...
Zuerst müssen wir das Attribut „transform-origin“...
Erfahren Sie mehr über ähnliche Methoden zum Ermi...
Warum optimieren: Beim Start des eigentlichen Pro...
vue-element-admin importiert Komponentenkapselung...
Vorwort Also habe ich diesen Blog geschrieben. Di...
1. Quelle des Problems Ein Freund von @水米田 hat mi...
1. Die Größe des durch den HTML-Hyperlink geöffne...
Von: https://blog.csdn.net/qq_44761243/article/de...
Geben Sie zunächst einen Code ein für(int i=0;i&l...
Da ich derzeit zum Erlernen von Deep Learning die...
Dieser Artikel stellt hauptsächlich die dynamisch...
Inhaltsverzeichnis 1. Filtern Sie eindeutige Wert...
Der Dienst des Unternehmens verwendet Docker und ...