Heim >Web-Frontend >View.js >[Zusammengestellt und geteilt] Einige häufig gestellte Fragen im Vue-Interview (mit Antwortanalyse)

[Zusammengestellt und geteilt] Einige häufig gestellte Fragen im Vue-Interview (mit Antwortanalyse)

青灯夜游
青灯夜游nach vorne
2023-01-29 19:52:082775Durchsuche

Dieses Mal werde ich einige häufig gestellte Interviewfragen zu Vue mit Ihnen teilen, um Ihnen dabei zu helfen, das Grundwissen zu sortieren und Ihren Vue-Wissensvorrat zu erweitern. Es lohnt sich, zu sammeln, kommen Sie vorbei und werfen Sie einen Blick darauf!

[Zusammengestellt und geteilt] Einige häufig gestellte Fragen im Vue-Interview (mit Antwortanalyse)

Zusammenfassung häufiger Fragen im Vue-Interview

MVVM-Modell?

MVVM ist die Abkürzung für Model-View-ViewModel, bei dem es sich im Wesentlichen um eine aktualisierte Version des MVC-Modells handelt. Unter diesen stellt Model das Datenmodell dar, View stellt die angezeigte Seite dar und ViewModel ist die Kombination von View und Model werden die Daten an die Ebene ViewModel gebunden und die Daten automatisch in die Seite gerendert. Wenn sich die Ansicht ändert, wird die Ebene ViewModel verwendet wird benachrichtigt, um die Daten zu aktualisieren. In der Vergangenheit wurde die Ansicht durch Manipulation des DOM aktualisiert, aber jetzt ist es eine datengesteuerte Ansicht. Model-View-ViewModel的简写,其本质是MVC模型的升级版。其中 Model 代表数据模型,View 代表看到的页面,ViewModelViewModel之间的桥梁,数据会绑定到ViewModel层并自动将数据渲染到页面中,视图变化的时候会通知ViewModel层更新数据。以前是通过操作DOM来更新视图,现在是数据驱动视图

Vue的生命周期

每个 Vue 组件实例在创建后都会经过一系列的初始化过程,这个过程中会运行叫做生命周期钩子的函数,以便于用户在特定的阶段有机会添加自己的代码。

Vue 的生命周期可以分为8个阶段:创建前后、挂载前后、更新前后、销毁前后,以及一些特殊场景的生命周期。Vue 3 中还新增了是3个用于调试和服务端渲染的场景。【相关推荐:vuejs视频教程web前端开发

Vues LebenszyklusJede Vue-Komponenteninstanz durchläuft nach der Erstellung eine Reihe von Initialisierungsprozessen. Während dieses Prozesses werden Funktionen namens Lebenszyklus-Hooks ausgeführt, damit Benutzer haben die Möglichkeit, in bestimmten Phasen eigenen Code hinzuzufügen.
Vue 2中的生命周期 Vue 3中的生命周期 描述
beforeCreate beforeCreate 创建前,此时datamethods的数据都还没有初始化
created created 创建后,data中有值,尚未挂载,可以进行一些Ajax请求
beforeMount beforeMount 挂载前,会找到虚拟DOM,编译成Render
mounted mounted 挂载后,DOM已创建,可用于获取访问数据和DOM元素
beforeUpdate beforeUpdate 更新前,可用于获取更新前各种状态
updated updated 更新后,所有状态已是最新
beforeDestroy beforeUnmount 销毁前,可用于一些定时器或订阅的取消
destroyed unmounted 销毁后,可用于一些定时器或订阅的取消
activated activated keep-alive缓存的组件激活时
deactivated deactivated keep-alive缓存的组件停用时
errorCaptured errorCaptured 捕获一个来自子孙组件的错误时调用
renderTracked 调试钩子,响应式依赖被收集时调用
renderTriggered 调试钩子,响应式依赖被触发时调用
serverPrefetch

Der Lebenszyklus von Vue kann in 8 Phasen unterteilt werden: vor und nach der Erstellung, vor und nach der Montage, vor und nach der Aktualisierung, vor und nach der Zerstörung sowie in den Lebenszyklus einiger spezieller Szenarien. Vue 3 fügt außerdem drei neue Szenen zum Debuggen und serverseitigen Rendering hinzu. [Verwandte Empfehlungen: vuejs Video-Tutorial, Web-Frontend-Entwicklung]🎜🎜🎜beforeCreate 🎜🎜beforeCreate🎜🎜Vor der Erstellung wurden die Daten von data und methods noch nicht initialisiert🎜🎜🎜 created🎜🎜created🎜🎜Nach der Erstellung gibt es einen Wert in data, der aber noch nicht gemountet wurde. Sie können einiges tun code>Ajax Vor der Anforderung 🎜🎜🎜beforeMount🎜🎜beforeMount🎜🎜 wird das virtuelle DOM gefunden und kompiliert in Render🎜🎜<tr>🎜<code>montiert🎜🎜montiert🎜🎜Nach der Montage wurde DOM erstellt und können verwendet werden, um Zugangsdaten zu erhalten und Das DOM-Element 🎜🎜🎜beforeUpdate🎜🎜beforeUpdate🎜🎜before update kann dazu verwendet werden verschiedene Status vor der Aktualisierung erhalten🎜🎜🎜aktualisiert🎜🎜aktualisiert🎜🎜Nach der Aktualisierung sind alle Status auf dem neuesten Stand🎜🎜🎜beforeDestroy🎜🎜<code>beforeUnmount 🎜🎜Vor der Zerstörung kann es zum Abbrechen einiger Timer oder Abonnements verwendet werden🎜🎜🎜zerstört🎜🎜unmontiert 🎜🎜Nach der Zerstörung kann es für eine gewisse Kündigung des Timers oder Abonnements 🎜🎜🎜aktiviert🎜🎜aktiviert🎜🎜behalten verwendet werden -alive, wenn die zwischengespeicherte Komponente aktiviert ist🎜🎜🎜deaktiviert🎜🎜deaktiviert🎜🎜keep-aliveWenn die zwischengespeicherte Komponente aktiviert ist Komponente ist deaktiviert🎜🎜🎜errorCaptured🎜🎜<code>errorCaptured🎜🎜Wird aufgerufen, wenn ein Fehler von einer Nachkommenkomponente erfasst wird🎜🎜🎜—🎜🎜 renderTracked🎜🎜Debug-Hook, reaktive Abhängigkeit wird beim Sammeln aufgerufen 🎜🎜🎜 – 🎜🎜renderTriggered🎜🎜Debugging-Hook, wird aufgerufen, wenn reaktive Abhängigkeiten ausgelöst werden🎜🎜🎜 —🎜🎜serverPrefetch🎜 🎜Die Komponenteninstanz wird aufgerufen, bevor sie auf dem Server gerendert wird🎜🎜🎜🎜

Lebenszyklus von Eltern-Kind-Komponenten:

  • Laden der Rendering-Phase: übergeordnetes Element vor Erstellung -> übergeordnetes Element vor Erstellung -> untergeordnetes Element erstellt -> ; Child beforeMount -> Parent Mounted加载渲染阶段:父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted
  • 更新阶段:父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated
  • 销毁阶段:父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed

Vue.$nextTick

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

nextTick 是 Vue 提供的一个全局 API,由于 Vue 的异步更新策略,导致我们对数据修改后不会直接体现在 DOM 上,此时如果想要立即获取更新后的 DOM 状态,就需要借助该方法。

Vue 在更新 DOM 时是异步执行的。当数据发生变化,Vue 将开启一个异步更新队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入队列一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。nextTick方法会在队列中加入一个回调函数,确保该函数在前面的 DOM 操作完成后才调用。

使用场景:

  • 如果想要在修改数据后立刻得到更新后的DOM结构,可以使用Vue.nextTick()

  • created生命周期中进行DOM操作

Vue 实例挂载过程中发生了什么?

挂载过程指的是 app.mount()过程,这是一个初始化过程,整体上做了两件事情:初始化建立更新机制

初始化会创建组件实例、初始化组件状态、创建各种响应式数据。

建立更新机制这一步会立即执行一次组件的更新函数,这会首次执行组件渲染函数并执行patchvnode 转换为 dom; 同时首次执行渲染函数会创建它内部响应式数据和组件更新函数之间的依赖关系,这使得以后数据发生变化时会执行对应的更新函数。

