Heim> Web-Frontend> View.js> Hauptteil

[Zusammenstellung und Zusammenfassung] Über 45 Vue-Interviewfragen, die Ihnen helfen, Ihre Wissenspunkte zu festigen!

青灯夜游
Freigeben: 2023-01-12 21:02:34
nach vorne
2955 Leute haben es durchsucht

Dieser Artikel fasst einigeVueInterviewfragen (mit Antwortanalyse) zusammen und teilt sie mit Ihnen, um Ihnen dabei zu helfen, grundlegendes Wissen zu sortieren und Ihren Vue-Wissensvorrat zu erweitern. Es lohnt sich, sie zu sammeln, kommen Sie vorbei und werfen Sie einen Blick darauf!

[Zusammenstellung und Zusammenfassung] Über 45 Vue-Interviewfragen, die Ihnen helfen, Ihre Wissenspunkte zu festigen!

1. Beschreiben Sie kurz den Vue-Lebenszyklus

Antwortideen:

  • Was ist der Vue-Lebenszyklus?Vue生命周期是什么?

  • Vue生命周期有哪些阶段?

  • Vue生命周期的流程?

  • 结合实践

  • 扩展:在Vue3变化Vue生命周期的变化 【相关推荐:vuejs视频教程web前端开发

回答范例:

  • 生命周期这个词应该是很好理解的,在我们生活中就会常常碰到,比如谈到一个人的生命周期,我们会说人这一生会经历婴儿、儿童、少年、青年、中年、老年这几个阶段。 而Vue的生命周期也是如此,在Vue中的每个组件都会经历从创建挂载更新再到销毁这几个阶段,而在这些阶段中,Vue会运行一种叫做生命周期钩子的函数,方便我们在特定的阶段有机会添加上我们自己的代码。

  • Vue 生命周期总共可以分为8各阶段:创建前后挂载前后更新前后销毁前后,以及一些特殊场景的生命周期(keep-alive激活时捕获后代组件错误时)。Vue3中还新增了三个用于调试和服务端渲染场景

  • 这几个阶段对应的钩子函数 API依次为:beforeCreatecreatebeforeMountmountedbeforeUpdateupdatedactivated(keep-alive 激活时调用)deactivated(keep-alive 停用时调用)beforeDestorydestoryederrorCaptured(捕获子孙组件错误时调用)

    在 Vue3 中的变化 绝大多数只要加上前缀 on 即可,比如mounted变为onMounted,除了beforeDestroydestroyed被重新命名为beforeUnmountunMounted(这样与前面的beforeMountmounted对应,强迫症表示很赞?)

  • beforeCreate在组件创建前调用,通常用于插件开发中执行一些初始化任务;created组件创建完毕调用,可以访问各种数据,请求接口数据等;mounted组件挂载时调用 可以访问数据、dom元素、子组件等;beforeUpdate更新前调用 此时view层还未更新,可用于获取更新前的各种状态;updated完成更新时调用 此时view层已经完成更新,所有状态已经是最新的了;beforeUnmount实例被销毁前调用,可用于一些定时器或订阅的取消;unMounted销毁一个实例时调用 可以清理与其他实例的链接,解绑它的全部指令以及事件监听器。

  • 在 Vue3 中:setup是比created先执行的而且没有beforeCreatecreated

  • Was sind die Phasen des Vue-Lebenszyklus?

VueLebenszyklusprozess?

自己的话:权限管理一般分页面权限和按钮权限,而具体实现方案又分前端实现和后端实现,前端实现就是会在前端维护一份动态的路由数组,通过用户登录后的角色来筛选它所拥有权限的页面,最后通过addRoute将动态添加到router中;而后端实现的不同点就是这些路由是后端返回给前端,前端再动态添加进去的。 按钮权限一般会实现一个v-permission,通过判断用户有没有权限来控制按钮是否显示。 纯前端方案的优点是实现简单,但是维护问题大,有新的页面和角色需求都需要改代码重新打包部署,服务端则不存在这个问题。

3. Vue 中双向绑定的使用和原理

回答思路:

  • 什么是双向绑定?

  • 双向绑定的好处?

  • 在什么地方使用双向绑定?

  • 双向绑定的使用方式、使用细节、Vue3中的变化

  • 原理实现描述

回答:

  • Vue中的双向绑定是一个指令v-model,它可以绑定一个响应式数据到视图,同时视图中变化也能改变该值。

  • v-model是一个语法糖,它的原理(默认请情况下)就是通过:value将变量挂到dom上,再通过input事件 监听dom的变化改变变量的值。使用v-model的好处就是方便呀,减少了大量的繁琐的事件处理,提高开发效率。

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

  • 可以结合修饰符做进一步限定(lazy/number/trim),用在自定义组件上时有些不同,它相当于是给了子组件一个modelValue的 属性 和update:modelValue的 事件; 在 Vue3 中还可以用参数形式指定多个不同的绑定,如v-model:foo这个时候就相当于 给了子组件一个foo的 属性 和update:foo的事件。

  • v-model作为一个指令,它的原理就是 Vue 编译器会把它转换成value属性绑定和input的监听事件,上面说过是默认情况下,实际上编译器会根据表单元素的不同分配不同的事件,比如checkboxradio类型的input会转换为checkedchange事件。

4. Vue 组件之间通信有哪些?

Vue 组件之间通信有以下这么几种:

  • props-Array konfigurieren, und Seiten, die eine Authentifizierung erfordern, fügen ein

    roles-Feld immetader Route hinzu usw. Nehmen Sie nach Erhalt der Benutzerrolle den Schnittpunkt der beiden. Wenn das Ergebnis nicht leer ist, bedeutet dies, dass darauf zugegriffen werden kann. Nach dem Filtern sind die verbleibenden Routen die Seiten, auf die Benutzer zugreifen können. Schließlich können Routen dynamisch überrouter.addRoutes(accessRoutes)hinzugefügt werden. Die Back-End-Lösung speichert alle Routing-Informationen der Seite in der Datenbank. Wenn sich der Benutzer anmeldet, werden alle Routing-Informationen, auf die er zugreifen kann, basierend auf seiner Rollenabfrage an das Front-End zurückgegeben. end wird dann passierenaddRouteRouting-Informationen dynamisch hinzufügen. Die Schaltflächenberechtigungssteuerung implementiert normalerweise einen Befehl, wie z. B.v-permission, und übergibt die erforderliche Rolle der Schaltfläche an denv-permission-Befehl über den Wert. Immount-Hook des Befehls können Sie feststellen, ob es eine Schnittmenge zwischen der aktuellen Benutzerrolle und der Schaltfläche gibt. Wenn nicht, entfernen Sie die Schaltfläche. Der Vorteil der reinen Frontend-Lösung besteht darin, dass sie einfach zu implementieren ist und keine zusätzlichen Berechtigungen zum Verwalten von Seiten erfordert. Allerdings ist die Wartung problematischer -Endcode muss für die Bereitstellung geändert und neu gepackt werden. Bei der serverseitigen Lösung tritt dieses Problem nicht auf. Über eine dedizierte Rollen- und Berechtigungsverwaltungsseite werden die Seiten- und Schaltflächenberechtigungsinformationen für die Datenbank und die Anwendung konfiguriert erhält bei jeder Anmeldung die neuesten Routing-Informationen.
