Migration von Vue 1.x
Inhaltsverzeichnis
FAQ
Wow, das ist eine sehr lange Seite! Bedeutet das, dass Vue 2.0 völlig anders ist? Müssen Sie es von Grund auf lernen? Ist es unmöglich, Vue 1.0-Projekte zu migrieren?
Ich freue mich sehr, Ihnen mitteilen zu können, dass dies nicht der Fall ist! Fast 90 % der API und Kernkonzepte bleiben unverändert. Dieser Abschnitt ist etwas lang, da er ausführliche Erläuterungen und viele Migrationsbeispiele enthält. Keine Sorge, Sie müssen diesen Abschnitt nicht von Anfang bis Ende lesen!
Wo soll ich mit der Projektmigration beginnen?
1. Führen Sie zunächst das Migrationstool unter dem aktuellen Projekt aus. Wir haben großen Wert darauf gelegt, den erweiterten Vue-Upgrade-Prozess auf die Verwendung eines einfachen Befehlszeilentools zu vereinfachen. Wenn das Tool eine ältere Funktion erkennt, benachrichtigt es Sie und gibt Empfehlungen sowie Links zu weiteren Informationen.
2. Durchsuchen Sie dann den in der Seitenleiste dieser Seite aufgeführten Inhalt. Wenn Sie feststellen, dass einige Titel Auswirkungen auf Ihr Projekt haben, das Migrationstool jedoch keine entsprechende Meldung ausgibt, überprüfen Sie bitte Ihr Projekt.
3. Wenn Ihr Projekt über Testcode verfügt, führen Sie ihn aus und sehen Sie, wo er immer noch fehlschlägt. Wenn Sie keinen Testcode haben, öffnen Sie Ihre Anwendung in einem Browser, navigieren Sie herum und achten Sie auf etwaige Fehler oder Warnungen.
4. Ihre Anwendung sollte nun vollständig migriert sein. Wenn Sie mehr erfahren möchten, können Sie den Rest dieser Seite lesen – oder im Abschnitt Einführung von vorne beginnen und in die neue Dokumentation und verbesserte Anleitung eintauchen. Viele Abschnitte wurden weggelassen, da Sie mit einigen der Kernkonzepte bereits vertraut sind.
Wie lange dauert die Migration einer Vue 1.x-Versionsanwendung auf 2.0?
Dies hängt von mehreren Faktoren ab:
Hängt von der Größe Ihrer Anwendung ab (kleine und mittlere Anwendungen können grundsätzlich in einem durchgeführt werden). Tag) .
Je nachdem, wie oft Sie abgelenkt werden und die coolste neue Funktion von 2.0 starten. Ich kann die Zeit nicht sagen, das passiert oft, wenn wir 2.0-Apps erstellen!
Hängt davon ab, welche Legacy-Funktionen Sie verwenden. Die meisten können über Suchen und Ersetzen aktualisiert werden, bei einigen kann es jedoch eine Weile dauern. Wenn Sie Best Practices nicht befolgen, wird Vue 2.0 sein Bestes geben, um Sie zur Einhaltung zu zwingen. Dies ist gut für den langfristigen Betrieb des Projekts, kann aber auch eine erhebliche Umgestaltung bedeuten (obwohl einige der Teile, die umgestaltet werden müssen, möglicherweise veraltet sind).
Wenn ich auf Vue 2 aktualisiere, muss ich dann auch Vuex und Vue Router gleichzeitig aktualisieren?
Nur Vue Router 2 bleibt mit Vue 2 kompatibel, daher muss Vue Router aktualisiert werden und Sie müssen die Vue Router-Migrationsmethode befolgen, um damit umzugehen. Glücklicherweise verfügen die meisten Anwendungen nicht über viel Router-bezogenen Code, sodass die Migration wahrscheinlich nicht länger als eine Stunde dauern wird.
Für Vuex bleibt Version 0.8 mit Vue 2 kompatibel, sodass für einige Teile kein Upgrade erzwungen werden muss. Der einzige Grund für ein Upgrade jetzt ist, wenn Sie die neuen erweiterten Funktionen in Vuex 2 nutzen möchten, wie z. B. Module und reduzierte Boilerplate.
Vorlage
Fragmentinstanz Entfernen
Jede Komponente darf nur ein Stammelement haben. Fragmentinstanzen sind nicht mehr zulässig, wenn Sie eine Vorlage wie diese haben:
<p>foo</p> <p>bar</p>
Es ist besser, einfach den gesamten Inhalt in ein neues Element zu packen, wie folgt:
<div> <p>foo</p> <p>bar</p> </div>
Upgrade-Methode
Führen Sie die End-to-End-Testsuite (End-to-End-Testsuite) aus oder führen Sie die Anwendung anschließend aus das Upgrade, und schauen Sie sich Konsolenwarnungen an, um Stellen in Vorlagen zu finden, die mehrere Stammelemente haben.
Lebenszyklus-Hook-Funktion
EntfernenbeforeCompile
beforeCompile
created
in der Codebasis aus, um alle Funktionen zu finden, die diesen Hook verwenden Beispiel.
compiled
kompiliert
mounted
Ersetzen Sie
Führen Sie das
in der Codebasis aus, um alle Funktionen zu finden, die diesen Hook verwenden Beispiel. attached
Verwenden Sie die integrierte DOM-Prüfmethode anderer Hook-Funktionen. Ersetzen Sie beispielsweise Folgendes:
attached: function () { doSomething() }
kann wie folgt verwendet werden: mounted: function () {
this.$nextTick(function () {
doSomething()
})
}
Upgrade-Methode
detached
in der Codebasis Führen Sie das Migrationstool aus, um alle Beispiele zu finden, die diese Hook-Funktion verwenden.
freistehend
Entfernen
detached: function () { doSomething() }kann wie folgt verwendet werden:
destroyed: function () { this.$nextTick(function () { doSomething() }) }<🎜><🎜><🎜><🎜>Upgrade-Methode<🎜><🎜><🎜><🎜> in der Codebasis Führen Sie das <🎜>Migrationstool<🎜> aus, um alle Beispiele zu finden, die diese Hook-Funktion verwenden. <🎜><🎜>
init
Umbenennen
Verwenden Sie stattdessen die neue Hook-Funktion beforeCreate
. Im Wesentlichen sind beforeCreate und init genau gleich. init wurde umbenannt, um der Benennung anderer Lebenszyklusmethoden zu entsprechen.
Upgrade-Methode
Führen Sie das Migrationstool in der Codebasis aus, um alle Funktionen zu finden, die diesen Hook verwenden Beispiel.
ersetzt ready
bereit
mounted
mounted
Vue.nextTick
durch die neue vm.$nextTick
Hook-Funktion. Es ist zu beachten, dass die Verwendung von
eingeführt werden. Zum Beispiel: mounted: function () {
this.$nextTick(function () {
// 代码保证 this.$el 在 document 中
})
}
in der Codebasis aus, um das herauszufinden alle Verwendungen Beispiel dieser Hook-Funktion.
v-for
v-for
v-for
v-for
index
Die Parameterreihenfolge beim Durchlaufen des Arrays (index, value)
ändert sich in (value, index)
forEach
map
Wenn enthalten ist, war die vorherige Parameterreihenfolge beim Durchlaufen des Arrays . Es soll nun mit den nativen Array-Methoden von JavaScript (wie und
) konsistent sein.v-for
Parameterreihenfolge beim Durchlaufen des Objekts Änderung
Wenn eine Eigenschaft enthalten ist Name / Schlüssel, die Parameterreihenfolge des vorherigen Durchlaufobjekts ist (name, value)
. Nun (value, name)
, um mit gängigen Objektiteratoren (z. B. lodash) konsistent zu sein.
Upgrade-Methode
Führen Sie das Migrationstool in der Codebasis aus, um diejenigen zu finden, die die alten Parameter verwenden Beispiel für eine Sequenz. Beachten Sie, dass das Migrationstool Ihre Schlüsselparameter nicht markiert, wenn Sie sie ungewöhnlich benennen (z. B. name
oder property
).
und Entfernt$index
$index$key
$index
$key
v-for
Die beiden implizit deklarierten Variablen
explizit definiert werden können. Dies ermöglicht Entwicklern ohne viel Erfahrung in der Vue-Entwicklung, den Code besser zu lesen, und führt außerdem zu einem saubereren Verhalten beim Umgang mit verschachtelten Schleifen.
Upgrade-MethodeFühren Sie das MigrationstoolUncaught ReferenceError: $index is not defined
in der Codebasis aus, um herauszufinden, welche Variablen verwendet werden entferntes Beispiel. Wenn Sie es nicht finden, können Sie auch unter
).
track-by
Track-by
track-by
ersetztkey
v-bind
:
oder Präfix, es wird behandelt als String. In den meisten Fällen müssen Sie statische Schlüssel durch dynamische Bindung mit vollständigen Ausdrücken ersetzen. Um zum Beispiel zu ersetzen: <div v-for="item in items" track-by="id">
sollten Sie jetzt schreiben:
<div v-for="item in items" v-bind:key="item.id">
v-for
Bereichswert ändert sich
vor v-for="number in 10"
> Beginnend bei 0 und endet bei 9, jetzt beginnt bei 1 und endet bei 10 vorbei. number
Upgrade-Methode
Verwenden Sie die reguläre Suche in der Codebasis. Wenn Sie in /w in d /
erscheinen, prüfen Sie bitte, ob es betroffen ist. v-for
Requisiten
coerce
zwingen
Prop-Parameter EntfernenWenn Sie den Wert von Prop überprüfen müssen, erstellen Sie einen intern berechneten Wert statt in Props Definieren Sie es intern, zum Beispiel:
props: { username: { type: String, coerce: function (value) { return value .toLowerCase() .replace(/\s+/, '-') } } }
sollte jetzt geschrieben werden als:
props: { username: String, }, computed: { normalizedUsername: function () { return this.username .toLowerCase() .replace(/\s+/, '-') } }
- Das hat einige Vorteile:
- Sie können die ursprüngliche Requisite behalten Wert Betriebserlaubnis.
- Zwingt Entwickler dazu, explizite Deklarationen zu verwenden, indem sie dem validierten Wert einen anderen Namen geben.
twoWay
twoWay
Entfernt
Benutzerdefinierte Eingabekomponente (Komponentenereignisse verwenden)
Upgrade-MethodetwoWay
und
v-bind
.once
Requisiten können jetzt nur noch in eine Richtung weitergegeben werden. Um eine umgekehrte Wirkung auf die übergeordnete Komponente zu erzielen, muss die untergeordnete Komponente ein Ereignis explizit übergeben, anstatt sich auf eine implizite bidirektionale Bindung zu verlassen. Einzelheiten finden Sie unter: .sync
Benutzerdefiniertes Komponentenereignis
Benutzerdefinierte Eingabekomponente (Komponentenereignisse verwenden)
Migrationstool aus, um Instanzen zu finden, die die Modifikatoren .once und verwenden.
Requisiten ändernRequisiten innerhalb der Komponente ändern Es ist ein Anti-Pattern (nicht empfohlen). Deklarieren Sie beispielsweise zuerst eine Requisite und ändern Sie dann den Wert der Requisite über in der Komponente. Gemäß dem Rendering-Mechanismus wird beim erneuten Rendern der übergeordneten Komponente auch der interne Requisitenwert der untergeordneten Komponente überschrieben. In den meisten Fällen kann das Ändern des Prop-Werts durch die folgenden Optionen ersetzt werden:
Über das Datenattribut verwenden Sie prop, um den Standardwert eines Datenattributs festzulegen . this.myProp = 'someOtherValue'
Upgrade-Methode
-Kontrolle zur Requisitenmodifikation Taiwan-Warnmeldung .
Requisiten für Root-Instanz
für eine Root Instanz Für Instanzen (zum Beispiel: Instanzen, die mit erstellt wurden) können Sie nur verwenden statt .
new Vue({ ... })
Upgrade-MethodepropsData
props
fehlgeschlagene Tests werden angezeigt um Sie zu benachrichtigen. Die Root-Instanz von ist abgelaufen.
Berechnetes Eigentum
Veraltetcache: false
Cache: false
template: '<p>message: {{ timeMessage }}</p>', computed: { timeMessage: { cache: false, get: function () { return Date.now() + this.message } } }
oder verwenden Sie die Komponentenmethode: template: '<p>message: {{ getTimeMessage() }}</p>',
methods: {
getTimeMessage: function () {
return Date.now() + this.message
}
}
zu finden.
Eingebaut Befehle
v-bind
v-bind
Geändertv-bind
null
undefined
false
0
v-bind:draggable="''"
Bei Verwendung von draggable="true"
in 2.0 werden nur
und "false"
als falsch behandelt. Dies bedeutet, dass attr="false"
und leere Zeichenfolgen als wahre Werte gerendert werden. Beispielsweise wird
gerendert.gerendert.
v-if
Für Aufzählungseigenschaften wird zusätzlich zu den oben genannten falschen Werten die Zeichenfolgev-show
auch als
Beachten Sie, dass für andere Hook-Funktionen (wie und ) weiterhin die allgemeinen Regeln von js zur Beurteilung von wahren und falschen Werten gelten.
Führen Sie End-to-End-Tests durch, wenn wahrscheinlich ein Teil Ihrer App betroffen ist Durch dieses Upgrade auf wird die Fehlermeldung „fehlgeschlagen“ angezeigt Testsv-on
, um auf native Ereignisse zu achtenv-on
Ändern$emit
.native
Die Verwendung von für eine Komponente überwacht jetzt nur noch benutzerdefinierte Ereignisse (Ereignisse, die durch Komponenten mit ausgelöst werden). Wenn Sie die nativen Ereignisse des Stammelements abhören möchten, können Sie den Modifikator verwenden, z. B.:
<my-component v-on:click.native="doSomething"></my-component>
debounce
v-model
mit Entfernen
Entprellung wurde einst zur Steuerung verwendet die Häufigkeit von Ajax-Anfragen und anderen zeitintensiven Aufgaben. Die v-model
-Attributparameter von debounce
in Vue machen es in einigen einfachen Fällen sehr einfach, diese Art der Steuerung zu erreichen. Tatsächlich dient dies jedoch dazu, die Häufigkeit von Statusaktualisierungen zu steuern, und nicht die zeitaufwändige Aufgabe selbst. Dies ist ein kleiner Unterschied, der jedoch mit zunehmender Größe Ihrer Anwendung zu einer Einschränkung wird.
Zum Beispiel Einschränkungen beim Entwerfen einer Suchaufforderung:
Mit dem Parameter debounce
können Sie den Status „Tippen“ nicht beobachten. Weil der Eingangsstatus nicht in Echtzeit erkannt werden kann. Durch die Entkopplung debounce
von Vue können wir diese Einschränkungen jedoch vermeiden, indem wir nur die Vorgänge verzögern, die wir steuern möchten:
<!-- 通过使用 lodash 或者其它库的 debounce 函数, 我们相信 debounce 实现是一流的, 并且可以随处使用它,不仅仅是在模板中。 --> <script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.js"></script> <div id="debounce-search-demo"> <input v-model="searchQuery" placeholder="Type something"> <strong>{{ searchIndicator }}</strong> </div>rrree
Ein weiterer Vorteil dieses Ansatzes besteht darin, dass bei der Ausführung der umschlossenen Funktion die Zeit gleich ist Aufgrund der Verzögerungszeit wird länger gewartet. Wenn Sie beispielsweise Suchvorschläge machen, müssen Sie warten, bis der Benutzer eine Zeit lang mit der Eingabe aufhört, bevor Sie Vorschläge machen, was eine sehr schlechte Erfahrung ist. Tatsächlich ist es zu diesem Zeitpunkt besser geeignet, die Funktion Drosselung zu verwenden. Da Sie jetzt die Freiheit haben, Bibliotheken wie lodash zu verwenden, können Sie Ihr Projekt mithilfe der Drosselung schnell umgestalten.
Upgrade-Pfad
Führen Sie die Instanz Migrationstool mit dem Parameter debounce
aus.
Verwenden Sie den Parameter lazy
oder number
von v-model
. ersetzt
lazy
und number
Parameter werden jetzt in Form von Modifikatoren verwendet, wodurch es klarer aussieht:
new Vue({ el: '#debounce-search-demo', data: { searchQuery: '', searchQueryIsDirty: false, isCalculating: false }, computed: { searchIndicator: function () { if (this.isCalculating) { return '⟳ Fetching new results' } else if (this.searchQueryIsDirty) { return '... Typing' } else { return '✓ Done' } } }, watch: { searchQuery: function () { this.searchQueryIsDirty = true this.expensiveOperation() } }, methods: { // 这是 debounce 实现的地方。 expensiveOperation: _.debounce(function () { this.isCalculating = true setTimeout(function () { this.isCalculating = false this.searchQueryIsDirty = false }.bind(this), 1000) }, 500) } })
wird jetzt so geschrieben:
<input v-model="name" lazy> <input v-model="age" type="number" number>
Upgrade-Methode
Führen Sie das Migrationstool aus, um diese veralteten Parameter zu finden.
Verwenden Sie inline value
für v-model
, um
v-model
zu entfernen Nicht mehr inline value
Der auf diese Weise initialisierte Anfangswert verwendet offensichtlich das entsprechende Attribut der Instanzdaten als tatsächlichen Anfangswert.
Das bedeutet, dass das folgende Element:
<input v-model.lazy="name"> <input v-model.number="age" type="number">
mit dem Folgenden in der Datenoption:
<input v-model="text" value="foo">
das Modell als „bar“ statt als „foo“ rendert. Ebenso gilt für den vorhandenen Wert von <textarea>
:
data: { text: 'bar' }
muss sicherstellen, dass der Anfangswert von text
„Hallo“ ist Welt"
Upgrade-Methode
Führen Sie den End-to-End-Test nach dem Upgrade durch und achten Sie auf v-model
Inline-Parameter Konsole Warnungen
mit Iterierten Grundwerten Entfernenv-model
V-Modellv-for
<input>
So zu schreiben wird nicht funktionieren:
<textarea v-model="text"> hello world </textarea>
Weil v-model
in js-Code ähnlich dem folgenden kompiliert wird: str
<input v-for="str in strings" v-model="str">Auf diese Weise ist die bidirektionale Bindung von
hier ungültig. Das Zuweisen von v-model
zu einem anderen Wert im Iterator funktioniert ebenfalls nicht, da es sich lediglich um eine Variable innerhalb der Funktion handelt.
die Felder im Objekt synchron aktualisieren kann, zum Beispiel: strings.map(function (str) {
return createElement('input', ...)
})
Führen Sie den Test Ihrer App aus Wenn ein Ort von diesem Update betroffen ist, wird eine Meldung zu fehlgeschlagenen Tests eingeblendet.
!important
v-bind:style
mit Entfernen
!important
Das Schreiben wie folgt ist ungültig:
<input v-for="obj in objects" v-model="obj.str">
, am besten schreiben Sie es in String-Form: <p v-bind:style="{ color: myColor + ' !important' }">hello</p>
v-el
und v-ref
ersetzen
Der Einfachheit halber werden v-el
und v-ref
zusammengeführt in ein ref
-Attribut, das in der Komponenteninstanz übergeben werden kann $refs
anrufen. Das bedeutet, dass v-el:my-element
so geschrieben wird: ref="myElement"
und v-ref:my-component
so wird: ref="myComponent"
. Bei der Bindung an ein allgemeines Element bezieht sich ref
auf ein DOM-Element. Bei der Bindung an eine Komponente handelt es sich bei ref
um eine Komponenteninstanz.
Da v-ref
keine Anweisung mehr, sondern ein spezielles Attribut ist, kann es auch dynamisch definiert werden. Dies ist nützlich, wenn es mit v-for
kombiniert wird:
<p v-bind:style="'color: ' + myColor + ' !important'">hello</p>
Bisher führte die Verwendung von v-el
/v-ref
mit v-for
zu einem DOM-Array oder Komponentenarray, da es keine Möglichkeit gab, jedem A eine spezifische Angabe zu geben Name für das Element. Sie können dies immer noch tun und jedem Element das gleiche ref
geben:
<p v-for="item in items" v-bind:ref="'item' + item.id"></p>
Im Gegensatz zu 1.x reagieren $refs
nicht, da sie während des Renderns registriert/aktualisiert werden. Nur wenn Sie auf Änderungen achten und diese wiederholt rendern, können Sie sie reaktionsfähig machen.
Andererseits ist das Design $refs
hauptsächlich für den Zugriff durch JS-Programme vorgesehen, und es wird nicht empfohlen, sich in Vorlagen zu sehr darauf zu verlassen. Denn das bedeutet, dass auf den Instanzstatus außerhalb der Instanz zugegriffen werden muss, was dem datengesteuerten Denken von Vue zuwiderläuft.
Upgrade-Methode
Führen Sie das Migrationstool aus, um v-el
und v-ref
herauszufinden in der Instanz.
Später verwenden Entfernenv-show
v-showv-else
v-else
v-show
v-if
v-show
kann nach
im negativen Zweig von
. Zum Beispiel:<p v-for="item in items" ref="items"></p>
sollte jetzt so geschrieben werden: <p v-if="foo">Foo</p>
<p v-else v-show="bar">Not foo, but bar</p>
Benutzerdefinierte AnweisungenVereinfacht
In der neuen Version ist die Verwendung von Anweisungen Der Umfang wurde stark reduziert: Jetzt wird die Direktive nur noch für die DOM-Manipulation auf niedriger Ebene verwendet. In den meisten Fällen ist es am besten, Komponenten als Abstraktionsschicht für die Wiederverwendung von Code zu verwenden.
Die wesentlichen Änderungen sind wie folgt:
Die Direktive hat keine Instanz mehr. Das heißt, Sie haben das
this
der Instanz nicht mehr in der Hook-Funktion der Direktive. Stattdessen können Sie in den Parametern alle benötigten Daten übernehmen. Wenn Sie es wirklich brauchen, können Sie überel
auf die Instanz zugreifen.Ähnlich wie
acceptStatement
,deep
,priority
usw. sind veraltet. Informationen zum Ersetzen der双向
-Direktive finden Sie unter Beispiel.Jetzt ist die Bedeutung einiger Hooks anders als zuvor und es gibt zwei weitere Hook-Funktionen.
Glücklicherweise ist der neue Haken einfacher und leichter zu beherrschen. Weitere Informationen finden Sie im Anleitung zu benutzerdefinierten Befehlen.
Upgrade-Methode
Führen Sie das Migrationstool aus, um herauszufinden, wo die Direktive definiert ist. Das Hilfstool markiert diese Stellen, da diese Stellen wahrscheinlich umgestaltet werden müssen.
Richtlinie.literal
ModifikatorEntfernen
.literal Modifikatoren wurden entfernt. Um die gleiche Funktionalität zu erhalten, können Sie einfach Zeichenfolgenmodifikatoren als Werte angeben.
Beispiel wie folgt ändern:
<p v-if="foo">Foo</p> <p v-if="!foo && bar">Not foo, but bar</p>
Einfach:
<p v-my-directive.literal="foo bar baz"></p>
Upgrade-Methode
Führen Sie das Migrationstool aus, um herauszufinden, was in der Instanz verwendet wird Ein Platz für den Modifikator „.literal“.
Übergang
Der Parameter ersetzt transition
Übergang
<transition>
<transition-group>
transition
Übergangseffekte werden jetzt durch die Verwendung von und zum Umschließen von Elementen erreicht der Verwendung des
-Attribut verwendet wird.
Vue.transition
Wiederverwendbare Übergänge Ersetzen
über Vorlagen wiederverwenden.
Upgrade-MethodeMigrationstool-Attribut verwendet wird.
stagger
Übergangsparameter entfernt
data-index
Wenn Sie Wenn Sie beim Rendern von Listen einen allmählichen Übergang verwenden möchten, können Sie dies tun, indem Sie das
Veranstaltung
Die Option Entferntevents
Ereignisse
events
created
$dispatch
ist veraltet. Event-Handler sind jetzt in $broadcast
Hooks registriert. Siehe detaillierte Beispiele
Migrationsleitfaden
Vue.directive('on').keyCodes
Vue.directive('on').keyCodes
keyCodes
ersetzt Vue.config.keyCodes
durch die neue prägnante Konfiguration durch Zum Beispiel:
<p v-my-directive="'foo bar baz'"></p>
$dispatch
und $broadcast
ersetzt
$dispatch
und $broadcast
ist veraltet. Bitte verwenden Sie eine prägnantere und klarere Kommunikation zwischen Komponenten und bessere Zustandsverwaltungslösungen, wie zum Beispiel: Vuex.
Weil die auf der Komponentenbaumstruktur basierende Ereignisflussmethode wirklich schwer zu verstehen ist und mit zunehmender Komponentenstruktur immer fragiler wird. Diese Ereignismethode ist wirklich nicht gut und wir möchten den Entwicklern in Zukunft nicht zu viel Ärger bereiten. Und $dispatch
und $broadcast
lösen nicht das Kommunikationsproblem zwischen Geschwisterkomponenten.
Der einfachste Weg, $dispatch
und $broadcast
zu aktualisieren, besteht darin, Event Hubs zu verwenden, um Komponenten eine freie Kommunikation zu ermöglichen, unabhängig davon, wo sie sich in der Komponentenstruktur befinden. Da Vue-Instanzen eine Event-Dispatch-Schnittstelle implementieren, können Sie dies erreichen, indem Sie eine leere Vue-Instanz instanziieren.
Eine der häufigsten Anwendungen dieser Methoden ist die Kommunikation zwischen Eltern-Kind-Komponenten. In diesen Fällen können Sie v-on
verwenden, um auf Änderungen in $emit für untergeordnete Komponenten zu warten. Dadurch können Sie ganz einfach die Sichtbarkeit von Ereignissen hinzufügen.
$emit
ist jedoch nicht sinnvoll, wenn Sie über mehrere Ebenen von Eltern-Kind-Komponenten kommunizieren. Im Gegensatz dazu ermöglicht die Verwendung zentralisierter Event-Middleware einfache Upgrades. Dies macht die Kommunikation zwischen Komponenten sehr reibungslos, auch wenn es sich um Geschwister handelt. Da Vue Instanzen über die Ereignis-Emitter-Schnittstelle ausführt, können Sie tatsächlich eine leere Vue-Instanz verwenden.
Angenommen, wir haben beispielsweise eine Aufgabenanwendungsstruktur wie folgt:
// v-on:keyup.f1 不可用 Vue.config.keyCodes.f1 = 112
Sie können die Kommunikation zwischen Komponenten über ein separates Ereigniscenter verwalten:
Todos ├─ NewTodoInput └─ Todo └─ DeleteTodoButton
Dann in der Komponente: Sie können $emit
, $on
, $off
verwenden Ereignisse verteilen, abhören bzw. abhören:
// 将在各处使用该事件中心 // 组件通过它来通信 var eventHub = new Vue()
// NewTodoInput // ... methods: { addTodo: function () { eventHub.$emit('add-todo', { text: this.newTodoText }) this.newTodoText = '' } }
// DeleteTodoButton // ... methods: { deleteTodo: function (id) { eventHub.$emit('delete-todo', id) } }
Dies kann in einfachen Fällen $dispatch
und $broadcast
ersetzen, für die meisten komplexen Fälle wird jedoch empfohlen, eine dedizierte Zustandsverwaltungsschicht zu verwenden. Beispiel: Vuex.
Upgrade-Methode
Führen Sie das Migrationstool ausFinden Sie die Instanzen mit $dispatch
und <🎜 heraus > . $broadcast
Filter
Einfügen Filter außerhalb von Text Entfernt
Filter können jetzt nur innerhalb eingefügter Texte ({{ }}
-Tags) verwendet werden. Wir haben festgestellt, dass die Verwendung von Filtern innerhalb von Anweisungen (z. B. v-model
, v-on
usw.) die Dinge komplizierter macht. Für Listenfilter wie v-for
ist es am besten, die Verarbeitungslogik als berechnete Eigenschaft in js einzufügen, damit sie in der gesamten Vorlage wiederverwendet werden kann.
Kurz gesagt, für Dinge, die in nativem JS implementiert werden können, versuchen wir zu vermeiden, ein neues Symbol einzuführen, um wiederholt dasselbe Problem zu lösen. So ersetzen Sie die integrierten Filter von Vue:
Ersetzen Sie den debounce
-Filter
, der nicht mehr so ist
// Todos // ... created: function () { eventHub.$on('add-todo', this.addTodo) eventHub.$on('delete-todo', this.deleteTodo) }, // 最好在组件销毁前 // 清除事件监听 beforeDestroy: function () { eventHub.$off('add-todo', this.addTodo) eventHub.$off('delete-todo', this.deleteTodo) }, methods: { addTodo: function (newTodo) { this.todos.push(newTodo) }, deleteTodo: function (todoId) { this.todos = this.todos.filter(function (todo) { return todo.id !== todoId }) } }
<input v-on:keyup="doStuff | debounce 500">
Bitte verwenden Sie Lodashs debounce
(oder möglicherweise throttle
) zur direkten Steuerung hochintensiver Aufgaben. Sie können die obige Funktion wie folgt implementieren:
methods: { doStuff: function () { // ... } }rrree
Weitere Vorteile dieser Schreibmethode finden Sie unter: v-model
Beispiel.
ersetzt den limitBy
-Filter
nicht mehr so:
<input v-on:keyup="doStuff">
wird in der Berechnung verwendet Attribut js integrierte Methode: .slice
Methode:
methods: { doStuff: _.debounce(function () { // ... }, 500) }
<p v-for="item in items | limitBy 10">{{ item }}</p>
ersetzt den filterBy
Filter
nicht mehr so:
<p v-for="item in filteredItems">{{ item }}</p>
Verwenden Sie integrierte js-Methoden in berechneten Attributen .filter
Methode:
computed: { filteredItems: function () { return this.items.slice(0, 10) } }
<p v-for="user in users | filterBy searchQuery in 'name'">{{ user.name }}</p>
js native .filter
kann auch viele komplexe Filteroperationen implementieren, da alle js-Methoden in berechneten Eigenschaften verwendet werden können. Um beispielsweise Benutzer zu finden, indem ihre Namen und E-Mail-Adressen abgeglichen werden (Groß- und Kleinschreibung wird nicht beachtet):
<p v-for="user in filteredUsers">{{ user.name }}</p>
Filter orderBy
ersetzen
Schreiben Sie nicht so:
computed: { filteredUsers: function () { var self = this return self.users.filter(function (user) { return user.name.indexOf(self.searchQuery) !== -1 }) } }
Verwenden Sie es stattdessen im berechneten Attribut lodashs orderBy
(oder vielleicht sortBy
):
var self = this self.users.filter(function (user) { var searchRegex = new RegExp(self.searchQuery, 'i') return user.isActive && ( searchRegex.test(user.name) || searchRegex.test(user.email) ) })
<p v-for="user in users | orderBy 'name'">{{ user.name }}</p>
Sie können sogar nach Feld sortieren:
<p v-for="user in orderedUsers">{{ user.name }}</p>
Upgrade-Methode
Führen Sie das Migrationstool aus, um den in der Direktive verwendeten Filter zu finden. Wenn einige nicht gefunden werden, sehen Sie sich die Konsolenfehlermeldung an.
Filterparameter-NotationGeändert
Das Filterparameterformular funktioniert jetzt besser mit js Funktionsaufrufe erfolgen auf die gleiche Weise, daher werden Argumente nicht mehr durch Leerzeichen getrennt:
computed: { orderedUsers: function () { return _.orderBy(this.users, 'name') } }
werden jetzt in Klammern eingeschlossen und durch Kommas getrennt:
_.orderBy(this.users, ['name', 'last_login'], ['asc', 'desc'])
Upgrade-Methode
Führen Sie das Migrationstool aus, um die alten Anrufsymbole zu finden, sehen Sie sich bitte das an Konsolenfehlermeldung.
Eingebauter Textfilter Entfernt
Der im Text eingefügte Filter bleibt jedoch bestehen Funktioniert, aber alle eingebauten Filter wurden entfernt. Stattdessen wird empfohlen, für jeden Bereich spezialisiertere Bibliotheken zu verwenden. (Verwenden Sie beispielsweise date-fns
zum Formatieren des Datums und accounting
zum Formatieren der Währung).
Für jeden eingebauten Filter fassen wir grob zusammen, wie man ihn austauscht. Codebeispiele können in benutzerdefinierten Hilfsfunktionen, Methoden oder berechneten Eigenschaften geschrieben werden.
json
Filter ersetzen
Es besteht keine Notwendigkeit, sie einzeln zu ändern, da Vue sie automatisch formatiert hat Sie, egal ob es sich um eine Zeichenfolge, eine Zahl, ein Array oder ein Objekt handelt. Wenn Sie die Funktion JSON.stringify
von js zur Implementierung verwenden möchten, können Sie sie auch in eine Methode oder ein berechnetes Attribut schreiben.
ersetzt capitalize
Filter
<p>{{ date | formatDate 'YY-MM-DD' timeZone }}</p>
ersetzt uppercase
filter
<p>{{ date | formatDate('YY-MM-DD', timeZone) }}</p>
ersetztlowercase
filter
text[0].toUpperCase() + text.slice(1)
Ersetzenpluralize
Filter
Die pluralize-Bibliothek auf NPM kann diese Funktion sehr gut implementieren. Wenn Sie nur bestimmte Wörter pluralisieren oder eine bestimmte Ausgabe für einen bestimmten Wert ('0') festlegen möchten, können Sie den Pluralformatierungsfilter auch einfach anpassen:
text.toUpperCase()
Ersetzen des currency
Filtern
Für einfache Probleme können Sie Folgendes tun:
text.toLowerCase()
In den meisten Fällen wird es immer noch seltsame Phänomene geben (z. B. 0.035.toFixed(2)
Aufrunden, um 0.04
zu erhalten, aber 0.045
Selbst wenn Sie nach unten wählen, erhalten Sie immer noch 0.04
). Um diese Probleme zu lösen, können Sie die Bibliothek accounting
verwenden, um eine zuverlässigere Währungsformatierung zu erreichen.
Upgrade-Methode
Führen Sie das Migrationstool aus, um die verworfenen Filter zu finden. Wenn etwas fehlt, lesen Sie bitte die Konsolenfehlermeldung.
Bidirektionaler Filter ersetzt
Einige Benutzer nutzen Bidirektional bereits gerne über v-model
Filter zum Erstellen interessanter Eingaben mit sehr wenig Code. Obwohl bidirektionale Filter oberflächlich betrachtet einfach sind, können sie einige enorme Komplexitäten verbergen – sie können sogar dazu führen, dass Statusaktualisierungen langsam erfolgen und das Benutzererlebnis beeinträchtigt werden. Es wird empfohlen, stattdessen eine Komponente zu verwenden, die eine Eingabe umschließt, sodass Sie benutzerdefinierte Eingaben expliziter und funktionsreicher erstellen können.
Lass uns jetzt zur Demonstration eine bidirektionale Wechselkursfiltermigration durchführen:
Es funktioniert grundsätzlich gut, aber die verzögerten Statusaktualisierungen verursachen seltsames Verhalten. Klicken Sie beispielsweise auf das Tag Result
und versuchen Sie, 9.999
in eines der Eingabefelder einzugeben. Wenn das Eingabefeld den Fokus verliert, wird sein Wert auf .00
aktualisiert. Wenn wir uns jedoch den gesamten Rechner ansehen, werden Sie feststellen, dass die gespeicherten Daten 9.999
sind. Was Benutzer sehen, ist keine echte Synchronisierung mehr!
Um zu einer robusteren Vue 2.0-Lösung zu wechseln, packen wir diesen Filter zunächst in eine neue <currency-input>
Komponente:
Es ermöglicht uns um Verhaltensweisen hinzuzufügen, die nicht durch unabhängige Filter gekapselt werden können, z. B. die Auswahl des Inhalts des Eingabefeldfokus. Als nächstes extrahieren wir die Geschäftslogik aus dem Filter. Als nächstes legen wir alles in ein externes currencyValidator
Objekt :
Dies wird modularer sein, nicht nur einfacher zu Vue migrieren 2. Ermöglicht auch Ratenlücken und Formatierungen:
Getrennt von Ihrem Vue-Code für Unit-Tests
in Ihrer Anwendung Wird in anderen Teilen von verwendet des Programms, z. B. die Überprüfung einer API End Load
Nachdem wir diesen Validator extrahiert haben, können wir ihn auch bequemer in eine robustere Lösung einbauen. Diese seltsamen Zustände werden ebenfalls eliminiert, und es ist nicht mehr wahrscheinlich, dass Benutzer Fehler machen, genau wie das native Zahleneingabefeld des Browsers.
Allerdings sind wir bei den Filtern von Vue 1.0 immer noch eingeschränkt, daher ist es besser, komplett auf Vue 2.0 zu aktualisieren:
You You ist vielleicht aufgefallen:
Jeder Aspekt unseres Eingabefelds ist expliziter und verwendet Lebenszyklus-Hooks und DOM-Ereignisse, um das versteckte Verhalten bidirektionaler Filter zu ersetzen.
Wir können
v-model
jetzt direkt im benutzerdefinierten Eingabefeld verwenden. Es wird nicht nur mit dem normalen Eingabefeld verwendet, sondern bedeutet auch, dass unsere Komponente Vuex-freundlich ist.Da wir keine Filteroptionen mehr benötigen, um einen Rückgabewert zu haben, kann unsere Wechselkursarbeit tatsächlich asynchron durchgeführt werden. Das heißt, wenn wir viele Anwendungen haben, die sich mit Wechselkursen befassen, können wir diese Logik leicht verfeinern und daraus einen gemeinsamen Mikroservice machen.
Upgrade-Methode
Führen Sie das Migrationstool aus, das z. B. in <🎜 zu finden ist > Beispiele für die Verwendung von Filtern in Anweisungen. Wenn Sie es verpassen, sollten Sie einen v-model
Befehlszeilenfehler erhalten.
Slots
Slot mit demselben Namen Entfernen
ist veraltet. Sobald ein Slot gerendert wurde, kann er an keiner anderen Stelle in derselben Vorlage erneut gerendert werden. Wenn Sie denselben Inhalt an verschiedenen Orten rendern möchten, können Sie ihn mit prop übergeben. <slot>
Upgrade-Methode
Führen Sie den Test nach dem Update aus und überprüfen Sie dieKonsolenwarnmeldung über Slots mit gleichnamige Tipps . v-model
slot
Slot
Stilparameter Entfernen<slot>
slot
Fragmente, die über benanntes eingefügt wurden, behalten nicht mehr die Parameter von bei. Bitte verwenden Sie ein Umhüllungselement, um das Styling zu steuern. Oder wählen Sie einen fortgeschritteneren Ansatz: Inhalte programmgesteuert ändern:
Upgrade-Methode
Suchen Sie den CSS-Selektor „Select Slots Tag“ (zum Beispiel:Besondere Eigenschaften
Das Attribut ersetzt keep-alive
keep-alive
keep-alive
<transition>
, das kein spezielles Attribut mehr, sondern eine umschlossene Komponente ist, ähnlich zu <keep-alive>
, wie zum Beispiel:
function pluralizeKnife (count) { if (count === 0) { return 'no knives' } else if (count === 1) { return '1 knife' } else { return count + 'knives' } }
Dies kann in Unterkomponenten mit mehreren Zuständen verwendet werdenWenn:
<keep-alive>
'$' + price.toFixed(2)
verschiedene Unterkomponenten enthält, sollte es jede Unterkomponente separat beeinflussen. Nicht nur die erste, sondern alle untergeordneten Komponenten werden ignoriert. <transition>
Achten Sie darauf, den Inhalt zu verpacken, wenn Sie ihn zusammen verwenden: <keep-alive>
<component v-bind:is="view"></component>
</keep-alive>
.
Interpolation berechnen
Berechnete Interpolation innerhalb von Attributen Entfernen
<keep-alive> <todo-list v-if="todos.length > 0"></todo-list> <no-todos-gif v-else></no-todos-gif> </keep-alive>sollte als Inline-Ausdruck geschrieben werden:
<transition> <keep-alive> <component v-bind:is="view"></component> </keep-alive> </transition>
oder berechnetes Attribut: <button class="btn btn-{{ size }}"></button>
<button v-bind:class="'btn btn-' + size"></button>
Berechnete Interpolation innerhalb der Eigenschaft finden
HTML Berechnete Interpolation Entfernt
{{{ foo }}}
v-html
Die berechnete Interpolation von HTML () wurde entfernt und durch die
EinzelbindungErsetzt
Einzelbindung ({{* foo }}
) Wurde ersetzt durch die neue v-once
Richtlinie.
Upgrade-Methode
Führen Sie das Migrationstool aus, um den einzelnen Bindungsverwendungsort zu finden.
Antwort
geändertvm.$watch
vm.$watch
vm.$watch
Über vm.$watch
erstellte Beobachter werden jetzt aktiviert, wenn die Komponente gerendert wird. Dadurch können Sie den Status aktualisieren, bevor die Komponente gerendert wird, ohne unnötige Aktualisierungen vorzunehmen. Sie können beispielsweise den Wert der Komponente selbst aktualisieren, indem Sie Änderungen an den Requisiten der Komponente beobachten. updated
tun.
Upgrade-MethodeFühren Sie den Test aus. Wenn es Beobachter gibt, die von der alten Methode abhängen, werden fehlgeschlagene Tests angezeigt.
vm.$set
vm.$set
vm.$set
ÄnderungVue.set
Führen Sie das
Veraltete Verwendung findenvm.$delete
vm.$delete
Vue.delete
Änderung
Array.prototype.$set Veraltet
Verwenden Sie Vue.set
Anstelle der
Upgrade-Methode
führen Sie das Migrationstool aus, um das .$set
auf dem Array zu finden . Wenn etwas fehlt, lesen Sie bitte die Konsolenfehlermeldung.
EntfernenArray.prototype.$remove
Array.prototype.$remove
Array.prototype.splice
und ersetzen Sie es durch
, zum Beispiel:<button v-bind:class="buttonClasses"></button>
Oder noch besser: Geben Sie der Entfernungsmethode direkt einen Index Parameter: computed: {
buttonClasses: function () {
return 'btn btn-' + size
}
}
.
Vue.set
Vue.delete
und auf Vue-Instanzen entfernen
Vue.set
Vue.delete
$data
löschen, setzen Sie ihn einfach auf null.
Upgrade-Methode in zu finden Beispiel. Wenn etwas fehlt, lesen Sie bitte die.
vm.$data
Ersetzen Entfernen
JETZT VERBOTEN Ersetzen die $data der Instanz. Dies schützt das Antwortsystem vor einigen Randfällen und macht den Komponentenstatus kontrollierbarer und vorhersehbarer (insbesondere bei Systemen mit Typprüfung).
Upgrade-Methodevm.$data
Führen Sie das Migrationstool aus, um den Speicherort zu finden, an dem
vm.$get
Durch Entfernen von
können die Antwortdaten direkt abgerufen werden.
Upgrade-Methode
Führen Sie das Migrationstool aus, um den Speicherort von vm.$get
zu ermitteln. Wenn etwas fehlt, lesen Sie bitte die Konsolenfehlermeldung.
rund um das DOM Instanzmethode von
Entfernenvm.$appendTo
vm.$appendTo
DOM verwenden Native Methode: methods: {
removeTodo: function (todo) {
var index = this.todos.indexOf(todo)
this.todos.splice(index, 1)
}
}
vm.$appendTo
Führen Sie das Migrationstool aus, um den Speicherort von <🎜 zu finden >. Wenn etwas fehlt, lesen Sie bitte die
vm.$before
vm.$before
Entfernen
DOM verwenden Native Methode: methods: {
removeTodo: function (index) {
this.todos.splice(index, 1)
}
}
Upgrade-Methode vm.$before
Führen Sie das
zu finden. Wenn etwas fehlt, lesen Sie bitte die
Konsolenfehlermeldung
vm.$after
vm.$after
Entfernen
Native DOM-Methode verwenden:
myElement.appendChild(vm.$el)if myElement Für den letzten Knoten kann es auch so geschrieben werden:
myElement.parentNode.insertBefore(vm.$el, myElement)
vm.$after
Upgrade-Methodevm.$remove
Entfernen
DOM verwenden Native Methode:
myElement.parentNode.insertBefore(vm.$el, myElement.nextSibling)
Upgrade-Methode
Führen Sie das Migrationstool aus, um vm.$remove
zu finden. Wenn etwas fehlt, lesen Sie bitte die Konsolenfehlermeldung.
zugrunde liegende Instanzmethoden
Entfernenvm.$eval
vm.$eval
.
Upgrade-Methodevm.$eval
Führen Sie das Migrationstool aus, um den Speicherort zu finden, an dem
.
vm.$interpolate
vm.$interpolate
Versuchen Sie, diese Funktion nicht zu verwenden und sind sich nicht sicher, wie Sie sie verwenden sollen. Weitere Informationen finden Sie im Forum.
Führen Sie das aus, um
zu finden. Wenn etwas fehlt, lesen Sie bitte die
. vm.$log
Instanz-DOM-Optionen
Entfernenreplace: false
ersetzen: false
replace: false
Jetzt ersetzen Komponenten immer diejenigen, an die sie gebunden sind bestimmte Elemente. Um das Verhalten von
zu imitieren, können Sie die Stammkomponente mit einem Element umschließen, das dem Element ähnelt, das sie ersetzt:myElement.parentNode.appendChild(vm.$el)
oder eine Renderfunktion verwenden Nummer: vm.$el.remove()
Standort verwendet.
Globale Konfiguration
Vue.config.debug
Vue.config.debug
Entfernen
wird nicht mehr benötigt, da standardmäßig Warnmeldungen in der Stapelmeldung ausgegeben werden.
Führen Sie das
Migrationstool
enthält. Vue.config.async
Entfernt
Asynchrone Vorgänge erfordern jetzt Unterstützung für die Rendering-Leistung. Vue.config.async
Führen Sie das Vue.config.delimiters
Migrationstool aus, um Instanzen mit zu finden.
ersetzt
durch die VorlagenoptionVue.config.delimiters
. Dadurch wird vermieden, dass die Verwendung benutzerdefinierter Trennzeichen Auswirkungen auf Vorlagen von Drittanbietern hat.
Vue.config.unsafeDelimiters
Entfernen
HTML-Interpolationersetzt durch v-html
.
Upgrade-Methode
Führen Sie das Migrationstool aus, um Vue.config.unsafeDelimiters
zu finden. Das Hilfstool findet dann auch Instanzen der HTML-Einfügung, die durch „v-html“ ersetzt werden können.
Globale API
Mit el
Die Vue.extend
entfernte
el-Option wird in Vue.extend
nicht mehr verwendet. Nur in Instanzerstellungsparametern verfügbar.
Upgrade-Methode
Führen Sie den Test nach dem Update aus und finden Sie in der Warnmeldung der Konsoledas Problem mit Vue.extend
'sel
.
EntfernenVue.elementDirective
Vue.elementDirective
Vue.partial
Entfernt
Teile wurden entfernt und durch explizitere Daten ersetzt Fluss zwischen Komponenten – Requisiten. Sofern Sie keinen teilweise leistungskritischen Bereich verwenden, empfiehlt es sich, stattdessen einfach eine normale Komponente zu verwenden. Wenn Sie einen Teil von name
dynamisch binden, können Sie dynamische Komponente verwenden.
Wenn Sie Teilkomponenten in leistungskritischen Teilen Ihrer Anwendung verwenden, sollten Sie ein Upgrade auf Funktionskomponenten durchführen. Sie müssen in reinen JS/JSX-Dateien vorliegen (nicht in .vue
-Dateien) und zustands- und instanzlos sein, genau wie Teildateien. Dadurch wird das Rendern extrem schnell.
Ein Vorteil von Funktionskomponenten gegenüber Partialkomponenten besteht darin, dass sie dynamischer sein können, da sie Ihnen den Zugriff auf die volle Leistungsfähigkeit von JavaScript ermöglichen. Allerdings ist dies mit Kosten verbunden. Wenn Sie noch nie ein Framework für gerenderte Komponenten verwendet haben, kann es länger dauern, bis Sie es erlernt haben.
Upgrade-Methode
Führen Sie das Migrationstool ausSuchen Sie die Instanz, die Vue.partial