Vue 的模版编译原理

Vue 中有个独特的编译器模块,称为compiler,它的主要作用是将用户编写的template编译为js中可执行的render函数。
在Vue 中,编译器会先对template进行解析,这一步称为parse,结束之后得到一个JS对象,称之为抽象语法树AST;然后是对AST进行深加工的转换过程,这一步称为transform,最后将前面得到的AST生成JS代码,也就是render函数。

Vue 的响应式原理

  • Vue 2 中的数据响应式会根据数据类型做不同的处理。如果是对象,则通过Object.defineProperty(obj,key,descriptor)拦截对象属性访问,当数据被访问或改变时,感知并作出反应;如果是数组,则通过覆盖数组原型的方法,扩展它的7个变更方法(push、pop、shift、unshift、splice、sort、reverse),使这些方法可以额外的做更新通知,从而做出响应。
    缺点:

    • 初始化时的递归遍历会造成性能损失;
    • 通知更新过程需要维护大量 dep 实例和 watcher 实例,额外占用内存较多;
    • 新增或删除对象属性无法拦截,需要通过 Vue.setdelete 这样的 API 才能生效;
    • 对于ES6中新产生的MapSet这些数据结构不支持。
  • Vue 3 中利用ES6Proxy

    : Parent BeforeUpdate -> /code >: übergeordnetes Element beforeDestroy -> übergeordnetes Element zerstört

Vue.$nextTick

    wird nach dem nächsten ausgeführt Der DOM-Aktualisierungszyklus beendet den Verzögerungsrückruf. Verwenden Sie diese Methode unmittelbar nach dem Ändern von Daten, um das aktualisierte DOM zu erhalten.

  • nextTick ist eine globale API, die von Vue bereitgestellt wird. Aufgrund der asynchronen Aktualisierungsstrategie werden unsere Datenänderungen zu diesem Zeitpunkt nicht direkt im DOM widergespiegelt Sofort im DOM-Status müssen Sie diese Methode verwenden.

    🎜Vue wird beim Aktualisieren des DOM asynchron ausgeführt. Wenn sich Daten ändern, öffnet Vue eine asynchrone Aktualisierungswarteschlange und puffert alle Datenänderungen, die in derselben Ereignisschleife auftreten. Wenn derselbe Watcher mehrmals ausgelöst wird, wird er nur einmal in die Warteschlange verschoben. Diese Deduplizierung während der Pufferung ist wichtig, um unnötige Berechnungen und DOM-Operationen zu vermeiden. Die Methode nextTick fügt der Warteschlange eine Rückruffunktion hinzu, um sicherzustellen, dass die Funktion erst aufgerufen wird, nachdem die vorherige DOM-Operation abgeschlossen ist. 🎜🎜Verwendungsszenarien: 🎜🎜🎜🎜Wenn Sie die aktualisierte DOM-Struktur sofort nach der Änderung der Daten erhalten möchten, können Sie Vue.nextTick()🎜🎜🎜🎜 verwenden in Was passiert während des DOM-Vorgangs während des erstellten-Lebenszyklus🎜🎜🎜

    🎜Vue-Instanzmontage? 🎜🎜🎜Der Mount-Prozess bezieht sich auf den app.mount()-Prozess. Dies ist ein Initialisierungsprozess. Er führt insgesamt zwei Dinge aus: Initialisierung und Einrichtung Update-Mechanismus. 🎜🎜Initialisierung erstellt Komponenteninstanzen, initialisiert Komponentenzustände und erstellt verschiedene Reaktionsdaten. 🎜🎜Durch die Einrichtung des Update-Mechanismus wird die Update-Funktion der Komponente sofort ausgeführt. Dadurch wird die Komponenten-Rendering-Funktion zum ersten Mal ausgeführt und patch ausgeführt, um vnode in dom code>; Gleichzeitig wird durch die erstmalige Ausführung der Rendering-Funktion eine Abhängigkeit zwischen den internen Antwortdaten und der Komponentenaktualisierungsfunktion erstellt, sodass die entsprechende Aktualisierungsfunktion ausgeführt wird, wenn sich die Daten ändern Zukunft. 🎜<h3 data-id="heading-6">🎜Vues Vorlagenkompilierungsprinzip🎜🎜🎜Vue verfügt über ein einzigartiges Compilermodul namens <code>compiler. Seine Hauptfunktion besteht darin, die vom Benutzer geschriebene Vorlage zu kompilieren wird in js zu einer ausführbaren render-Funktion kompiliert. 🎜In Vue analysiert der Compiler zuerst template. Dieser Schritt wird als parse bezeichnet. Nach Abschluss wird ein JS-Objekt erhalten, das als abstrakter Syntaxbaum bezeichnet wird . AST; dann gibt es den Konvertierungsprozess der tiefen Verarbeitung von AST. Dieser Schritt wird als transform bezeichnet und schließlich der AST Der zuvor erhaltene generierte JS-Code ist die Funktion render. 🎜

    🎜Vues Reaktionsfähigkeitsprinzip🎜🎜🎜🎜🎜Die Datenreaktionsfähigkeit in Vue 2 wird je nach Datentyp unterschiedlich verarbeitet. Wenn es sich um ein Objekt handelt, fangen Sie den Objekteigenschaftenzugriff über Object.defineProperty(obj,key,descriptor) ab. Wenn auf die Daten zugegriffen wird oder diese geändert werden, prüfen Sie, ob es sich um ein Array handelt, und überschreiben Sie es Prototyp.-Methode, die ihre sieben Änderungsmethoden (Push, Pop, Shift, Unshift, Splice, Sort, Reverse) erweitert, sodass diese Methoden zusätzlich Update-Benachrichtigungen durchführen und reagieren können. 🎜Nachteile: 🎜🎜🎜Rekursives Durchlaufen während der Initialisierung führt zu Leistungseinbußen. 🎜🎜Der Benachrichtigungsaktualisierungsprozess erfordert die Verwaltung einer großen Anzahl von dep-Instanzen, was viel Zeit in Anspruch nimmt viel zusätzlicher Speicher; 🎜🎜Hinzugefügte oder gelöschte Objekteigenschaften können nicht abgefangen werden und müssen über APIs wie Vue.set und delete übernommen werden; ES6 Die neu generierten Datenstrukturen Map und Set werden nicht unterstützt. 🎜🎜🎜🎜🎜Vue 3 verwendet den Proxy-Mechanismus des ES6, um Daten zu übertragen, die reagieren müssen. Es können gleichzeitig Objekte und Arrays abgefangen werden. Alle neuen verschachtelten Objektattribute werden nur dann unterstützt, wenn sie verwendet werden Anzahl der Abhängigkeiten und die Leistung wurde erheblich verbessert. 🎜🎜🎜🎜🎜Virtuelles DOM🎜🎜🎜🎜🎜Konzept: 🎜Virtuelles DOM ist, wie der Name schon sagt, ein virtuelles DOM-Objekt, aber es beschreibt eine Ansichtsstruktur durch verschiedene Attribute. 🎜

  • Vorteile des virtuellen DOM:
    (1) Leistungsverbesserung
    Es gibt Einschränkungen bei der direkten Bedienung von DOM. Wenn Sie es direkt bedienen, werden viele zusätzliche Attributinhalte gleichzeitig bearbeitet. Dies ist nicht notwendig. Wenn diese Vorgänge auf JS-Objekte übertragen werden, wird es viel einfacher. Darüber hinaus ist der Betrieb des DOM relativ teuer, und häufige DOM-Vorgänge können leicht zum Neuzeichnen und Umfließen der Seite führen. Wenn die Zwischenverarbeitung über den abstrakten VNode erfolgt, kann die Anzahl der direkten DOM-Vorgänge effektiv reduziert werden, wodurch das Neuzeichnen und Umfließen von Seiten reduziert wird.
    (2) Praktisch für die plattformübergreifende Implementierung
    Derselbe VNode-Knoten kann auf verschiedenen Plattformen in entsprechende Inhalte gerendert werden. Beispiel: Beim Rendern im Browser handelt es sich um einen DOM-Elementknoten, beim Rendern in Native (iOS, Android). ) wird es zum entsprechenden Steuerelement. Vue 3 ermöglicht Entwicklern die Implementierung benutzerdefinierter Renderer auf Basis von VNode, um das Rendern für verschiedene Plattformen zu erleichtern.

  • Struktur:
    Es gibt keinen einheitlichen Standard, der im Allgemeinen tag, props und children umfasst. tagpropschildren三项。
    tag:必选。就是标签,也可以是组件,或者函数。
    props:非必选。就是这个标签上的属性和方法。
    children:非必选。就是这个标签的内容或者子节点。如果是文本节点就是字符串;如果有子节点就是数组。换句话说,如果判断children是字符串的话,就表示一定是文本节点,这个节点肯定没有子元素。