In meinen eigenen Worten: Die Berechtigungsverwaltung ist im Allgemeinen in Seitenberechtigungen und Schaltflächenberechtigungen unterteilt, und der spezifische Implementierungsplan ist in Front-End-Implementierung und Back-End-Implementierung unterteilt Verwalten Sie ein dynamisches Routing-Array im Front-End. Nach der Anmeldung wird die Rolle des Benutzers zum Filtern der Seiten verwendet, für die er Berechtigungen hat, und schließlich über addRoutedynamisch zum routerhinzugefügt. Der Unterschied in der Backend-Implementierung besteht darin, dass diese Routen vom Backend an das Front-End zurückgegeben werden und das Front-End sie dynamisch hinzufügt. Schaltflächenberechtigungen implementieren im Allgemeinen eine v-permission, um zu steuern, ob die Schaltfläche angezeigt wird, indem ermittelt wird, ob der Benutzer über die Berechtigung verfügt. Der Vorteil der reinen Front-End-Lösung besteht darin, dass sie einfach zu implementieren ist, aber bei neuen Seiten- und Rollenanforderungen der Code geändert und neu gepackt und bereitgestellt werden muss der Serverseite.

3. Die Verwendung und das Prinzip der bidirektionalen Bindung in Vue

Antwortideen:
    Was ist zwei -Wege-Bindung? Was sind die Vorteile der Zwei-Wege-Bindung? Wo kann man die Zwei-Wege-Bindung verwenden? So verwenden Sie die bidirektionale Bindung, Nutzungsdetails, Änderungen in Vue3Beschreibung der Prinzipimplementierung
Antwort:
    props
  • $emit,$on,$off,$once(die letzten drei sind in Veraltet in Vue3)$emit$on$off$once(后三者在Vue3中已被废除)

  • $children(Vue3中废除)$parent

  • $attrs$listeners(Vue3中废除)

  • ref

  • $root

  • eventbus(Vue3中不好使了,需要自己封装)

  • vuexpinia

  • provide + inject

以上的方法长按使用场景可以分为:

  • 父子组件之间可以使用

    props/$emit/$parent/ref/$attrs

  • 兄弟组件之间可以使用

    $parent/$root/eventbus/vuex

  • 跨层及组件之间可以使用

    eventbus/vuex pinia/provide + inject

5.你了解哪些 Vue 性能优化方法?

  • 路由懒加载:有效拆分App尺寸,访问时才异步加载