diff 算法

1、概念:

diff算法是一种对比算法,通过对比旧的虚拟DOM和新的虚拟DOM,得出是哪个虚拟节点发生了改变,找出这个虚拟节点并只更新这个虚拟节点所对应的真实节点,而不用更新其他未发生改变的节点,实现精准地更新真实DOM,进而提高效率。

2、对比方式:

diff算法的整体策略是:深度优先,同层比较。比较只会在同层级进行, 不会跨层级比较;比较的过程中,循环从两边向中间收拢。

  • 首先判断两个节点的tag是否相同,不同则删除该节点重新创建节点进行替换。
  • tag相同时,先替换属性,然后对比子元素,分为以下几种情况:
    • 新旧节点都有子元素时,采用双指针方式进行对比。新旧头尾指针进行比较,循环向中间靠拢,根据情况调用patchVnode进行patch重复流程、调用createElem创建一个新节点,从哈希表寻找 key一致的VNode节点再分情况操作。
    • 新节点有子元素,旧节点没有子元素,则将子元素虚拟节点转化成真实节点插入即可。
    • 新节点没有子元素,旧节点有子元素,则清空子元素,并设置为新节点的文本内容。
    • 新旧节点都没有子元素时,即都为文本节点,则直接对比文本内容,不同则更新。

Vue中key的作用?

key的作用主要是为了更加高效的更新虚拟 DOM

Vue 判断两个节点是否相同时,主要是判断两者的key元素类型tag。因此,如果不设置key,它的值就是 undefined,则可能永远认为这是两个相同的节点,只能去做更新操作,将造成大量的 DOM 更新操作。

为什么组件中的 data 是一个函数?

在 new Vue() 中,可以是函数也可以是对象,因为根实例只有一个,不会产生数据污染。

在组件中,data 必须为函数,目的是为了防止多个组件实例对象之间共用一个 data,产生数据污染;而采用函数的形式,initData 时会将其作为工厂函数都会返回全新的 data 对象。

Vue 中组件间的通信方式?

  • 父子组件通信:

    父向子传递数据是通过props,子向父是通过$emit触发事件;通过父链/子链也可以通信($parent/$children);ref也可以访问组件实例;provide/inject$attrs/$listeners

  • 兄弟组件通信:

    全局事件总线EventBusVuex

  • 跨层级组件通信:

    全局事件总线EventBusVuexprovide/injecttag: erforderlich. Es ist eine Bezeichnung oder es kann eine Komponente oder eine Funktion sein.

    props: Optional. Es sind die Eigenschaften und Methoden auf diesem Etikett. 🎜Kinder: Optional. Es handelt sich um den Inhalt oder die untergeordneten Knoten dieses Tags. Wenn es sich um einen Textknoten handelt, handelt es sich um eine Zeichenfolge. Wenn es untergeordnete Knoten hat, handelt es sich um ein Array. Mit anderen Worten: Wenn children als Zeichenfolge bestimmt wird, bedeutet dies, dass es sich um einen Textknoten handeln muss und dieser Knoten keine untergeordneten Elemente haben darf. 🎜🎜🎜

diff-Algorithmus

🎜1 Konzept: 🎜🎜diff-Algorithmus ist ein Mit einem Vergleichsalgorithmus können wir durch den Vergleich des alten virtuellen DOM und des neuen virtuellen DOM herausfinden, welcher virtuelle Knoten sich geändert hat, diesen virtuellen Knoten finden und nur den realen Knoten aktualisieren, der diesem virtuellen Knoten entspricht, ohne andere unveränderte Knoten zu aktualisieren Aktualisieren Sie das echte DOM genau und verbessern Sie so die Effizienz. 🎜🎜🎜2. Vergleichsmethode: 🎜🎜Die Gesamtstrategie des diff-Algorithmus lautet: Tiefe zuerst, Vergleich auf gleicher Ebene. Vergleiche werden nur auf derselben Ebene durchgeführt und nicht über Ebenen hinweg. Während des Vergleichsprozesses wird die Schleife von beiden Seiten zur Mitte hin verkleinert. 🎜
    🎜Bestimmen Sie zunächst, ob die tag der beiden Knoten gleich sind. Wenn sie unterschiedlich sind, löschen Sie den Knoten und erstellen Sie den Knoten zum Ersetzen neu. 🎜🎜Wenn tag gleich ist, ersetzen Sie zuerst die Attribute und vergleichen Sie dann die Unterelemente, die in die folgenden Situationen unterteilt sind:
      🎜Wenn der alte und der neue Knoten Unterelemente haben Zum Vergleich werden Doppelzeiger verwendet. Vergleichen Sie die alten und neuen Kopf- und Endzeiger, schleifen Sie näher an die Mitte, rufen Sie patchVnode entsprechend der Situation auf, um den Vorgang von patch zu wiederholen, rufen Sie createElem auf code>, um einen neuen Knoten zu erstellen. Die Hash-Tabelle sucht nach <code>VNode-Knoten mit demselben Schlüssel und arbeitet dann entsprechend der Situation. 🎜🎜Wenn der neue Knoten untergeordnete Elemente hat und der alte Knoten keine untergeordneten Elemente hat, wandeln Sie einfach den virtuellen Knoten des untergeordneten Elements in einen realen Knoten um und fügen Sie ihn ein. 🎜🎜Wenn der neue Knoten keine untergeordneten Elemente und der alte Knoten über untergeordnete Elemente verfügt, werden die untergeordneten Elemente gelöscht und auf den Textinhalt des neuen Knotens gesetzt. 🎜🎜Wenn sowohl der alte als auch der neue Knoten keine untergeordneten Elemente haben, also beide Textknoten sind, wird der Textinhalt direkt verglichen, und wenn sie unterschiedlich sind, werden sie aktualisiert. 🎜
    🎜

Welche Rolle spielt der Schlüssel in Vue?

🎜Die Hauptfunktion von key besteht darin, das virtuelle DOM effizienter zu aktualisieren. 🎜🎜Wenn Vue feststellt, ob zwei Knoten gleich sind, bestimmt es hauptsächlich deren Schlüssel und Elementtyp-Tag. Wenn daher key nicht festgelegt ist und sein Wert undefiniert ist, kann immer davon ausgegangen werden, dass es sich um zwei identische Knoten handelt, die nur aktualisiert werden können, was zu einer großen Anzahl von DOM-Aktualisierungsvorgängen führt. 🎜

Warum sind Daten in der Komponente eine Funktion?

🎜In new Vue() kann es sich um eine Funktion oder ein Objekt handeln, da es nur eine Stamminstanz gibt und keine Datenverschmutzung auftritt. 🎜🎜In Komponenten müssen Daten eine Funktion sein. Der Zweck besteht darin, zu verhindern, dass mehrere Komponenteninstanzobjekte dieselben Daten teilen und Datenverschmutzung verursachen. Wenn initData verwendet wird, wird es als Factory-Funktion verwendet und ein neues Datenobjekt wird zurückgegeben. 🎜

Wie kommuniziert man zwischen Komponenten in Vue?

    🎜🎜Kommunikation zwischen übergeordneten und untergeordneten Komponenten: 🎜🎜Das übergeordnete Element übergibt Daten über props an das untergeordnete Element , und das untergeordnete Element überträgt Daten an das übergeordnete Ereignis. Das Ereignis wird durch $emit ausgelöst. Es kann auch über die übergeordnete/untergeordnete Kette ($parent/$) kommunizieren children); refSie können auch auf Komponenteninstanzen zugreifen; <code>provide/inject; $listeners. 🎜🎜🎜🎜Schwesterkomponentenkommunikation: 🎜🎜Globaler Ereignisbus EventBus, Vuex. 🎜🎜🎜🎜Komponentenübergreifende Kommunikation: 🎜🎜Globaler Ereignisbus EventBus, Vuex, provide/inject . 🎜

Was ist der Unterschied zwischen V-Show und V-If?

  • Verschiedene Kontrollmethoden. v-show fügt dem Element das CSS-Attribut display: none hinzu, das Element existiert jedoch weiterhin und v-if steuert die Anzeige oder das Ausblenden Elemente vollständig hinzufügen oder entfernen. v-show是通过给元素添加 css 属性display: none,但元素仍然存在;而v-if控制元素显示或隐藏是将元素整个添加或删除。

  • 编译过程不同。v-if切换有一个局部编译/卸载的过程,切换过程中合适的销毁和重建内部的事件监听和子组件;v-show只是简单的基于 css 切换。

  • 编译条件不同。v-if是真正的条件渲染,它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建,渲染条件为假时,并不做操作,直到为真才渲染。

  • 触发生命周期不同。v-show由 false 变为 true 的时候不会触发组件的生命周期;v-if由 false 变为 true 的时候,触发组件的beforeCreatecreatedbeforeMountmounted钩子,由 true 变为 false 的时候触发组件的beforeDestorydestoryed钩子。

  • 性能消耗不同。v-if有更高的切换消耗;v-show有更高的初始渲染消耗。

使用场景:
如果需要非常频繁地切换,则使用v-show较好,如:手风琴菜单,tab 页签等; 如果在运行时条件很少改变,则使用v-if较好,如:用户登录之后,根据权限不同来显示不同的内容。

computed 和 watch 的区别?

  • computed计算属性,依赖其它属性计算值,内部任一依赖项的变化都会重新执行该函数,计算属性有缓存,多次重复使用计算属性时会从缓存中获取返回值,计算属性必须要有return关键词。
  • watch侦听到某一数据的变化从而触发函数。当数据为对象类型时,对象中的属性值变化时需要使用深度侦听deep属性,也可在页面第一次加载时使用立即侦听immdiate属性。

运用场景:
计算属性一般用在模板渲染中,某个值是依赖其它响应对象甚至是计算属性而来;而侦听属性适用于观测某个值的变化去完成一段复杂的业务逻辑。

v-if 和 v-for 为什么不建议放在一起使用?

Vue 2 中,v-for的优先级比v-if高,这意味着v-if将分别重复运行于每一个v-for循环中。如果要遍历的数组很大,而真正要展示的数据很少时,将造成很大的性能浪费。

Vue 3 中,则完全相反,v-if的优先级高于v-for,所以v-if执行时,它调用的变量还不存在,会导致异常。

通常有两种情况导致要这样做:

  • 为了过滤列表中的项目,比如:v-for = "user in users" v-if = "user.active"。这种情况,可以定义一个计算属性,让其返回过滤后的列表即可。
  • 为了避免渲染本该被隐藏的列表,比如v-for = "user in users"  v-if = "showUsersFlag"。这种情况,可以将v-if移至容器元素上或在外面包一层template即可。

$set

可手动添加响应式数据,解决数据变化视图未更新问题。当在项目中直接设置数组的某一项的值,或者直接设置对象的某个属性值,会发现页面并没有更新。这是因为Object.defineProperty()的限制,监听不到数据变化,可通过this.$set(数组或对象,数组下标或对象的属性名,更新后的值)

🎜🎜Der Kompilierungsprozess ist anders. Das Umschalten von v-if erfolgt teilweise. Während des Umschaltvorgangs werden interne Ereignis-Listener und Unterkomponenten ordnungsgemäß zerstört und auf Basis von v-show erstellt auf CSS-Schalter. 🎜🎜🎜🎜Die Kompilierungsbedingungen sind unterschiedlich. v-if ist ein echtes bedingtes Rendering. Es stellt sicher, dass Ereignis-Listener und Unterkomponenten innerhalb des bedingten Blocks während des Umschaltvorgangs ordnungsgemäß zerstört und neu erstellt werden Nicht rendern, bis true. 🎜🎜🎜🎜Der Trigger-Lebenszyklus ist anders. Wenn v-show von false auf true wechselt, wird der Lebenszyklus der Komponente nicht ausgelöst; wenn v-if von false auf true wechselt, wird beforeCreate der Komponente aktiviert ausgelöst werden. , created, beforeMount, mounted Hooks lösen beim Wechsel von den beforeDestoryder Komponente aus true zu false >, destroyed-Hook. 🎜🎜🎜🎜Der Leistungsverbrauch ist unterschiedlich. v-if hat höhere Umstellungskosten; v-show hat höhere anfängliche Renderingkosten. 🎜🎜🎜🎜Verwendungsszenarien:
Wenn Sie sehr häufig wechseln müssen, ist es besser, v-show zu verwenden, z. B.: Akkordeonmenü, Registerkartenseite usw.; Wenn sich die Bedingungen während der Laufzeit selten ändern, ist es besser, v-if zu verwenden. Nach der Anmeldung des Benutzers werden beispielsweise unterschiedliche Inhalte entsprechend unterschiedlichen Berechtigungen angezeigt. 🎜