const router = createRouter({ routes: [ { path : '/foo', component: () => import('./foo.vue)} ] })
Nach dem Login kopieren
  • keep-alive缓存页面:避免重复创建组件实例,且能保存缓存组件状态

   
Nach dem Login kopieren
  • 使用v-show复用DOM:避免重复创建组件

  • v-for遍历避免同时使用v-if(实际上这在 Vue3 中是错误的写法)

  • v-oncev-memo: 不再变化的数据使用v-once;按条件跳过更新时使用v-memo

  • 长列表性能优化:如果是大数据长列表,可采用虚拟滚动,只渲染少部分区域的内容。一些开源库(vue-virtual-scroller/vue-virtual-scroll-grid

  • 事件的销毁:Vue组件销毁时,会自动解绑它的全部指令以及事件监听器,但是仅限于组件本身的事件。

  • 图片懒加载,自定义v-lazy指令 (参考项目:vue-lazyload

  • 第三方插件按需引入element-plus避免体积太大

  • 子组件分割策略:较重的状态组件适合拆分

  • SSR服务端渲染 解决首屏渲染慢的问题

6. 刷新后 Vuex 状态丢失怎么解决?

思路:

  • 刷新后 Vuex 状态为什么会丢失?

  • 解决方法

  • 第三方库以及原理探讨

  • 个人理解

回答:

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

  • 可以是用localStorage存储Vuex的状态,store中把值取出来作为state的初始值,提交mutation的时候就存入localStorage

  • 可以用vuex-persistvuex-persistedstate这种插件,可以通过插件选项控制哪些需要持久化。内部的原理就是通过订阅mutation变化做统一处理。

  • 这里有两个问题,一是如果用户手动改了localStorage怎么办?那我Vuex里的状态不是也改变了?二是由于localStorage API的原因只能存储字符串,所以我们只能将数据通过JSON.stringify转换为字符串,而当我们存储的数据为MapSetFunction这种引用类型的数据时,JSON.stringify转换后会变味{}而丢失。

对应第一个问题我的解决方法是可以通过 监听storage事件来清除数据

window.addEventListener("storage", function () { localStorage.clear(); window.location.href = '/login' console.error("不要修改localStorage的值~~~"); });
Nach dem Login kopieren

对于第二个问题没办法了,只能选择不适用MapSet这种引用类型。

7. Vue3 为什么用 Proxy 替代 defineProperty ?

思路:

  • 属性拦截的几种方式

  • defineProperty的问题

  • Proxy的优点

  • 其他考量

回答:

  • JS中做属性拦截常见的方式有三种:definePropertygetter/settersProxy

    $children(Veraltet in Vue3),$parent< Code >$attrs,$listeners(Abschaffung in Vue3)ref$ rooteventbus(Die Verwendung in Vue3 ist nicht einfach, Sie müssen es selbst kapseln)vuex, < code>piniabereitstellen + injizieren
Die Verwendungsszenarien der oben genannten Methode durch langes Drücken können unterteilt werden in:
    Kann zwischen übergeordneten und untergeordneten Komponenten verwendet werden props/ $emit/ $parent/ ref/ $attrsKann zwischen Geschwisterkomponenten verwendet werden $parent/ $root/ eventbus/ vuexkann schichtübergreifend und zwischen Komponenten verwendet werden eventbus/ vuex pinia/ provide + inject

5. Welche Vue-Leistungsoptimierungsmethoden kennen Sie?

< ul style="list-style- type: disc;">Lazy Loading der Route: Größe der Appeffektiv aufteilen, nur bei Zugriff asynchron laden
{ path: '/login', component: () => import('../views/login/Login.vue') },
Nach dem Login kopieren
Nach dem Login kopieren
    keep-aliveCache-Seite: Vermeiden Sie das wiederholte Erstellen von Komponenteninstanzen und speichern Sie den zwischengespeicherten Komponentenstatus
{ path: '/login', component: () => import(/* webpackChunkName: "login" */'../views/login/Login.vue') },
Nach dem Login kopieren
Nach dem Login kopieren
    Verwenden Sie v-show, um DOMwiederzuverwenden: Vermeiden Sie das wiederholte Erstellen von Komponenten v-fordurchqueren Vermeiden Sie die gleichzeitige Verwendung von v-if(eigentlich ist dies die falsche Art, es in Vue3 zu schreiben) v-onceund v-memo: Daten, die sich nicht mehr ändern. Verwenden Sie v-once; verwenden Sie v-memo, wenn Sie Updates bedingt überspringen. Long List Performance Optimization: Wenn ja Bei einer langen Liste großer Datenmengen kann virtuelles Scrollen nur in einem kleinen Bereich gerendert werden. Einige Open-Source-Bibliotheken ( vue-virtual-scroller/ vue-virtual-scroll-grid) Ereigniszerstörung: Wenn die Vue-Komponente zerstört wird, wird sie zerstört Automatisch alle Anweisungen und Ereignis-Listener entbinden, aber nur Ereignisse der Komponente selbst. Verzögertes Laden von Bildern, angepasste v-lazy-Anweisungen (Referenzprojekt: vue-lazyload) Plug-ins von Drittanbietern führen ein Element auf Anfrage -plusVermeiden Sie eine zu große GrößeStrategie zur Aufteilung von Unterkomponenten: Schwerere Zustandskomponenten eignen sich zur Aufteilung SSRServerseitiges Rendering löst das Problem von langsames Rendern des ersten Bildschirms

6. Wie kann das Problem des Vuex-Statusverlusts nach der Aktualisierung gelöst werden?

Ideen:
    Warum geht der Vuex-Status nach der Aktualisierung verloren? LösungDiskussion über Bibliotheken und Prinzipien von DrittanbieternPersönliches Verständnis
Antwort:
    Da Vuex den Status nur im Speicher speichert, geht er nach der Aktualisierung verloren. Wenn er beibehalten werden soll, muss er gespeichert werden. Sie können localStorageverwenden, um den Status von Vuexzu speichern und den Wert aus storeals state Der Anfangswert wird in localStoragegespeichert, wenn mutationübermittelt wird. Sie können Plug-ins wie vuex-persistund vuex-persistedstateverwenden und über Plug-in-Optionen steuern, welche beibehalten werden müssen. Das interne Prinzip besteht darin, eine einheitliche Verarbeitung durch Abonnieren von mutation-Änderungen durchzuführen. Hier gibt es zwei Fragen. Die eine lautet: Was passiert, wenn der Benutzer localStoragemanuell ändert? Hat sich dann nicht auch der Status in meinem Vuexgeändert? Zweitens können wir die Daten nur über JSON.stringifyin Zeichenfolgen konvertieren, da die localStorage APInur Zeichenfolgen speichern kann >Map, Setund Function, JSON.stringifyändern sich nach der Konvertierung {}und verloren.
Meine Lösung für das erste Problem besteht darin, die Daten durch Abhören des storage-Ereignisses zu löschen
+ |- /src + |- /assets 存放资源 + |- /img + |- /css + |- /font + |- /data + |- base-ui 存放多个项目中都会用到的公共组件 + |- components 存放这个项目用到的公共组件 + |- hooks 存放自定义hook + |- views 视图 + |- store 状态管理 + |- router 路由 + |- service 网络请求 + |- utils 工具 + |- global 全局注册、全局常量..
Nach dem Login kopieren
Nach dem Login kopieren
Für das zweite Problem habe ich keine andere Wahl, als den nicht anwendbaren< Code auszuwählen >Mapund Setsind Referenztypen.

7. Warum verwendet Vue3 Proxy anstelle von defineProperty?

Idee:
    Mehrere Möglichkeiten zum Abfangen von AttributenProblem mit definePropertyVorteile von ProxyAndere Überlegungen
Antwort:
    Es gibt drei gängige Möglichkeiten, Eigenschaften in JSabzufangen: defineProperty, getter/settersund Proxy
  • Vue2中使用defineProperty的原因是, 2013 年只能使用这种方式,由于该API存在一些局限性,比如对于数组的拦截有问题,为此Vue需要专门为数组响应式做一套实现。另外不能拦截那些新增、删除属性;最后defineProperty方案在初始化时需要深度递归遍历处理对象才能对它进行完全拦截,明显增加了初始化的时间。

  • 以上两点在Proxy出现后迎刃而解,不仅可以对数组实现拦截,还能对MapSet实现拦截;另外Proxy的拦截也是懒处理行为,如果用户没有访问嵌套对象,那么也不会实施拦截,这就让初始化的速度和内存占用改善了。

  • Proxy有兼容性问题,完全不支持IE

8. 怎么实现路由懒加载?

思路:

  • 必要性

  • 何时用

  • 怎么用

  • 使用细节

回答:

  • 当打包构建时,Javascript 抱回变得非常大,影响页面加载。利用路由懒加载我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应最贱,这样更加高效,是一种优化手段。

  • 一般来说,对于所有的路由都使用动态导入是个好主意

  • component选项配置一个返回 Promise组件的函数就可以定义懒加载路由.例如:

{ path: '/login', component: () => import('../views/login/Login.vue') },
Nach dem Login kopieren
Nach dem Login kopieren
  • 结合注释

{ path: '/login', component: () => import(/* webpackChunkName: "login" */'../views/login/Login.vue') },
Nach dem Login kopieren
Nach dem Login kopieren

vite中结合rollupOptions定义分块 5. 路由中不能使用异步组件

9. history模式 和 hash 模式有何区别?

  • Vue-Router 有三个模式,其中 history 和 hash 更为常用。两者差别主要在显示形式和部署上,

  • hash模式在地址栏现实的时候有一个#,这种方式使用和部署都较简单;history模式url看起来更优雅没关,但是应用在部署时需要做特殊配置,web服务器需要做回退处理,否则会出现刷新页面404的问题。

  • 在实现上hash模式是监听hashchange事件触发路由跳转,history模式是监听popstate事件触发路由跳转。

10. 说说 nextTick 的使用和原理?

  • VuenextTick是等待下一次DOM更新刷新的工具方法。

  • Vue有一个异步更新策略,意思是如果数据变化,Vue不会立刻更新DOM,而是开启一个队列,把组件更新函数保存在队列中,在同一时间循环中发生的所有数据变更会异步的批量更新。这一策略导致我们对数据的修改不会立刻体现在DOM上,此时如果想要获取更新后的DOM状态,就需要使用nextTicknextTick接受一个函数,我们可以在这个函数内部访问最新的DOM状态 在开发时,有两个场景我们会用到nextTick

    • created中想要获取DOM;
    • 响应式数据变化后获取DOM更新后的状态;
  • nextTick的原理:在Vue内部,nextTick之所以能够让我们看到DOM更新后的结果,是因为我们传入的callback会被添加到队列刷新函数的后面,这样等队列内部的更新函数都执行完毕,所有DOM操作也就结束了,callback自然能够获取最新的DOM值。

11. v-for 和 v-if 优先级

先回答答案:vue2中,v-for的优先级更高 但是在vue3中,v-if的优先级更高

拓展:无论什么时候,我们都不应该把v-forv-if放在一起, 怎么解决呢?一是可以定义一个计算属性,让v-for遍历计算属性。二是可以把if移到内部容器里(ulol)或者把v-for移植外部容器(template)中

vue2-Dokumentationvue3-Dokumentation

12. Wie überwache ich Vuex-Statusänderungen?

  • watch

  • store.subscribe()

watch-Methode, Sie können die Zeichenfolge$store.state.xxabhören ; < Der Methodenparameter code>subscribeist eine Rückruffunktion. Die Rückruffunktion akzeptiertmutation-Objekte undstate-Objekte, die durchmutation bestimmt werden können .typeDas zu überwachende Ziel. Die wtach-Methode ist einfacher und benutzerfreundlicher, währendsubscribeetwas umständlicher ist. Im Allgemeinen wird dasvuex-Plug-in verwendet (Sie können das vuex-Persistenz-Plug-in erwähnen). invuex-persist,vuex-persistedstate)watch方式,可以以字符串形式监听$store.state.xx;subscribe方法参数是一个回调函数,回调函数接受mutation对象和state对象,可以通过mutation.type判断监听的目标。 wtach 方法更简单好用,subscribe会略繁琐,一般用vuex插件中(可以提一下vuex的持久化插件vuex-persistvuex-persistedstate

13. 你觉得 Vuex 有什么缺点?

  • 不支持持久化,页面刷新状态就会丢失

  • 使用模块比较繁琐

  • 不支持ts(或者说很不友好)

vue3 + pinia 会是更好的组合。

14. ref 和 reactive 异同点?

  • 两者都能返回响应式对象,ref返回的是一个响应式Ref对象,reactive返回的是响应式代理对象。

  • ref通常是处理单值得响应式,reactive用于处理对象类型的数据响应式

  • ref需要通过.value访问, 在视图中会自动脱ref,不需要.valueref可以接收对象或数组但内部依然是reactive实现的;reactive如果接收Ref对象会自动脱ref;使用展开运算符展开reactive返回的响应式对象会使其失去响应性,可以结合toRefs()将值转换为Ref对象后再展开。

  • reactive内部使用Prxoy代理拦截对象各种操作,而ref内部封装一个RefImpl类,设置get value/set value,拦截用户对值得访问。

16. Vue 中如何扩展一个组件?

  • 逻辑扩展:mixinsextendscomposition api:

  • 内容扩展:slots

mixins很灵活,但是会冲突很混乱。extends是一个不太常用的选项,更mixins的不同是它只能扩展单个对象,优先级比mixins高。

混入的数据和方法不能明确判断来源而且可能和当前组件内变量产生命名冲突,composition api 可以很好解决这些问题,利用独立出来的响应式模块可以很方便的编写独立逻辑并提供响应式数据局,增强代码的可读性和维护性。

扩展:Vue.mixin(全局混入) Vue.extend(有点像是 类/组件的继承 创建一个子类)

17. vue-loader 是什么?

  • vue-loader是用于处理单文件组件(SFC)的webpack loader

  • 因为有了vue-loader,我们才能用.vue文件形式编写代码,将代码分割为templatescriptstyle

  • webpack在打包的时候,会以loader的方式调用vue-loader

  • vue-loader被执行时,它会对SFC中的每个语言块用单独的loader

  • 13 Was sind Ihrer Meinung nach die Mängel von Vuex?

Persistenz wird nicht unterstützt, der Seitenaktualisierungsstatus geht verloren

Die Verwendung von Modulen ist umständlicher.

Unterstützt keine ts(oder ist sehr unfreundlich) vue3 + Pinia wäre eine bessere Kombination. 14. Was sind die Gemeinsamkeiten und Unterschiede zwischen ref und reaktiv? >reactivegibt ein reaktives Proxy-Objekt zurück. refwird normalerweise zur reaktiven Verarbeitung einzelner Werte verwendet, reactivewird zur reaktiven Verarbeitung von Objekttypdaten verwendet referforderlich Beim Zugriff über .valuewird refautomatisch aus der Ansicht entfernt. refkann nicht verwendet werden Objekte empfangen. Oder ein Array, das jedoch immer noch intern von reactiveimplementiert wird; reactiveentfernt automatisch ref, wenn es einen Ref< empfängt /code>-Objekt; Erweiterung verwenden Das von der Operatorerweiterung reactivezurückgegebene reaktive Objekt verliert seine Reaktionsfähigkeit. Es kann mit toRefs()kombiniert werden, um den Wert in einen umzuwandeln Ref-Objekt und dann Erweitern. reactiveverwendet intern den Prxoy-Proxy, um verschiedene Operationen am Objekt abzufangen, während refintern einen RefImpl-Klasse, setze get value/set value, um den Benutzerzugriff auf Werte abzufangen. 16. Wie erweitere ich eine Komponente in Vue? Logische Erweiterungen: mixins, extends, composition api: Inhaltserweiterungen: Slots Mixinssind flexibel, aber widersprüchlich und verwirrend. extendsist eine weniger häufig verwendete Option. Der Unterschied zu mixinsbesteht darin, dass sie nur ein einzelnes Objekt erweitern kann und eine höhere Priorität als mixinshat. Die gemischten Daten und Methoden können die Quelle nicht eindeutig bestimmen und können zu Namenskonflikten mit Variablen in der aktuellen Komponente, Kompositions-API, führen Diese Probleme können sehr gut gelöst werden, um auf einfache Weise unabhängige Logik zu schreiben und reaktionsfähige Daten bereitzustellen, was die Lesbarkeit und Wartbarkeit des Codes verbessert. Erweiterungen: Vue.mixin (globales Mixin) Vue.extend (ein bisschen wie Klassen-/Komponentenvererbung zum Erstellen einer Unterklasse)17. Was ist Vue-Loader? vue-loaderist ein Webpack-Loader zur Verarbeitung einzelner Dateikomponenten (SFC)Aufgrund von vue-loaderkönnen wir < Write verwenden Code in Form einer Code>.vue-Datei und teilen Sie den Code in template script style auf webpack< /code> Beim Packen wird vue-loaderin Form von loaderaufgerufen Wenn vue-loaderausgeführt wird , it Jeder Sprachblock in SFCwird mit einer separaten Loader-Kette verarbeitet und schließlich werden diese separaten Blöcke zum endgültigen Komponentenmodul zusammengesetzt18. Sub Kann eine Komponente die Daten der übergeordneten Komponente ändern? kann nicht direkt geändert werden. Bei der Komponentenentwicklung gilt das Prinzip des einseitigen Datenflusses. Es ist sinnvoll, die Daten der übergeordneten Komponente in der untergeordneten Komponente nicht zu ändern.Wenn Sie sie wirklich ändern müssen, senden Sie bitte ein Ereignis an die übergeordnete Komponente durch Ausgeben und Ändern in der übergeordneten Komponente

19. Wie definiere ich dynamisches Routing und wie erhalte ich die übergebenen dynamischen Parameter?

Um dies zu erreichen, können wir ein dynamisches Feld im Pfad verwenden, z. B./users/:id, wobei:idder Pfadparameter ist. Es kann überthis.$route.parmasabgerufen werden und es können mehrere Parameter vorhanden sein. Das$route-Objekt stellt auch andere nützliche Informationen wiequery hashusw./users/:id其中:id就是路径参数。 可以通过this.$route.parmas获取,参数还可以有多个,$route对象还公开了其他有用的信息如queryhash等。

20. 说说对 Vue 数据响应式的理解

思路:

  • 什么是响应式?

  • 为什么vue需要响应式?

  • 有什么好处?

  • vue的响应式怎么实现的,有哪些优缺点?

  • vue3中的响应式的新变化

回答:

  • 数据响应式就是 能够监测到数据变化并且做出响应的一种机制

  • vue中要解决的一个核心问题就是连接数据层和视图层,通过数据变化驱动视图更新,要做到这点就需要对数据做响应式处理。

  • 通过数据响应式加上虚拟DOMpatch算法,我们只需要操作数据,关心业务,完全不需要接触繁琐的DOM操作,打打提升了开发效率,降低开发难度。

  • vue2中实现数据响应式的核心就是通过Object.defineProperty()方法对数据进行拦截,当get数据时做依赖收集set数据时做更新通知。这种机制很好的及绝了数据响应式的问题,但是实际使用也存在缺点,比如在初始化时的递归遍历会造成性能损失;无法监听新增或删除属性,在vue中要通过像Vue.set/delete这种特定的API才能实现对对象数组属性的添加和删除,而且也不支持MaSet这些数据结构,

  • 为了解决这些问题,Vue3重写了这部分实现,利用的是ES6中的Proxy代理要响应化的数据。它有很多好处,初始化性能和内存都大幅改善,也不需要特殊的API,但是不支持IE浏览器。

21. 从 template 到 render 做了什么

templaterender的过程其实是问的 vue编译器工作原理。

思路:

  • 引入编译器概念

  • 说明编译器的必要性

  • 阐述编译器工作流程

回答:

  • Vue中有个独特的编译模块,称为compiler,它的主要作用是将template编译为js可执行的render函数

  • 之所以需要这个编译过程是为了便于我们高校的编写试图模版。相比而言,我们还是更愿意用HTML来编写视图,直观且高效。手写render函数不仅效率低下,而且失去了被编译器的优化能力。

  • Vue编译器 首先会对template进行解析Parse),结束后会得到一个抽象语法树AST,然后对AST进行深加工转换(transform),最后将得到的AST生成为js代码,也就是render函数

22. 如何缓存和更新组件

  • 缓存组件可以使用keep-alive组件,include 和 exclude 可以指定包含不包含哪些组件。

  • Vue3结合vue-router使用变化非常大,之前是keep-alive包含router-view,现在是router-view包含keep-alive

  • 缓存后如果想要获取数据可以使用actived钩子 或者beforeRouteEntervue-router的一个守卫)

  • keep-alive是一个通用组件,它内部定义了一个map,缓存创建过的组件实例,它返回的渲染函数内部会查找内嵌的component组件对应组件的vnode,如果改组件在map中存在就直接返回它。由于componentis属性是一个响应式数据,因此只要它变化,keep-aliverender

    20. Sprechen Sie über Ihr Verständnis der Reaktionsfähigkeit von Vue-DatenDenken Sie:
    • Was ist Reaktionsfähigkeit?
    • Warum muss Vue reagieren?
    • Was sind die Vorteile von ?
    • Wie wird die Reaktionsfähigkeit von Vue umgesetzt und welche Vor- und Nachteile hat es?
    • Neue Änderungen in der Reaktionsfähigkeit in vue3
    Antwort:
    • Daten Reaktionsfähigkeit ist ein Mechanismus, der Datenänderungen erkennen und darauf reagieren kann
    • Ein Kernproblem, das invuegelöst werden muss, besteht darin, die Datenschicht und die Ansichtsschicht zu verbinden und so Ansichtsaktualisierungen voranzutreiben durch Datenänderungen Um dies zu erreichen, müssen die Daten responsiv verarbeitet werden.
    • Mit Datenreaktivität plus virtuellenDOM- undpatch-Algorithmen müssen wir nur noch Daten verwalten und uns um das Geschäft kümmern, ohne uns mit mühsamen Aufgaben befassen zu müssen Aufgaben bei allenDOM-Operationen verbessert DaDa die Entwicklungseffizienz und reduziert Entwicklungsschwierigkeiten.
    • Der Kern der Implementierung der Datenreaktionsfähigkeit invue2besteht darin, Daten über die MethodeObject.defineProperty()abzufangen, wennget< Wenn /code>-Daten erfasst werden, werden Abhängigkeiten erfasst und wenn set-Daten verwendet werden, erfolgt eine Aktualisierungsbenachrichtigung. Dieser Mechanismus löst das Problem der Datenreaktion sehr gut, weist jedoch auch Mängel bei der tatsächlichen Verwendung auf. Beispielsweise kann die rekursive Durchquerung während der Initialisierung zu Leistungseinbußen führen. Neue oder gelöschte Attribute können innicht überwacht werdenmüssen Sie eine bestimmteAPIwieVue.set/deleteverwenden, um Objektarray-Attribute hinzuzufügen und zu löschen.Ma< wird nicht unterstützt /code>, Legendiese Datenstrukturen fest,
    • Um diese Probleme zu lösen, hatVue3diesen Teil der Implementierung mit It is neu geschrieben die Daten, auf die derProxy-Proxy inES6reagieren soll. Es hat viele Vorteile, die Initialisierungsleistung und der Speicher werden erheblich verbessert und es ist keine spezielleAPIerforderlich, aber derIE-Browser wird nicht unterstützt.
    21. Was wird von der Vorlage bis zum Rendern gemacht? Die Frage nach dem Prozess vontemplatebisrenderist eigentlich eine Frage vueSo funktioniert der Compiler. Idee:
    • Das Konzept des Compilers vorstellen
    • Erklären Sie die Notwendigkeit eines Compilers
    • Erklären Sie den Compiler-Workflow
    Antwort:
    • Vue Es gibt ein einzigartiges Kompilierungsmodul namens compiler. Seine Hauptfunktion besteht darin,templatein die ausführbare Dateijszu kompilieren Funktion
    • Der Grund, warum dieser Kompilierungsprozess benötigt wird, besteht darin, das Schreiben von Ansichtsvorlagen an unseren Universitäten zu erleichtern. Im Vergleich dazu verwenden wir immer noch lieberHTMLzum Schreiben von Ansichten, was intuitiv und effizient ist. Das manuelle Schreiben der Funktionrenderist nicht nur ineffizient, sondern kann auch nicht mehr vom Compiler optimiert werden.
    • VueDer Compiler analysiert zuerst dieVorlage(Parse), und am Ende erhalten Sie Erstellen Sie einen abstrakten SyntaxbaumAST, führen Sie dann eine Deep-Processing-Konvertierung (transform) fürASTdurch und generieren Sie schließlich den resultierendenAST in js-Code, d. list-style-type: disc;">
    • Die Cache-Komponente kann diekeep-alive-Komponente verwenden, und Einschließen und Ausschließen können angeben, welche Komponenten ein- und ausgeschlossen werden sollen.
    • Vue3in Kombination mitvue-routerhat sich stark verändert. Zuvor enthieltkeep-aliverouter -view, jetzt enthältrouter-viewkeep-alive
    • Wenn Sie Daten nach dem Caching erhalten möchten, können Sie dies tun Verwenden Sie den HookactivedoderbeforeRouteEnter(ein Wächter vonvue-router)
    • keep-alive< /code> Es handelt sich um eine allgemeine Komponente. Sie definiert intern eine mapund speichert die erstellten Komponenteninstanzen zwischen. Die zurückgegebene Rendering-Funktion sucht intern nach der entsprechendencomponent-Komponente eingebettetecomponent-komponente. code>vnode, wenn die Komponente in der Karte vorhanden ist, wird sie direkt zurückgegeben. Da es sich bei dem Attributisvoncomponentum reaktive Daten handelt, ist dierender-Funktion vonkeep-alive wird erneut ausgeführt.

    23. Virtuelles DOM

    • Was ist virtuelles DOM? Die Essenz des virtuellenDOMist einJavascript-Objekt.DOM是什么? 虚拟DOM的本质就是一个Javascript对象。

    • 为什么要引入虚拟DOM?(好处) 它能有效减少操作DOM的次数,方便实现跨平台

    • 虚拟DOM如何生成?compiler编译器会把template模版编译成渲染函数,接下来在mount挂载的过程会调用这个渲染函数,返回的对象就是虚拟DOM。挂载结束后,会进入更新流程。如果某些响应式数据发生变化,将会引起组件重新render,此时会生成新的虚拟DOM,和上次渲染结果做diff操作,最小量的操作dom,从而高效更新视图。

    24. 什么是异步组件

    • 异步组件就是不会立即加载而是会在需要的时候加载的组件。在大型应用中,我们需要分割代码为更小的块试就可以用异步组件。

    • 不仅可以在路由切换时懒加载组件,还可以在组件中使用异步组件,从而更细的分割代码。

    • 使用异步组件最简单的方式是直接给defineAsyncComponet指定一个loader函数,结合 ES 模块 动态导入函数import可以快速实现。Vue3还可以结合Suspense组件使用异步组件。

    • 异步组件容易和路由懒加载混淆,实际上不是一个东西。异步组件不能被用于定义懒加载路由上,处理它的是Vue框架,处理路由组件加载的是vue-router。但是可以在懒加载的路由组件中使用异步组件。

    25. 说说Vue长列表优化思路

    • 避免大数据量:可以采用分页的方式获取
    • 避免渲染大量数据:vue-virtual-scroller等虚拟滚动方案,只渲染视口范围内的数据
    • 避免更新:可以使用v-once方式只渲染一次
    • 优化更新:通过v-memo缓存组数,有条件更新,提高服用,避免不必要更新
    • 按需加载数据:可以采用懒加载方式,在用户需要的时候在加载数据。

    26. computed & watch

    • computed是计算属性,watch是侦听器。

    • computed通常用于处理模版中复杂的逻辑,而watch通常用于需要监听一个响应式对象的变化而做一些操作的时候

    • watch可以进行异步操作,computed不行。

    • 计算属性传递一个对象 有setget两个选项,是它称为即可读又可写的计算属性,如果传递的是函数的话默认就是get选项,watch可以传递一个对象,设置deep、immediate等选项

    • vue3watch发生了一些变化,例如不能再侦测一个点操符之外的字符串表达式,reactivity API中新出的watchwatchEffect可以完全替代watch选项,而且功能更加强大

    27. SPA 和 SSR的区别是什么?

    • SPA(Single Page Application)是单页面应用。一般也称为客户端渲染,简称CSR。SSR(Server Side Render) 即服务端渲染。一般也称为多页面应用(Mulpile Page Application),简称 MPA。

    • SPA只会首次请求html文件,后续只需要请求JSON数据即可,因此用户体验更好,节约流量,服务端压力也较小。但是首屏加载的时间会变长,而且SEO不友好。为了解决以上缺点,就有了SSR方案,由于HTML内容在服务器一次性生成出来,首屏加载快,搜索引擎也可以很方便的抓取页面信息。但同时SSR方案也会有性能,开发受限等问题。

    • 选择上,如果有首屏加载优化需求,SEO需求时,就可以考虑SSR。

    • 但并不是只有这一种替代方案,比如对一些不常变化的静态网站,SSR反而浪费资源,我们可以考虑预渲染的方案。另外nuxt.js/next.js

      Warum virtuellesDOMeinführen? (Nutzen) Es kann die Anzahl der Operationen aufDOMeffektiv reduzieren und die plattformübergreifende Implementierung erleichtern. Wie generiert man virtuelles DOM?compilerDer Compiler kompiliert dietemplate-Vorlage in eine Rendering-Funktion. Als nächstes wird diese Rendering-Funktion während des Mountvorgangs vonmountaufgerufen Das zurückgegebene Objekt istVirtuelles DOM. Nachdem die Montage abgeschlossen ist, wird der Aktualisierungsvorgang gestartet. Wenn sich einige Reaktionsdaten ändern, wird die Komponente erneutrendererstellt. Zu diesem Zeitpunkt wird ein neuesvirtuelles DOMgeneriert unddiff< Wird mit dem letzten Rendering-Ergebnis durchgeführt. Die minimale Menge an Operationen ist dom, um die Ansicht effizient zu aktualisieren. 24. Was ist eine asynchrone Komponente? Asynchrone Komponenten sind Komponenten, die nicht sofort geladen werden, sondern bei Bedarf. In großen Anwendungen müssen wir den Code in kleinere Teile aufteilen und asynchrone Komponenten verwenden. Sie können Komponenten beim Umschalten des Routings nicht nur langsam laden, sondern auch asynchrone Komponenten in Komponenten verwenden, um den Code feiner aufzuteilen. Die einfachste Möglichkeit, asynchrone Komponenten zu verwenden, besteht darin,defineAsyncComponetdirekt eineloader-Funktion zuzuweisen und diese mit der dynamischen Importfunktionimport< des ES-Moduls zu kombinieren /code> um schnell fertig zu werden. Vue3kann auch asynchrone Komponenten in Verbindung mit derSuspense-Komponente verwenden. Asynchrone Komponenten werden leicht mit verzögertem Laden von Routen verwechselt, was eigentlich nicht dasselbe ist. Asynchrone Komponenten können nicht zum Definieren von Lazy-Loading-Routen verwendet werden. Sie werden vomVue-Framework verwaltet und dervue-routerübernimmt das Laden von Routing-Komponenten. Sie können jedoch asynchrone Komponenten in Lazy-Loaded-Routing-Komponenten verwenden. 25. Lassen Sie uns über Ideen zur Optimierung langer Vue-Listen sprechen -Scroller rendert nur Daten innerhalb des AnsichtsfensterbereichsUpdates vermeiden: Sie können diev-once-Methode verwenden, um nur einmal zu rendernUpdates optimieren: Gruppennummern über V-Memo zwischenspeichern, bedingt aktualisieren, verbessern Nutzung und vermeiden Sie unnötige UpdatesDaten bei Bedarf laden: Sie können die MethodeLazy Loadingverwenden, um Daten zu laden, wenn der Benutzer sie benötigt. 26. computed & watchcomputedist eine berechnete Eigenschaft undwatchist ein Listener.computedwird normalerweise verwendet, um komplexe Logik in Vorlagen zu verarbeiten, währendwatchnormalerweise verwendet wird, wenn Sie Änderungen in einem reaktionsfähigen Objekt überwachen und einige Vorgänge ausführen müssenwatchkann asynchrone Vorgänge ausführen,computedjedoch nicht. Berechnete Eigenschaften übergeben ein Objekt mit zwei Optionen:setundget, die als lesbare und beschreibbare berechnete Eigenschaften bezeichnet werden. Wenn eine Funktion übergeben wird, ist die Standardeinstellung < code>get-Option.watchkann ein Objekt übergeben und Optionen wie „deep“ und „immediate“ festlegenvue3Inwatch< /code > hat einige Änderungen erfahren, zum Beispiel kann es keine anderen Zeichenfolgenausdrücke als Punktoperatoren mehr erkennen, und die neuen watchundin reactivity APIwatchEffectkann die Optionwatchvollständig ersetzen und ist leistungsfähiger27 Was ist der Unterschied zwischen SPA und SSR?SPA(Single Page Application) ist eine Single Page Application. Es wird im Allgemeinen auch „clientseitiges Rendering“ oder kurzCSRgenannt. SSR (Server Side Render) bedeutet Server Side Rendering. Es wird im Allgemeinen auch „Multiple Page Application“ (Mulpile Page Application) oder kurz MPA genannt.SPAfordert nur zum ersten Mal diehtml-Datei an. Nachfolgende Anfragen erfordern nurJSON-Daten, sodass die Benutzererfahrung nicht stimmt besser und der Datenverkehr wird gespart, auch die Belastung des Servers ist geringer. Allerdings wird die Ladezeit des ersten Bildschirms länger und er ist nichtSEO-freundlich. Um die oben genannten Mängel zu beheben, gibt es dieSSR-Lösung. Da derHTML-Inhalt einmal auf dem Server generiert wird, wird der erste Bildschirm schnell geladen, und Suchmaschinen können dies auch tun Einfaches Crawlen der Seiteninformationen. Gleichzeitig weist dieSSR-Lösung jedoch auch Probleme wie Leistung und eingeschränkte Entwicklung auf. In Bezug auf die Auswahl können Sie SSR in Betracht ziehen, wenn Sie Optimierungsbedarf beim Laden des ersten Bildschirms oder SEO-Anforderungen haben. Aber dies ist nicht die einzige Alternative. Bei einigen statischen Websites, die sich nicht häufig ändern, kann SSR eine Pre-Rendering-Lösung in Betracht ziehen. Darüber hinaus stellt unsnuxt.js/next.jsdie SSG-Lösung zur statischen Website-Generierung zur Verfügung, die auch eine gute Lösung für statische Websites ist. In Kombination mit einigen CI-Methoden kann ein guter Optimierungseffekt erzielt werden.

    28. diff 算法

    回答思路:

    • diff算法是干什么的?

    • 必要性

    • 何时执行

    • 具体执行方式

    • 拔高:说一下vue3中的优化

    回答:

    • Vue中的diff算法称为patching算法,虚拟DOM要想转化为真实DOM就需要通过patch方法转换。

    • 最初Vue1.x视图中农每个依赖均有更新函数对应,可以做到精确更新,因此不需要虚拟DOMpatching算法支持,但是这样粒度过细导致Vue1.x无法承载较大应用;Vue2.x中为了降低Watcher粒度,每个组件只有一个Watcher与之对应,此时就需要引入patching算法才能精确找到发生变化的地方并高效更新。

    • vuediff执行的时刻是组件内响应式数据变更触发实例执行其更新函数时,更新函数会再次执行render函数获得最新的虚拟DOM,然后执行patch函数对比新旧虚拟DOM,将其转化为对应的DOM操作。

    • patch过程是一个递归过程,遵循深度优先、同层比较的策略;以vue3patch为例:

      • 首先判断两个节点是否为相同同类节点,不同则删除重新创建
      • 如果双方都是文本则更新文本内容
      • 如果双方都是元素节点则递归更新子元素,同时更新元素属性
      • 更新子节点时又分了几种情况:
        • 新的子节点是文本,老的子节点是数组则清空,并设置文本;
        • 新的子节点是文本,老的子节点是文本则直接更新文本;
        • 新的子节点是数组,老的子节点是文本则清空文本,并创建新子节点数组中的子元素;
        • 新的子节点是数组,老的子节点也是数组,那么比较两组子节点,更新细节blabla
    • vue3中引入的更新策略:编译期优化patchFlagsblock

    29. 如何从0到1架构一个Vue项目,说说有哪些步骤,插件,目录结构怎么组织

    • 从 0 创建项目我大致会做以下事情:项目构建、引入必要插件、代码规范、提交规范、常用库和组件

    • 目前vue3项目我会用vite或者create-vue创建项目

    • 接下来引入必要插件:vue-router、vuex/pinia、element-plus、antd-vue、axios等等

    • 其他常用的库有 像lodash、dayjs、nprogress等等..

    • 下面是代码规范: editorconfig、prettier、eslint

    • 最后是提交规范,可以使用husky、Commitizen

    • 目录结构我喜欢按照下面的结构来

    + |- /src + |- /assets 存放资源 + |- /img + |- /css + |- /font + |- /data + |- base-ui 存放多个项目中都会用到的公共组件 + |- components 存放这个项目用到的公共组件 + |- hooks 存放自定义hook + |- views 视图 + |- store 状态管理 + |- router 路由 + |- service 网络请求 + |- utils 工具 + |- global 全局注册、全局常量..
    Nach dem Login kopieren
    Nach dem Login kopieren

    30. 你如何实现一个Vue-Router

    一个SPA应用的路由需要解决的问题时页面跳转内容改变同时不刷新,同时路由还需要已插件形式存在,所以:

    • 首先我会定义一个createRouter函数,返回路由器实例,实例内部做几件事;

      • 保存用户传入的配置项
      • 监听hash或者popstate事件
      • 回调里根据path匹配对应路由
    • router定义成一个Vue插件,即实现install方法,内部做两件事:

      • 实现两个全局组件:router-linkrouter-view,分别实现页面跳转和内容显示
      • 定义两个全局变量:$router$route,组件内可以访问当前路由和路由器实例

    31. 什么情况需要使用Vuex模块?

    • 在项目规模变大的之后,单独一个store对象会过于庞大臃肿,此时通过模块方式可以拆分来便于维护

    • 可以按之前规则单独编写资规模代码,然后在主文件中通过modules选项组织起来:createStore({modules: {...}})

    • Bitte beachten Sie bei der Verwendung, dass Sie beim Zugriff auf den Submodulstatus den registrierten Modulnamen hinzufügen müssen. Aber gleichzeitig liegenGetter,MutationenundAktionenim globalen Raum und können auf die gleiche Weise wie zuvor verwendet werden. Wenn Sie eine vollständige Aufteilung erreichen möchten, müssen Sie den Submodulen die Optionnamespacehinzufügen. Zu diesem Zeitpunkt müssen Sie beim Zugriff darauf das Namespace-Präfix hinzufügen.gettersmutationsactions又在全局空间中,使用方式和之前一样。如果要做到完全拆分,需要在子模块加上namespace选项,此时再访问它们就要加上命名空间前缀。

    • 模块的方式可以拆分代码,但是缺点也很明显,使用起来比较繁琐,容易出错,而且类型系统支持很差,不能给我们带来帮助。pinia 显然在这方面有了很大改进,是时候切换过去了。

    32. vue 组件为什么只能有1个根节点

    • vue2中组件确实只能有一个跟,但vue3中组件已经可以多根组件了。

    • 之所以需要这样是因为vdom是一颗单根树形结构,patch方法在遍历的时候从根节点开始遍历,它要求只有一个根节点。组件也会转换为一个vdom,自然应该满足这个要求。

    • vue3中之所以可以写多个根节点,是因为引入了Fragment的概念,这是一个抽象的节点,如果发现组件时多根的,就创建一个Fragment节点,把多个根节点作为它的children。将来pathch的时候,如果发现是一个Fragment节点,则直接遍历children创建或更新。

    33. v-once 使用场景有哪些?

    • v-oncevue的内置指令,作用是仅渲染指定组件或元素一次,并跳过未来对其更新。

    • 如果我们有一些元素或者组件再初始化渲染之后不再需要变化,这种情况下适合使用v-once,这样哪怕这些数据变化,vue也会跳过更新,是一种代码优化手段。

    • 我们只需要作用的组件或元素上加上v-once即可。

    补充:

    • vue3.2之后,又增加了v-memo,这个指令可以有条件的缓存模板并控制他们的更新。

    • v-once的原理:编译器发现有v-once时,会将首次计算结果存入缓存对象,组件再次渲染时就会从缓存获取,从而避免再次计算。

    34. 什么场景使用嵌套路由

    • 在平时开发中,应用的有些界面是由多层嵌套的组件组合而来的,这种情况下,url各部分通常对应某个嵌套的组件,vue-router中可以使用嵌套路由表示这种关系。
    • 表现形式是在两个路由间切换时,他们有公用的视图内容。此时通常提取一个父组件,内部放上view-router,从而形成物理上的嵌套,和逻辑上的嵌套对应起来。定义嵌套路由时使用children属性组织嵌套关系
    • 原理上是在router-view组件内部判断其所处嵌套的深度,将这个深度作为匹配组件数组matched的索引,获取对应渲染组件并渲染之。

    如果你说不出来,可以直接举例子。当我开发一个页面时,如果需要显示一个顶部导航栏,通过导航栏跳转到不同的页面,而顶部的导航栏又必须要在每个页面显示时,就可以使用嵌套路由;还可以举例,当我需要查看某个列表的详情页面时,往往需要嵌套路由 (detail/:id

    35. 如何监听 Vuex 状态变化?

    • watch

    • store.subscribe()

    watch方式,可以以字符串形式监听$store.state.xx;subscribe方法参数是一个回调函数,回调函数接受mutation对象和state对象,可以通过mutation.type判断监听的目标。 wtach 方法更简单好用,subscribe

    Die Modulmethode kann den Code aufteilen, aber die Mängel liegen auch auf der Hand. Sie ist umständlich zu verwenden, fehleranfällig und die Typsystemunterstützung ist sehr schlecht, was uns nicht helfen kann. pinia hat sich in diesem Bereich offensichtlich stark verbessert und es ist Zeit für einen Umstieg.

    • 32. Warum kann die Vue-Komponente nur einen Wurzelknoten haben? Code > Mittlere Komponenten können bereits mehrere Stammkomponenten haben.

      Der Grund, warum dies erforderlich ist, liegt darin, dassvdomeine Baumstruktur mit einer Wurzel ist. Die Methodepatchbeginnt beim Durchlaufen am Wurzelknoten und erfordert nur ein Wurzelknoten. Die Komponente wird auch in einvdomkonvertiert, was diese Anforderung natürlich erfüllen sollte.

    • Der Grund, warum mehrere Wurzelknoten invue3geschrieben werden können, liegt darin, dass das Konzept vonFragmenteingeführt wird. Dies ist ein abstrakter Knoten, mit dem eine Komponente gefunden wird Wenn Sie mehrere Wurzeln haben, erstellen Sie einenFragment-Knoten und verwenden Sie mehrere Wurzelknoten als seineuntergeordneten Knoten. Wenn in Zukunftpathchfestgestellt wird, dass es sich um einenFragment-Knoten handelt, wird er direktchildesdurchlaufen, um ihn zu erstellen oder zu aktualisieren.

    33. Welche Einsatzszenarien gibt es für v-once?v-onceist eine integrierte Anweisung vonvue. Seine Funktion besteht darin, die angegebene Komponente oder das angegebene Element nur einmal zu rendern und zukünftige Aktualisierungen daran zu überspringen. Wenn wir einige Elemente oder Komponenten haben, die nach dem ersten Rendern nicht mehr geändert werden müssen, ist es in diesem Fall geeignet,v-oncezu verwenden, sodassvueEs werden auch Aktualisierungen übersprungen, was eine Methode zur Codeoptimierung ist. Wir müssen nurv-oncezu der verwendeten Komponente oder dem verwendeten Element hinzufügen. Hinzugefügt:vue3.2Danach wurdev-memohinzugefügt, um Vorlagen bedingt zwischenzuspeichern und sie vor Aktualisierungen zu schützen . Das Prinzip vonv-once: Wenn der Compiler feststellt, dassv-oncevorhanden ist, speichert er das erste Berechnungsergebnis im Cache-Objekt und wann Wird die Komponente erneut gerendert, wird sie aus dem Cache abgerufen, um eine Neuberechnung zu vermeiden. 34. In welchen Szenarien wird verschachteltes Routing verwendet?
      In der täglichen Entwicklung bestehen einige Schnittstellen der Anwendung aus mehreren Schichten verschachtelter Komponenten code>url entspricht normalerweise einer verschachtelten Komponente. Verschachteltes Routing kann in vue-routerverwendet werden, um diese Beziehung auszudrücken. Der Ausdruck ist, dass beim Wechsel zwischen zwei Routen der gemeinsame Ansichtsinhalt vorhanden ist. Zu diesem Zeitpunkt wird normalerweise eine übergeordnete Komponente extrahiert und view-routerdarin platziert, wodurch eine physische Verschachtelung entsteht, die der logischen Verschachtelung entspricht. Verwenden Sie beim Definieren verschachtelter Routen das Attribut children, um die verschachtelte Beziehung zu organisieren. Im Prinzip wird die Tiefe der Verschachtelung innerhalb der Komponente router-viewbestimmt und diese Tiefe verwendet Als Index des passenden Komponentenarrays matchederhalten Sie die entsprechende Rendering-Komponente und rendern sie.
    Wenn Sie es nicht erklären können, geben Sie einfach ein Beispiel. Wenn ich eine Seite entwickle und eine obere Navigationsleiste anzeigen und über die Navigationsleiste zu verschiedenen Seiten springen muss und die obere Navigationsleiste auf jeder Seite angezeigt werden muss, kann ich auch ein Beispiel verwenden. Wenn ich die Detailseite einer Liste anzeigen muss, benötige ich häufig verschachteltes Routing (detail/:id) 35 Wie überwache ich Vuex-Statusänderungen? Mit der Methodewatchkönnen Sie$store.state.xxim Formular überwachen of string >; Der Methodenparametersubscribeist eine Callback-Funktion. Die Callback-Funktion akzeptiertmutation-Objekte undstate-Objekte, dieübergeben werden können >mutation.type code> Bestimmen Sie das Ziel der Überwachung. Die wtach-Methode ist einfacher und benutzerfreundlicher, während subscribeim Allgemeinen etwas umständlicher ist36 Was ist während des Mountvorgangs der Vue-Instanz passiert? Der Prozess des Mountens einer Instanz ist der Prozess von app.mount(). Im Allgemeinen werden zwei Dinge ausgeführt: Initialisierung und Einrichten eines AktualisierungsmechanismusInitialisierungstreffen Erstellen von Komponenteninstanzen , Komponentenstatus initialisieren, Verschiedene Reaktionsdaten erstellen
  • Dieser Schritt des Lebenslaufaktualisierungsmechanismus führt sofort eine Komponentenaktualisierungsfunktion aus, die die Rendering-Funktion zum ersten Mal ausführt undpatchausführt, um den zuvor erhaltenenvnodezu konvertieren > intodom; Gleichzeitig wird eine Abhängigkeit zwischen seinen internen Antwortdaten und der Komponentenaktualisierungsfunktion erstellt, sodass die entsprechende Aktualisierungsfunktion ausgeführt wird, wenn sich die Daten in Zukunft ändern. patch将前面获得vnode转换为dom;同时会创建它内部响应式数据和组件更新函数之间的依赖关系,这使得以后数据变化时会执行对应的更新函数。

  • 37. key 的作用

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

    • keyvuepatch过程中判断两个节点是否是相同节点的关键条件(另一个是元素类型),如果不设置key,它的值就是undefinedvue则可能永远认为这是两个相同节点,只能去做更新操作,这造成了大量的dom更新操作,明显是不可取的。

    • 实际使用的过程中必须设置key,而且应该尽量避免使用数组索引,这可能导致一些隐藏bug

    38. watch 和 watchEffect

    • watchEffect立即运行函数,被动地追踪它的依赖,传入的函数即是依赖收集的数据源,也是回调函数;watch侦测一个或多个响应式数据源,在数据源变化时调用一个回调函数,通过immediate选项也可以设置立即执行一次。

    • watchEffect是一种特殊的watch。如果不关心响应式数据前后的值,可以使用watchEffect。其他情况都可以用watch

    39. 父子组件创建、挂载顺序

    parent created -> child created -> child mounted -> parent mounted

    原因:Vue创建是一个递归的过程,先创建父组件有子组件就会创建子组件,因此创建时先有父组件再有子组件;子组件首次创建时会添加Mounted钩子到队列,等到patch结束再执行它们,可见子组件的mounted钩子是选进入到队列中的,因此等到patch结束执行这些钩子时也先执行。

    40. 说说你对 Vuex 的理解

    • vuex是一个专门为vue应用开发的状态管理模式库,

    • 当你遇到多个组件共享状态时或者项目中的组件难以管理的时候就可以使用vuex,它以一个全局单例模式管理全局的状态。

    • 基本核心概念有 state、mutation、action、getters、module等

    • 说些使用过程的感受 ts不友好 模块使用繁琐 页面刷新数据也会消失

    41. 什么是递归组件?使用场景有哪些?

    • 如果某个组件通过组件名称引用它自己,这种情况就是递归组件。

    • 类似TreeMenu这类组件,它们的节点往往包含子节点,子节点结构和父节点往往是相同的。这类组件的数据往往也是树形结构,这种都是使用递归组件的典型场景。

    42. 你写过自定义指令吗?

    使用自定义指令分为定义、注册、和使用

    • 定义有两种方式,对象和函数形式,前者类似组件定义,有各种生命周期;后者只会在mountedupdated时执行

    • 注册:可以使用app.directive全局注册 也可以通过选项局部注册

    • 使用时在注册名称前加上 v-即可。

    • v-copy复制粘贴

    • v-lazy图片懒加载

    • v-debounce防抖

    • v-permission按钮权限

    • v-longpress长按

    43. Vue3新特性

    API 层面

    • Composition API

    • setup语法糖

    • Teleport传送门

    • Fragments可以多个根节点

    • Emits

    • createRenderer自定义渲染器

    • SFC状态驱动css变量 (v-bind in