🎜Was ist der Unterschied zwischen berechnet und beobachtet? 🎜🎜
    🎜berechnetBerechnete Eigenschaften basieren auf anderen Eigenschaften, um Werte zu berechnen. Wenn die berechneten Eigenschaften mehrmals wiederverwendet werden, wird die Funktion erneut ausgeführt. Die Funktion wird erneut ausgeführt, um den Rückgabewert aus dem Cache zu erhalten. Das berechnete Attribut muss das Schlüsselwort return haben. 🎜🎜watch hört auf Änderungen in bestimmten Daten und löst die Funktion aus. Wenn es sich bei den Daten um einen Objekttyp handelt, müssen Sie das Deep-Listening-Attribut deep verwenden, wenn sich der Attributwert im Objekt ändert. Sie können auch das Instant-Listening-Attribut immdiate verwenden, wenn sich die Seite ändert wird zuerst geladen. 🎜🎜🎜Anwendungsszenarien:
    Berechnete Eigenschaften werden im Allgemeinen beim Rendern von Vorlagen verwendet, während Listeneigenschaften zum Beobachten von Änderungen in einem bestimmten Wert geeignet sind, um eine komplexe Geschäftslogik zu vervollständigen . 🎜

    🎜Warum wird die gemeinsame Verwendung von v-if und v-for nicht empfohlen? 🎜🎜🎜In Vue 2 hat v-for eine höhere Priorität als v-if, was bedeutet, dass v-if wiederholt ausgeführt wird . in jeder v-for-Schleife. Wenn das zu durchlaufende Array groß ist und die tatsächlich anzuzeigenden Daten sehr klein sind, führt dies zu einer enormen Leistungsverschwendung. 🎜🎜In Vue 3 ist es genau umgekehrt. v-if hat eine höhere Priorität als v-for, also wenn v-if ausgeführt wird, existiert die aufgerufene Variable noch nicht, was zu einer Ausnahme führt. 🎜🎜Normalerweise gibt es zwei Situationen, die dazu führen: 🎜
      🎜Um Elemente in der Liste zu filtern, wie zum Beispiel: v-for = "Benutzer in Benutzern" v-if = "Benutzer.aktiv". In diesem Fall können Sie eine berechnete Eigenschaft definieren und diese die gefilterte Liste zurückgeben lassen. 🎜🎜Um das Rendern von Listen zu vermeiden, die ausgeblendet werden sollten, wie z. B. <code>v-for = "user in users" v-if = "showUsersFlag". In diesem Fall können Sie v-if in das Containerelement verschieben oder es mit einer Ebene von template umschließen. 🎜🎜

      🎜$set🎜🎜🎜Sie können reaktionsfähige Daten manuell hinzufügen, um das Problem zu lösen, dass die Datenänderungsansicht nicht aktualisiert wird. Wenn Sie den Wert eines Elements im Array oder direkt den Wert einer Eigenschaft des Objekts im Projekt festlegen, werden Sie feststellen, dass die Seite nicht aktualisiert wird. Dies liegt an den Einschränkungen von Object.defineProperty(), das keine Datenänderungen überwachen kann. Sie können this.$set(Array oder Objekt, Array-Index oder Objekteigenschaftenname, aktualisierter Wert) verwenden )gelöst. 🎜

      Was ist Keep-Alive?

      • Funktion: Komponenten-Caching implementieren, den Zustand der Komponenten beibehalten und Leistungsprobleme durch wiederholtes Rendern vermeiden.
      • Funktionsprinzip: Vue.js abstrahiert DOM-Knoten intern in einzelne VNode-Knoten. Der Cache der keep-alive-Komponente basiert ebenfalls auf VNode-Knoten. Komponenten, die die Bedingungen erfüllen, werden im Cache-Objekt zwischengespeichert. Beim erneuten Rendern wird der VNode-Knoten aus dem Cache-Objekt entnommen und gerendert. keep-alive组件的缓存也是基于 VNode 节点的。它将满足条件的组件在 cache 对象中缓存起来,重新渲染的时候再将 VNode 节点从 cache 对象中取出并渲染。
      • 可以设置以下属性:
        include:字符串或正则,只有名称匹配的组件会被缓存。
        exclude:字符串或正则,任何名称匹配的组件都不会被缓存。
        max:数字,最多可以缓存多少组件实例。
        匹配首先检查组件的name选项,如果name选项不可用,则匹配它的局部注册名称(父组件 components选项的键值),匿名组件不能被匹配。

    设置了keep-alive缓存的组件,会多出两个生命周期钩子:activateddeactivated
    首次进入组件时:beforeCreate --> created --> beforeMount --> mounted --> activated --> beforeUpdate --> updated --> deactivated
    再次进入组件时:activated --> beforeUpdate --> updated --> deactivated

    mixin

    mixin(混入), 它提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。

    使用场景: 不同组件中经常会用到一些相同或相似的代码,这些代码的功能相对独立。可以通过mixin 将相同或相似的代码提出来。

    劣势:

    • 变量来源不明确

    • 多 mixin 可能会造成命名冲突(解决方式:Vue 3的组合API)

    • mixin 和组件坑出现多对的的关系,使项目复杂度变高。

    插槽

    slot插槽,一般在组件内部使用,封装组件时,在组件内部不确定该位置是以何种形式的元素展示时,可以通过slot占据这个位置,该位置的元素需要父组件以内容形式传递过来。slot分为:

    • 默认插槽:子组件用<slot>标签来确定渲染的位置,标签里面可以放DOM结构作为后备内容,当父组件在使用的时候,可以直接在子组件的标签内写入内容,该部分内容将插入子组件的<slot>标签位置。如果父组件使用的时候没有往插槽传入内容,后备内容就会显示在页面。
    • 具名插槽:子组件用name属性来表示插槽的名字,没有指定name的插槽,会有隐含的名称叫做 default。父组件中在使用时在默认插槽的基础上通过v-slot指令指定元素需要放在哪个插槽中,v-slot值为子组件插槽name属性值。使用v-slot指令指定元素放在哪个插槽中,必须配合<template>元素,且一个<template>元素只能对应一个预留的插槽,即不能多个<template> 元素都使用v-slot指令指定相同的插槽。v-slot的简写是#,例如v-slot:header可以简写为#header
    • 作用域插槽:子组件在<slot>标签上绑定props数据,以将子组件数据传给父组件使用。父组件获取插槽绑定 props 数据的方法:
      • scope="接收的变量名":<template scope="接收的变量名">

      • slot-scope="接收的变量名":<template slot-scope="接收的变量名">

      • v-slot:插槽名="接收的变量名":<template v-slot:插槽名="接收的变量名">

        Sie können die folgenden Attribute festlegen:
        include: Zeichenfolge oder regulärer Ausdruck, nur Komponenten mit übereinstimmenden Namen werden zwischengespeichert.
        exclude: Zeichenfolge oder regulärer Ausdruck, jede Komponente mit einem übereinstimmenden Namen wird nicht zwischengespeichert.
        max: Zahl, die maximale Anzahl von Komponenteninstanzen, die zwischengespeichert werden können.
        Der Abgleich prüft zunächst die Option name der Komponente. Wenn die Option name nicht verfügbar ist, wird deren lokaler Registrierungsname (der Schlüsselwert des übergeordneten Elements) abgeglichen (Komponentenoption der Komponente), anonyme Komponente kann nicht abgeglichen werden.
    • Komponenten mit eingerichtetem keep-alive-Cache verfügen über zwei weitere Lebenszyklus-Hooks: aktiviert, deaktiviert.
      Beim ersten Betreten der Komponente: beforeCreate --> br/> Nochmals: aktiviert --> beforeUpdate --> deaktiviert

    mixin

    mixin (eingemischt). Es bietet eine sehr flexible Möglichkeit, wiederverwendbare Funktionalität in Vue-Komponenten zu verteilen.

Verwendungsszenarien: In verschiedenen Komponenten werden häufig gleiche oder ähnliche Codes verwendet, und die Funktionen dieser Codes sind relativ unabhängig. Der gleiche oder ein ähnlicher Code kann durch Mixins extrahiert werden. 🎜🎜Nachteile: 🎜
    🎜🎜Die Quelle der Variablen ist unklar🎜🎜🎜🎜Mehrere Mixins können Namenskonflikte verursachen (Lösung: Kombinations-API von Vue 3)🎜🎜🎜 🎜 Es gibt mehrere Beziehungspaare zwischen Mixin und Komponentengruben, was das Projekt komplexer macht. 🎜🎜🎜

    🎜Slot🎜🎜🎜slot Der Slot wird im Allgemeinen innerhalb der Komponente verwendet, es ist nicht sicher, ob die Position stimmt Wenn Sie Elemente in beliebiger Form anzeigen, können Sie diese Position über slot besetzen. Das Element an dieser Position muss in Form von Inhalten von der übergeordneten Komponente übergeben werden. slot ist unterteilt in: 🎜🎜🎜Standardslot: Unterkomponenten verwenden das <slot>-Tag, um die Renderposition zu bestimmen, und Sie Kann die Struktur DOM als Backup-Inhalt verwenden. Wenn die übergeordnete Komponente verwendet wird, können Sie Inhalte direkt in das Tag der untergeordneten Komponente schreiben code><slot> der untergeordneten Komponente code> Beschriftungsposition. Wenn die übergeordnete Komponente bei Verwendung keinen Inhalt an den Slot übergibt, wird der Backup-Inhalt auf der Seite angezeigt. 🎜🎜Named Slot: Unterkomponenten verwenden das Attribut name, um den Namen des Slots darzustellen, der keinen name angibt heißt default. Bei Verwendung in der übergeordneten Komponente wird die v-slot-Direktive verwendet, um basierend auf dem v-slot-Wert anzugeben, in welchem ​​Slot das Element platziert werden muss ist der Slot, der durch den Attributwert Slot name eingefügt wird. Verwenden Sie die Anweisung v-slot, um anzugeben, in welchem ​​Steckplatz das Element platziert wird. Es muss mit dem Element <template> und einem <template>-Element Es kann nur einem reservierten Slot entsprechen, d. h. mehrere <template>-Elemente können nicht die v-slot-Direktive verwenden, um denselben Slot anzugeben. Die Abkürzung von v-slot ist #. Beispielsweise kann v-slot:header als #headerabgekürzt werden >. 🎜🎜Scope Slot: Die untergeordnete Komponente bindet props-Daten an das <slot>-Tag, um die Daten der untergeordneten Komponente an die Verwendung der übergeordneten Komponente zu übergeben . Die Methode für die übergeordnete Komponente zum Abrufen von Slot-Binding-Requisitendaten:
      🎜🎜scope="received variable name":<templatescope= "Received variable name">🎜🎜🎜🎜 slots-scope="Received variable name": <template slots-scope="Received variable name">🎜 🎜🎜🎜 v-slot: Slot Name="received variable name": <template v-slot: slots name="received variable name">🎜🎜🎜🎜🎜🎜 🎜Was sind die Modifikatoren in Vue ? 🎜🎜🎜In Vue verarbeiten Modifikatoren viele Details von DOM-Ereignissen, sodass wir nicht mehr viel Zeit mit der Bearbeitung dieser lästigen Dinge verbringen müssen und mehr Energie haben, um uns auf die logische Verarbeitung des Programms zu konzentrieren. Modifikatoren in Vue werden in die folgenden Typen unterteilt: 🎜
      • Formularmodifikator
        lazy Nach dem Ausfüllen der Informationen wird der Wert erst dann dem Wert zugewiesen, wenn der Cursor die Beschriftung verlässt, d. h. die Informationen werden nach der Änderung Ereignis. <code>lazy 填完信息,光标离开标签的时候,才会将值赋予给value,也就是在change事件之后再进行信息同步。
        number 自动将用户输入值转化为数值类型,但如果这个值无法被parseFloat解析,则会返回原来的值。
        trim 自动过滤用户输入的首尾空格,而中间的空格不会被过滤。

      • 事件修饰符
        stop 阻止了事件冒泡,相当于调用了event.stopPropagation方法。
        prevent 阻止了事件的默认行为,相当于调用了event.preventDefault方法。
        self 只当在 event.target 是当前元素自身时触发处理函数。
        once 绑定了事件以后只能触发一次,第二次就不会触发。
        capture 使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理。
        passive 告诉浏览器你不想阻止事件的默认行为。
        native 让组件变成像html内置标签那样监听根元素的原生事件,否则组件上使用 v-on 只会监听自定义事件。

      • 鼠标按键修饰符
        left 左键点击。
        right 右键点击。
        middle 中键点击。

      • 键值修饰符
        键盘修饰符是用来修饰键盘事件(onkeyuponkeydown)的,有如下:keyCode存在很多,但vue为我们提供了别名,分为以下两种:

        • 普通键(enter、tab、delete、space、esc、up...)
        • 系统修饰键(ctrl、alt、meta、shift...)

      对 SPA 的理解?

      • 概念:
        SPA(Single-page  application),即单页面应用,它是一种网络应用程序或网站的模型,通过动态重写当前页面来与用户交互,这种方法避免了页面之间切换时打断用户体验。在SPA中,所有必要的代码(HTML、JavaScript 和 CSS)都通过单个页面的加载而检索,或者根据需要(通常是响应用户操作)动态装载适当的资源并添加到页面。页面在任何时间点都不会重新加载,也不会将控制转移到其他页面。举个例子,就像一个杯子,上午装的是牛奶,中午装的是咖啡,下午装的是茶,变得始终是内容,杯子始终不变。

      • SPAMPA的区别:
        MPA(Muti-page application),即多页面应用。在MPAnumber wandelt den Benutzereingabewert automatisch in einen numerischen Typ um, aber wenn der Wert nicht von parseFloat analysiert werden kann, wird der ursprüngliche Wert zurückgegeben.

        trim filtert automatisch die ersten und letzten vom Benutzer eingegebenen Leerzeichen, die Leerzeichen in der Mitte werden jedoch nicht gefiltert.

Lebenszyklus in Vue 2 Lebenszyklus in Vue 3 Beschreibung
Der Ereignismodifikator self Die Handler-Funktion wird nur ausgelöst, wenn event.target das aktuelle Element selbst ist. capture verwendet den Ereigniserfassungsmodus, d. h. vom Element selbst ausgelöste Ereignisse werden hier zuerst verarbeitet und dann zur Verarbeitung an interne Elemente übergeben. native ermöglicht es der Komponente, die nativen Ereignisse des Stammelements wie das integrierte Tag html abzuhören. Andernfalls wird v-on verwendet auf der Komponente lauscht nur auf sich selbst. Maustastenmodifikatorright Rechtsklick. SchlüsselwertmodifikatorenTastaturmodifikatoren werden verwendet, um Tastaturereignisse (onkeyup, onkeydown) wie folgt zu ändern: keyCode Es gibt viele, aber vue stellt uns Aliase zur Verfügung, die in die folgenden zwei Typen unterteilt sind: Gemeinsame Tasten (Enter, Tab, Löschen, Leerzeichen, Esc, Aufwärts...) )Konzept: SPA (Single-Page-Anwendung), also eine Single-Page-Anwendung, die ein Modell einer Netzwerkanwendung oder Website ist dynamisch umgeschrieben Verwenden Sie die aktuelle Seite, um mit dem Benutzer zu interagieren. Diese Methode vermeidet Unterbrechungen des Benutzererlebnisses beim Wechseln zwischen Seiten. In SPA wird der gesamte erforderliche Code (HTML, JavaScript und CSS) beim Laden einer einzelnen Seite abgerufen, oder entsprechende Ressourcen werden dynamisch geladen und der Seite nach Bedarf hinzugefügt (normalerweise als Reaktion auf den Benutzer). Aktionen). Die Seite wird zu keinem Zeitpunkt neu geladen, und die Kontrolle wird auch nicht auf andere Seiten übertragen. Sie enthält zum Beispiel wie eine Tasse morgens Milch, mittags Kaffee und nachmittags Tee. Sie hat immer den Inhalt und die Tasse bleibt unverändert. Der Unterschied zwischen SPA und MPA: mehreren Hauptseiten History-Modus
stop verhindert, dass das Ereignis sprudelt, was dem Aufruf der Methode event.stopPropagation entspricht.
prevent verhindert das Standardverhalten des Ereignisses, was dem Aufruf der Methode event.preventDefault entspricht.
once Nach dem Binden eines Ereignisses kann es nur einmal ausgelöst werden und wird beim zweiten Mal nicht ausgelöst. passive teilt dem Browser mit, dass Sie das Standardverhalten des Ereignisses nicht blockieren möchten.
links Linksklick. middle Mittelklick.
    Systemmodifizierertasten (Strg, Alt, Meta, Umschalt...)

    Verständnis von SPA?

    MPA (Muti-page application), also mehrseitig Anwendung. In MPA ist jede Seite eine Hauptseite und unabhängig, wenn auf eine Seite zugegriffen wird. Die HTML-, CSS- und JS-Dateien müssen bei Bedarf neu geladen werden.
    SPA MPA
    bestehend aus einer Hauptseite und mehreren Seitenfragmenten
    URL-Modus Hash-Modus
    🎜🎜SEO-Suchmaschinenoptimierung🎜🎜schwierig zu implementieren, kann mit der SSR-Methode verbessert werden🎜🎜einfach zu implementieren🎜🎜🎜🎜Datenübertragung🎜🎜einfach🎜🎜Übertragung über URL, Cookie, lokaler Speicher usw.🎜🎜🎜🎜Seitenwechsel 🎜🎜schnell, gute Benutzererfahrung🎜🎜Wechsel der Laderessourcen, langsame Geschwindigkeit, schlechte Benutzererfahrung🎜🎜🎜🎜Wartungskosten🎜🎜Relativ einfach🎜🎜Relativ komplex🎜🎜🎜🎜
  • SPA Vorteile und Nachteile: SPA的优缺点:
    优点:

    • 具有桌面应用的即时性、网站的可移植性和可访问性
    • 用户体验好、快,内容的改变不需要重新加载整个页面
    • 良好的前后端分离,分工更明确

    缺点:

    • 不利于搜索引擎的抓取
    • 首次渲染速度相对较慢
  • 双向绑定?

    • 概念:
      Vue 中双向绑定是一个指令v-model,可以绑定一个响应式数据到视图,同时视图的变化能改变该值。v-model是语法糖,默认情况下相当于:value@input,使用v-model可以减少大量繁琐的事件处理代码,提高开发效率。

    • 使用:
      通常在表单项上使用v-model,还可以在自定义组件上使用,表示某个值的输入和输出控制。

    • 原理:
      v-model是一个指令,双向绑定实际上是Vue 的编译器完成的,通过输出包含v-model模版的组件渲染函数,实际上还是value属性的绑定及input事件监听,事件回调函数中会做相应变量的更新操作。

    子组件是否可以直接改变父组件的数据?

    • 所有的prop都遵循着单项绑定原则,props因父组件的更新而变化,自然地将新状态向下流往子组件,而不会逆向传递。这避免了子组件意外修改父组件的状态的情况,不然应用的数据流将很容易变得混乱而难以理解。
      另外,每次父组件更新后,所有的子组件中的props都会被更新为最新值,这就意味着不应该子组件中去修改一个prop,若这么做了,Vue 会在控制台上抛出警告。

    • 实际开发过程中通常有两个场景导致要修改prop

      • prop被用于传入初始值,而子组件想在之后将其作为一个局部数据属性。这种情况下,最好是新定义一个局部数据属性,从props获取初始值即可。
      • 需要对传入的prop值做进一步转换。最好是基于该prop值定义一个计算属性。
    • 实践中,如果确实要更改父组件属性,应emit一个事件让父组件变更。当对象或数组作为props被传入时,虽然子组件无法更改props绑定,但仍然可以更改对象或数组内部的值。这是因为JS的对象和数组是按引用传递,而对于 Vue 来说,禁止这样的改动虽然可能,但是有很大的性能损耗,比较得不偿失。

    Vue Router中的常用路由模式和原理?

    1、hash 模式:

    • location.hash的值就是url中 # 后面的东西。它的特点在于:hash虽然出现url中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。
    • 可以为hash的改变添加监听事件window.addEventListener("hashchange", funcRef, false),每一次改变hash (window.location.hash),都会在浏览器的访问历史中增加一个记录,利用hash的以上特点,就可以实现前端路由更新视图但不重新请求页面的功能了。
      特点:兼容性好但是不美观

    2、history 模式:

    利用 HTML5 History Interface 中新增的pushState()replaceState()方法。
    这两个方法应用于浏览器的历史记录栈,在当前已有的backforwardgo Vorteile:

      Hat die Unmittelbarkeit von Desktop-Anwendungen, die Portabilität und Zugänglichkeit von Websites 🎜🎜🎜Gute Benutzererfahrung, schnell, Inhalt Die Änderung funktioniert Es ist nicht erforderlich, die gesamte Seite neu zu laden. 🎜🎜🎜Gute Front-End- und Back-End-Trennung, klarere Arbeitsteilung Geschwindigkeit ist relativ langsam. Langsam 🎜🎜
    🎜

    Zwei-Wege-Bindung?

      🎜🎜Konzept: 🎜Zwei-Wege-Bindung in Vue ist eine Anweisung V-Modell, die sein kann gebunden Der Ansicht werden reaktive Daten hinzugefügt, und Änderungen an der Ansicht können den Wert ändern. v-model ist ein syntaktischer Zucker, der standardmäßig :value und @input entspricht. Verwenden Sie v-model kann viel mühsamen Ereignisverarbeitungscode reduzieren und die Entwicklungseffizienz verbessern. 🎜🎜🎜🎜Verwendung: 🎜Normalerweise wird v-model für Formularelemente verwendet und kann auch für benutzerdefinierte Komponenten verwendet werden, um die Eingabe- und Ausgabesteuerung eines bestimmten Werts darzustellen. 🎜🎜🎜🎜Prinzip: 🎜v-model ist eine Anweisung, die tatsächlich vom Vue-Compiler durch die Ausgabe von Komponenten erfolgt, die die v-model-Vorlage enthalten Die Rendering-Funktion ist eigentlich die Bindung des value-Attributs und des input-Ereignis-Listeners. Die Ereignis-Callback-Funktion aktualisiert die entsprechenden Variablen. 🎜🎜

    Können untergeordnete Komponenten die Daten von übergeordneten Komponenten direkt ändern?

      🎜🎜Alle prop folgen dem Single-Binding-Prinzip, propsÄnderungen fällig Bei Aktualisierungen der übergeordneten Komponente wird der neue Status auf natürliche Weise nach unten zur untergeordneten Komponente übertragen, ohne ihn rückwärts zu übergeben. Dies verhindert, dass untergeordnete Komponenten versehentlich den Status der übergeordneten Komponente ändern, da sonst der Datenfluss der Anwendung leicht verwirrend und schwer verständlich würde. 🎜Darüber hinaus werden jedes Mal, wenn die übergeordnete Komponente aktualisiert wird, die props in allen untergeordneten Komponenten auf den neuesten Wert aktualisiert, was bedeutet, dass ein prop in der nicht geändert werden sollte Untergeordnete Komponente. > Wenn Sie dies tun, gibt Vue eine Warnung auf der Konsole aus. 🎜🎜🎜🎜Im eigentlichen Entwicklungsprozess gibt es normalerweise zwei Szenarien, die dazu führen, dass prop geändert werden muss: 🎜
        🎜prop wird zur Übergabe verwendet Anfangswert, und die Unterkomponente möchte ihn später als lokales Datenattribut verwenden. In diesem Fall ist es am besten, ein neues lokales Datenattribut zu definieren und den Anfangswert von props zu erhalten. 🎜🎜Der eingehende prop-Wert muss weiter konvertiert werden. Es ist besser, eine berechnete Eigenschaft basierend auf dem prop-Wert zu definieren. 🎜
      🎜🎜🎜Wenn Sie in der Praxis wirklich die Eigenschaften der übergeordneten Komponente ändern möchten, sollten Sie ein Ereignis ausgeben, damit sich die übergeordnete Komponente ändern kann. Wenn ein Objekt oder Array als props übergeben wird, kann die Unterkomponente zwar die props-Bindung nicht ändern, aber dennoch den internen Inhalt des Objekts oder Arrays ändern Objekt- oder Array-Wert. Dies liegt daran, dass JS-Objekte und -Arrays als Referenz übergeben werden. Für Vue ist es zwar möglich, solche Änderungen zu verbieten, dies führt jedoch zu einem enormen Leistungsverlust, und der Gewinn überwiegt den Gewinn. 🎜🎜

    Was sind die gängigen Routing-Modi und -Prinzipien im Vue Router?

    🎜1. Hash-Modus: 🎜
      🎜location.hashDer Wert ist das, was in der URL auf # folgt. Seine Besonderheit besteht darin, dass der Hash zwar in der URL erscheint, aber nicht in die HTTP-Anfrage einbezogen wird und keinerlei Auswirkungen auf das Backend hat, sodass eine Änderung des Hashs die Seite nicht neu lädt. 🎜🎜Sie können ein Überwachungsereignis für Hash-Änderungen window.addEventListener("hashchange", funcRef, false) hinzufügen, jedes Mal, wenn Sie hash (window.location.hash) ändern Durch das Hinzufügen eines Datensatzes zum Zugriffsverlauf des Browsers und die Verwendung der oben genannten Hash-Eigenschaften können Sie die Funktion des Front-End-Routings erreichen, das die Ansicht aktualisiert, ohne die Seite erneut anzufordern. 🎜Funktionen: Gute Kompatibilität, aber nicht schön🎜🎜
    🎜2. Verlaufsmodus: 🎜🎜Verwenden Sie den neuen pushState() und replaceState() im HTML5-Verlaufsschnittstellencode> Verfahren. 🎜Diese beiden Methoden werden auf den Verlaufsstapel des Browsers angewendet, basierend auf den aktuell vorhandenen Funktionen <code>back, forward und go Änderung historischer Aufzeichnungen. 🎜Diese beiden Methoden haben eines gemeinsam: Wenn sie zum Ändern des Browser-Verlaufsstapels aufgerufen werden, aktualisiert der Browser die Seite nicht, obwohl sich die aktuelle URL geändert hat. Dies führt zu einem Problem für das Front-End-Routing der Einzelseitenanwendung „Seite aktualisieren, aber nicht erneut anfordern“ bietet die grundlegenden 🎜Funktionen: Obwohl es schön ist, wird 404 beim Aktualisieren angezeigt und erfordert eine Backend-Konfiguration. 🎜

    Dynamisches Routing?

    Oft müssen wir Routen mit einem bestimmten Übereinstimmungsmuster derselben Komponente zuordnen. In diesem Fall müssen wir dynamisches Routing definieren. Wir haben beispielsweise eine User-Komponente, die verwendet werden muss, um alle Benutzer mit unterschiedlichen IDs darzustellen. Dann können wir dynamisches Segment (dynamisches Segment) im Routing-Pfad von Vue-Router verwenden, um diesen Effekt zu erzielen: {path: '/user/:id', compenent: User} , wobei <code>:id der dynamische Pfadparameter ist. 动态路径参数(dynamic segment)来达到这个效果:{path: '/user/:id', compenent: User},其中:id就是动态路径参数。

    对Vuex的理解?

    • 概念:
      Vuex 是 Vue 专用的状态管理库,它以全局方式集中管理应用的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

    • 解决的问题:
      Vuex 主要解决的问题是多组件之间状态共享。利用各种通信方式,虽然也能够实现状态共享,但是往往需要在多个组件之间保持状态的一致性,这种模式很容易出问题,也会使程序逻辑变得复杂。Vuex 通过把组件的共享状态抽取出来,以全局单例模式管理,这样任何组件都能用一致的方式获取和修改状态,响应式的数据也能够保证简洁的单向流动,使代码变得更具结构化且易于维护。

    • 什么时候用:
      Vuex 并非是必须的,它能够管理状态,但同时也带来更多的概念和框架。如果我们不打算开发大型单页应用或应用里没有大量全局的状态需要维护,完全没有使用Vuex的必要,一个简单的 store 模式就够了。反之,Vuex将是自然而然的选择。

    • 用法:
      Vuex 将全局状态放入state对象中,它本身是一颗状态树,组件中使用store实例的state访问这些状态;然后用配套的mutation方法修改这些状态,并且只能用mutation修改状态,在组件中调用commit方法提交mutation;如果应用中有异步操作或复杂逻辑组合,需要编写action,执行结束如果有状态修改仍需提交mutation,组件中通过dispatch派发action。最后是模块化,通过modules选项组织拆分出去的各个子模块,在访问状态(state)时需注意添加子模块的名称,如果子模块有设置namespace,那么提交mutation和派发action时还需要额外的命名空间前缀。

    页面刷新后Vuex 状态丢失怎么解决?

    Vuex 只是在内存中保存状态,刷新后就会丢失,如果要持久化就需要保存起来。

    localStorage就很合适,提交mutation的时候同时存入localStorage,在store中把值取出来作为state的初始值即可。

    也可以使用第三方插件,推荐使用vuex-persist插件,它是为 Vuex 持久化储存而生的一个插件,不需要你手动存取storage,而是直接将状态保存至 cookie 或者 localStorage中。

    关于 Vue SSR 的理解?

    SSR服务端渲染(Server Side Render)

    Verständnis von Vuex? 🎜🎜
    • 🎜Konzept:
      Vuex ist eine Vue-eigene Statusverwaltungsbibliothek. Sie verwaltet den Status der Anwendung zentral und global Verwendet die entsprechenden Regeln, um sicherzustellen, dass sich der Zustand auf vorhersehbare Weise ändert.
      🎜
    • 🎜Gelöste Probleme:
      Das Hauptproblem, das Vuex löst, ist die Zustandsfreigabe zwischen mehreren Komponenten. Obwohl die Zustandsfreigabe auch mithilfe verschiedener Kommunikationsmethoden erreicht werden kann, ist es häufig erforderlich, die Zustandskonsistenz zwischen mehreren Komponenten aufrechtzuerhalten. Dieses Modell ist anfällig für Probleme und verkompliziert die Programmlogik. Vuex extrahiert den gemeinsamen Status von Komponenten und verwaltet ihn im globalen Singleton-Modus, sodass reaktionsfähige Daten auch einen einfachen unidirektionalen Fluss gewährleisten können, wodurch der Code strukturierter und einfacher wird zu pflegen.
      🎜
    • 🎜Wann zu verwenden:
      Vuex ist nicht notwendig, es kann den Zustand verwalten, bringt aber auch mehr Konzepte und Frameworks mit sich. Wenn wir nicht vorhaben, eine große Einzelseitenanwendung zu entwickeln, oder wenn in der Anwendung nicht viel globaler Status verwaltet werden muss, ist die Verwendung von Vuex nicht erforderlich. Ein einfacher Speichermodus reicht aus. Andernfalls wäre Vuex die natürliche Wahl. 🎜
    • 🎜Verwendung:
      Vuex fügt den globalen Status in das state-Objekt ein, das selbst ein Statusbaum ist. Verwenden Sie storein der Komponente >Der state der Instanz greift auf diese Zustände zu; dann verwendet er die passende mutation-Methode, um diese Zustände zu ändern, und kann nur mutation verwenden, um den Zustand zu ändern. Rufen Sie in der Komponente die Methode commit auf, um mutation zu übermitteln. Wenn die Anwendung asynchrone Vorgänge oder komplexe logische Kombinationen enthält, müssen Sie action schreiben . Wenn es nach der Ausführung zu Statusänderungen kommt, müssen Sie immer noch mutation senden, und die Komponente sendet action über dispatch. Der letzte Schritt ist die Modularisierung. Verwenden Sie die Option modules, um die aufgeteilten Untermodule zu organisieren. Wenn Sie auf den Status zugreifen, müssen Sie den Namen des Untermoduls hinzufügen code>namespace

    -Einstellung, code>, dann sind zusätzliche Namespace-Präfixe erforderlich, wenn mutation übermittelt und action gesendet wird. 🎜

    🎜Wie kann das Problem des Vuex-Statusverlusts nach der Seitenaktualisierung gelöst werden? 🎜🎜🎜Vuex speichert den Status nur im Speicher und geht nach der Aktualisierung verloren. Wenn Sie ihn beibehalten möchten, müssen Sie ihn speichern. 🎜🎜localStorage ist sehr gut geeignet, wenn mutation übermittelt wird, es wird auch in localStorage gespeichert und der Wert wird in store Verwenden Sie es einfach als Anfangswert von <code>state. 🎜🎜Sie können auch Plug-ins von Drittanbietern verwenden. Es wird empfohlen, das Plug-in vuex-persist zu verwenden. Es handelt sich um ein Plug-in für den persistenten Vuex-Speicher und erfordert keine manuelle Eingabe Greifen Sie auf storage zu, speichern Sie den Status jedoch direkt in cookie oder localStorage. 🎜

    🎜Verständnis über Vue SSR? 🎜🎜🎜SSR ist Server Side Render (Server Side Render), was bedeutet, dass Vue Tags auf der Clientseite in HTML rendert, um sie auf der Serverseite zu vervollständigen, und dann HTML wird direkt an den Client zurückgegeben. 🎜
    • Vorteile:
      Hat eine bessere SEO und der erste Bildschirm wird schneller geladen.
    • Nachteile:
      Serverseitiges Rendering unterstützt nur zwei Hooks: Wenn wir einige externe Erweiterungsbibliotheken benötigen, müssen auch spezielle Verarbeitungsanwendungen im Knoten vorhanden sein. js-Laufumgebung. Der Server wird höhere Lastanforderungen haben.

    Welche Methoden zur Vue-Leistungsoptimierung kennen Sie?

    • Verzögertes Laden von Routen. Teilen Sie die Anwendungsgröße effektiv auf und laden Sie sie beim Zugriff asynchron.
    • keep-alive speichert Seiten im Cache. Vermeiden Sie die doppelte Erstellung von Komponenteninstanzen und behalten Sie den zwischengespeicherten Komponentenstatus bei. keep-alive缓存页面。避免重复创建组件实例,且能保留缓存组件状态。
    • v-for遍历避免同时使用v-if。实际上在 Vue 3 中已经是一个错误用法了。
    • 长列表性能优化,可采用虚拟列表。
    • v-once。不再变化的数据使用v-once
    • v-for-Traversal vermeidet die gleichzeitige Verwendung von v-if. Tatsächlich handelt es sich bereits in Vue 3 um eine falsche Verwendung.
    • Lange Listenleistungsoptimierung, virtuelle Liste kann verwendet werden.
    • v-once. Verwenden Sie v-once für Daten, die sich nicht mehr ändern.
    • Ereigniszerstörung. Nachdem die Komponente zerstört wurde, werden globale Variablen und Timer zerstört.
    • Bilder sind Lazy Loaded.
    • Plug-ins von Drittanbietern werden auf Anfrage eingeführt.

    Unterkomponentenaufteilung. Zur Aufspaltung eignen sich schwerere Zustandskomponenten. Serverseitiges Rendering.

    (Teilen von Lernvideos: 🎜Vuejs-Einführungs-Tutorial🎜, 🎜Grundlegendes Programmiervideo🎜)🎜

    Das obige ist der detaillierte Inhalt von[Zusammengestellt und geteilt] Einige häufig gestellte Fragen im Vue-Interview (mit Antwortanalyse). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen