Rumah > tajuk utama > teks badan

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)

青灯夜游
Lepaskan: 2022-06-29 21:03:53
ke hadapan
4696 orang telah melayarinya

Artikel ini meringkaskan dan berkongsi 20 Vue soalan temu bual klasik (dengan penjelasan peringkat kod sumber yang terperinci) untuk membantu anda menyusun pengetahuan asas dan meningkatkan rizab pengetahuan Vue anda Perlu dikumpulkan, datang dan ambil satu pandangan!

01-Apakah kaedah komunikasi antara komponen Vue

Vue ialah rangka kerja pembangunan berasaskan komponen, jadi komunikasi data antara komponen adalah sangat penting untuk aplikasi vue. Soalan ini terutamanya menguji kemahiran dan kecekapan asas Vue setiap orang dalam menggunakan API asas Vue. Pengetahuan sempadan lain seperti menyediakan/menyuntik/$attrs menunjukkan keluasan pengetahuan penemuduga.


Pelbagai cara menghantar parameter dalam komponen

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)


Analisis idea:

  • Ikhtisar semua cara untuk mengetahui

  • Terangkan senario penggunaan mengikut perhubungan komponen


Contoh jawapan:

1 Terdapat 8 kaedah biasa komponen komunikasi:

  • props<.>
  • $emit/
  • $on
  • $anak/$ibu bapa
  • $attrs/
  • $pendengar
  • ref
  • $root
  • eventbus
  • vuex
Beri perhatian kepada beberapa API terbengkalai dalam vue3

https://v3-migration.vuejs.org/breaking-changes/children.html

https://v3-migration.vuejs.org/breaking-changes/listeners-removed. html

https://v3-migration.vuejs.org/breaking-changes/events-api.html#overview


2. Adalah lebih jelas untuk membincangkan komponen komunikasi berdasarkan hubungan antara komponen Sah

  • Komponen ibu bapa-anak

    • /props/$emit/$parent/ref$attrs
  • Komponen adik beradik

    • /$parent/$root/eventbusvuex
  • merentas Hubungan Hierarki

    • /eventbus/vuex provideinject

02-v- Yang manakah mempunyai keutamaan yang lebih tinggi, jika atau v-untuk?

Analisis: Soalan ini menguji akal dan diterangkan secara terperinci dalam dokumen

v2

| v3; juga merupakan soalan latihan yang baik, yang sering ditemui dalam projek. Ia boleh menunjukkan kebolehan dan keupayaan aplikasi penemuduga.


Analisis pemikiran:

    Beri kesimpulan dahulu
  • Mengapa ini, beritahu kami butirannya
  • Apakah senario yang mungkin menyebabkan kami melakukan perkara ini dan cara menanganinya
  • Ringkasan dan naikkan bar

Contoh jawapan:

    Dalam amalan
  • tidak boleh menggunakan v- for dan v-if diletakkan bersama

  • Dalam
  • vue2

    , keutamaan v-for adalah lebih tinggi daripada v -jika , meletakkan mereka bersama-sama, ia boleh dilihat daripada fungsi pemaparan output bahawa gelung akan dilaksanakan terlebih dahulu dan kemudian syarat akan dinilai Walaupun kita hanya memberikan sebahagian kecil daripada elemen dalam senarai, kita perlu merentasi keseluruhan senarai setiap kali kami membuat semula, yang akan membandingkan Waste; Di samping itu, perlu diperhatikan bahawa dalam vue3 ia adalah sebaliknya dengan keutamaan yang lebih tinggi daripada v-for, jadi apabila v-if dilaksanakan, pembolehubah yang dipanggilnya belum wujud lagi, yang akan menyebabkan Pengecualian

  • Biasanya terdapat dua situasi yang menyebabkan kita melakukan ini:
    • Untuk
    • menapis item dalam senarai

      (cth. ). Pada masa ini, tentukan atribut yang dikira (seperti ) dan biarkan ia mengembalikan senarai yang ditapis (seperti v-for="user in users" v-if="user.isActive"). activeUsersusers.filter(u=>u.isActive)

    • Untuk
    • mengelakkan daripada memaparkan senarai

      yang sepatutnya disembunyikan (seperti ). Pada masa ini, alihkan ke elemen bekas (seperti v-for="user in users" v-if="shouldShowUsers", v-if) atau balut dengan lapisan ul. oltemplate

  • Dokumentasi dengan jelas menyatakan bahawa
  • jangan sekali-kali menggunakan

    dan pada elemen yang sama pada masa yang sama v-if, jelas sekali ini a Nota Penting. v-for

  • Dalam bahagian penjanaan kod kod sumber, anda boleh melihat dengan jelas sama ada v-if atau v-for diproses terlebih dahulu Susunan vue2 dan vue3 adalah sebaliknya, jadi beberapa gejala berlaku berbeza, tetapi tidak kira apa, mereka tidak boleh ditulis bersama.

Tahu sebabnya:

Lakukan ujian Apabila test.html berada pada tahap yang sama, fungsi pemaparan adalah seperti berikut :

ƒ anonymous(
) {
with(this){return _c(&#39;div&#39;,{attrs:{"id":"app"}},_l((items),function(item){return (item.isActive)?_c(&#39;div&#39;,{key:item.id},[_v("\n      "+_s(item.name)+"\n    ")]):_e()}),0)}
}
Salin selepas log masuk

Ambil ujian, test-v3.html

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)


Cari jawapan dalam kod sumber

v2: https://github1s.com/vuejs/vue/blob/HEAD/src/compiler/codegen/index.js#L65-L66

v3: https://github1s .com/vuejs/core /blob/HEAD/packages/compiler-core/src/codegen.ts#L586-L587


03 - Terangkan secara ringkas kitaran hayat Vue dan perkara masing-masing peringkat tidak

Soalan yang diperlukan untuk menguji pengetahuan asas Vue.

Idea

  • Berikan konsep

  • Senaraikan elemen kitaran hayat Peringkat

  • Terangkan keseluruhan proses

  • Digabungkan dengan amalan

  • Pelanjutan: perubahan vue3


Contoh jawapan

1 Setiap tika komponen Vue akan melalui satu siri langkah permulaan selepas itu dicipta, seperti, Ia memerlukan pemerhatian data, penyusunan templat, memasang contoh pada DOM dan mengemas kini DOM apabila data berubah. Fungsi yang dipanggil cangkuk kitaran hayat dijalankan semasa proses ini untuk memberi pengguna peluang menambah kod mereka sendiri pada peringkat tertentu.

2. Kitaran hayat Vue boleh dibahagikan kepada 8 peringkat secara keseluruhan: sebelum dan selepas penciptaan, sebelum dan selepas dimuatkan, sebelum dan selepas mengemas kini, sebelum dan selepas pemusnahan , serta kitaran hayat beberapa senario khas. Tiga adegan baharu untuk penyahpepijatan dan pemaparan sebelah pelayan telah ditambahkan pada vue3.

< /thead>
Kitaran hayat v2Kitaran hayat v3Penerangan
beforeCreatebeforeCreateApabila contoh komponen dibuat
dibuat< /td>dibuatAplikasi komponen telah dibuat sepenuhnya
sebelumMountbeforeMount komponen Sebelum dipasang
dilekapkandilekapkanSelepas komponen dipasang pada contoh
beforeUpdatebeforeUpdateData komponen berubah, sebelum kemas kini
dikemas kini dikemas kini Selepas data dikemas kini
sebelum Musnah
生命周期v2生命周期v3描述
beforeCreatebeforeCreate组件实例被创建之初
createdcreated组件实例已经完全创建
beforeMountbeforeMount组件挂载之前
mountedmounted组件挂载到实例上去之后
beforeUpdatebeforeUpdate组件数据发生变化,更新之前
updatedupdated数据数据更新之后
beforeDestroybeforeUnmount组件实例销毁之前
destroyedunmounted组件实例销毁之后
sebelum Nyahlekap
生命周期v2生命周期v3描述
activatedactivatedkeep-alive 缓存的组件激活时
deactivateddeactivatedkeep-alive 缓存的组件停用时调用
errorCapturederrorCaptured捕获一个来自子孙组件的错误时被调用
-renderTracked调试钩子,响应式依赖被收集时调用
-renderTriggered调试钩子,响应式依赖被触发时调用
-serverPrefetchssr only,组件实例在服务器上被渲染前调用
contoh komponen dimusnahkan Sebelum
dimusnahkan<🎜>dinyahlekapkan<🎜>Komponen Selepas kejadian dimusnahkan
< th>Kitaran hayat v3< /th>
Kitaran hayat v2Penerangan
diaktifkandiaktifkan komponen cache keep-alive Apabila diaktifkan
dinyahaktifkandinyahaktifkankeep-alive Dipanggil apabila komponen cache dinyahaktifkan
errorCapturederrorCapturedDipanggil semasa menangkap ralat daripada komponen turunan
-<🎜>renderTracked<🎜>Cakuk nyahpepijat, dipanggil apabila kebergantungan reaktif dikumpul
- <🎜>renderTriggered<🎜>Cakuk nyahpepijat, dipanggil apabila kebergantungan reaktif dicetuskan
-<🎜 >serverPrefetch <🎜>ssr sahaja, dipanggil sebelum tika komponen dipaparkan pada pelayan

3、Vue生命周期流程图:

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)

4、结合实践:

beforeCreate:通常用于插件开发中执行一些初始化任务

created:组件初始化完毕,可以访问各种数据,获取接口数据等

mounted:dom已创建,可用于获取访问数据和dom元素;访问子组件等。

beforeUpdate:此时view层还未更新,可用于获取更新前各种状态

updated:完成view层的更新,更新后,所有状态已是最新

beforeunmount:实例被销毁前调用,可用于一些定时器或订阅的取消

unmounted:销毁一个实例。可清理它与其它实例的连接,解绑它的全部指令及事件监听器


可能的追问

  • setup和created谁先执行?

  • setup中为什么没有beforeCreate和created?


知其所以然

vue3中生命周期的派发时刻:

https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/componentOptions.ts#L554-L555

vue2中声明周期的派发时刻:

https://github1s.com/vuejs/vue/blob/HEAD/src/core/instance/init.js#L55-L56


04-能说一说双向绑定使用和原理吗?

题目分析:

双向绑定是vue的特色之一,开发中必然会用到的知识点,然而此题还问了实现原理,升级为深度考查。


思路分析:

  • 给出双绑定义

  • 双绑带来的好处

  • 在哪使用双绑

  • 使用方式、使用细节、vue3变化

  • 原理实现描述


回答范例:

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

  • v-model是语法糖,默认情况下相当于:value@input。使用v-model可以减少大量繁琐的事件处理代码,提高开发效率。

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

  • 通过<input v-model="xxx">的方式将xxx的值绑定到表单元素value上;对于checkbox,可以使用true-value和false-value指定特殊的值,对于radio可以使用value指定特殊的值;对于select可以通过options元素的value设置特殊的值;还可以结合.lazy,.number,.trim对v-mode的行为做进一步限定;v-model用在自定义组件上时又会有很大不同,vue3中它类似于sync修饰符,最终展开的结果是modelValue属性和update:modelValue事件;vue3中我们甚至可以用参数形式指定多个不同的绑定,例如v-model:foo和v-model:bar,非常强大!

  • v-model是一个指令,它的神奇魔法实际上是vue的编译器完成的。我做过测试,包含v-model的模板,转换为渲染函数之后,实际上还是是value属性的绑定以及input事件监听,事件回调函数中会做相应变量更新操作。编译器根据表单元素的不同会展开不同的DOM属性和事件对,比如text类型的input和textarea会展开为value和input事件;checkbox和radio类型的input会展开为checked和change事件;select用value作为属性,用change作为事件。


可能的追问:

  • v-modelsync修饰符有什么区别

  • 自定义组件使用v-model如果想要改变事件名或者属性名应该怎么做


知其所以然:

测试代码,test.html

观察输出的渲染函数:

// <input type="text" v-model="foo">
_c(&#39;input&#39;, { 
  directives: [{ name: "model", rawName: "v-model", value: (foo), expression: "foo" }], 
  attrs: { "type": "text" }, 
  domProps: { "value": (foo) }, 
  on: { 
    "input": function ($event) { 
      if ($event.target.composing) return; 
      foo = $event.target.value 
    } 
  } 
})
Salin selepas log masuk
// <input type="checkbox" v-model="bar">
_c(&#39;input&#39;, { 
  directives: [{ name: "model", rawName: "v-model", value: (bar), expression: "bar" }], 
  attrs: { "type": "checkbox" }, 
  domProps: { 
    "checked": Array.isArray(bar) ? _i(bar, null) > -1 : (bar) 
  }, 
  on: { 
    "change": function ($event) { 
      var $$a = bar, $$el = $event.target, $$c = $$el.checked ? (true) : (false); 
      if (Array.isArray($$a)) { 
        var $$v = null, $$i = _i($$a, $$v); 
        if ($$el.checked) { $$i < 0 && (bar = $$a.concat([$$v])) } 
        else { 
          $$i > -1 && (bar = $$a.slice(0, $$i).concat($$a.slice($$i + 1))) } 
      } else { 
        bar = $$c 
      } 
    } 
  } 
})
Salin selepas log masuk
// <select v-model="baz">
//     <option value="vue">vue</option>
//     <option value="react">react</option>
// </select>
_c(&#39;select&#39;, { 
  directives: [{ name: "model", rawName: "v-model", value: (baz), expression: "baz" }], 
  on: { 
    "change": function ($event) { 
      var $$selectedVal = Array.prototype.filter.call(
        $event.target.options, 
        function (o) { return o.selected }
      ).map(
        function (o) { 
          var val = "_value" in o ? o._value : o.value; 
          return val 
        }
      ); 
      baz = $event.target.multiple ? $$selectedVal : $$selectedVal[0] 
    } 
  } 
}, [
  _c(&#39;option&#39;, { attrs: { "value": "vue" } }, [_v("vue")]), _v(" "), 
  _c(&#39;option&#39;, { attrs: { "value": "react" } }, [_v("react")])
])
Salin selepas log masuk

05-Vue中如何扩展一个组件

此题属于实践题,考察大家对vue常用api使用熟练度,答题时不仅要列出这些解决方案,同时最好说出他们异同。

答题思路:

  • 按照逻辑扩展和内容扩展来列举,

    • 逻辑扩展有:mixins、extends、composition api;

    • 内容扩展有slots;

  • 分别说出他们使用方法、场景差异和问题。

  • 作为扩展,还可以说说vue3中新引入的composition api带来的变化


回答范例:

  • 常见的组件扩展方法有:mixins,slots,extends等

  • 混入mixins是分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。

    // 复用代码:它是一个配置对象,选项和组件里面一样
    const mymixin = {
       methods: {
          dosomething(){}
       }
    }
    // 全局混入:将混入对象传入
    Vue.mixin(mymixin)
    
    // 局部混入:做数组项设置到mixins选项,仅作用于当前组件
    const Comp = {
       mixins: [mymixin]
    }
    Salin selepas log masuk
  • 插槽主要用于vue组件中的内容分发,也可以用于组件扩展。

    子组件Child

    <div>
      <slot>这个内容会被父组件传递的内容替换</slot>
    </div>
    Salin selepas log masuk

    父组件Parent

    <div>
       <Child>来自老爹的内容</Child>
    </div>
    Salin selepas log masuk

    如果要精确分发到不同位置可以使用具名插槽,如果要使用子组件中的数据可以使用作用域插槽。

  • 组件选项中还有一个不太常用的选项extends,也可以起到扩展组件的目的

    // 扩展对象
    const myextends = {
       methods: {
          dosomething(){}
       }
    }
    // 组件扩展:做数组项设置到extends选项,仅作用于当前组件
    // 跟混入的不同是它只能扩展单个对象
    // 另外如果和混入发生冲突,该选项优先级较高,优先起作用
    const Comp = {
       extends: myextends
    }
    Salin selepas log masuk
  • 混入的数据和方法不能明确判断来源且可能和当前组件内变量产生命名冲突,vue3中引入的composition api,可以很好解决这些问题,利用独立出来的响应式模块可以很方便的编写独立逻辑并提供响应式的数据,然后在setup选项中组合使用,增强代码的可读性和维护性。例如:

    // 复用逻辑1
    function useXX() {}
    // 复用逻辑2
    function useYY() {}
    // 逻辑组合
    const Comp = {
       setup() {
          const {xx} = useXX()
          const {yy} = useYY()
          return {xx, yy}
       }
    }
    Salin selepas log masuk

可能的追问

Vue.extend方法你用过吗?它能用来做组件扩展吗?


知其所以然

mixins原理:

  • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/apiCreateApp.ts#L232-L233

  • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/componentOptions.ts#L545

slots原理:

  • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/componentSlots.ts#L129-L130

  • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/renderer.ts#L1373-L1374

  • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/helpers/renderSlot.ts#L23-L24


06-子组件可以直接改变父组件的数据么,说明原因

分析

这是一个实践知识点,组件化开发过程中有个单项数据流原则,不在子组件中修改父组件是个常识问题。

参考文档:https://staging.vuejs.org/guide/components/props.html#one-way-data-flow


思路

  • 讲讲单项数据流原则,表明为何不能这么做

  • 举几个常见场景的例子说说解决方案

  • 结合实践讲讲如果需要修改父组件状态应该如何做


回答范例

  • 所有的 prop 都使得其父子之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。另外,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器控制台中发出警告。

    const props = defineProps([&#39;foo&#39;])
    // ❌ 下面行为会被警告, props是只读的!
    props.foo = &#39;bar&#39;
    Salin selepas log masuk
  • 实际开发过程中有两个场景会想要修改一个属性:

    • **这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。**在这种情况下,最好定义一个本地的 data,并将这个 prop 用作其初始值:

      const props = defineProps([&#39;initialCounter&#39;])
      const counter = ref(props.initialCounter)
      Salin selepas log masuk
    • **这个 prop 以一种原始的值传入且需要进行转换。**在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

      const props = defineProps([&#39;size&#39;])
      // prop变化,计算属性自动更新
      const normalizedSize = computed(() => props.size.trim().toLowerCase())
      Salin selepas log masuk
  • 实践中如果确实想要改变父组件属性应该emit一个事件让父组件去做这个变更。注意虽然我们不能直接修改一个传入的对象或者数组类型的prop,但是我们还是能够直接改内嵌的对象或属性。


07-Vue要做权限管理该怎么做?控制到按钮级别的权限怎么做?

分析

综合实践题目,实际开发中经常需要面临权限管理的需求,考查实际应用能力。

权限管理一般需求是两个:页面权限和按钮权限,从这两个方面论述即可。

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)


思路

  • 权限管理需求分析:页面和按钮权限

  • 权限管理的实现方案:分后端方案和前端方案阐述

  • 说说各自的优缺点


回答范例

  • 权限管理一般需求是页面权限按钮权限的管理

  • 具体实现的时候分后端和前端两种方案:

    前端方案会把所有路由信息在前端配置,通过路由守卫要求用户登录,用户登录后根据角色过滤出路由表。比如我会配置一个asyncRoutes数组,需要认证的页面在其路由的meta中添加一个roles字段,等获取用户角色之后取两者的交集,若结果不为空则说明可以访问。此过滤过程结束,剩下的路由就是该用户能访问的页面,最后通过router.addRoutes(accessRoutes)方式动态添加路由即可。

    后端方案会把所有页面路由信息存在数据库中,用户登录的时候根据其角色查询得到其能访问的所有页面路由信息返回给前端,前端再通过addRoutes动态添加路由信息

    按钮权限的控制通常会实现一个指令,例如v-permission将按钮要求角色通过值传给v-permission指令,在指令的moutned钩子中可以判断当前用户角色和按钮是否存在交集,有则保留按钮,无则移除按钮。

  • 纯前端方案的优点是实现简单,不需要额外权限管理页面,但是维护起来问题比较大,有新的页面和角色需求就要修改前端代码重新打包部署;服务端方案就不存在这个问题,通过专门的角色和权限管理页面,配置页面和按钮权限信息到数据库,应用每次登陆时获取的都是最新的路由信息,可谓一劳永逸!


知其所以然

路由守卫

https://github1s.com/PanJiaChen/vue-element-admin/blob/HEAD/src/permission.js#L13-L14

路由生成

https://github1s.com/PanJiaChen/vue-element-admin/blob/HEAD/src/store/modules/permission.js#L50-L51

动态追加路由

https://github1s.com/PanJiaChen/vue-element-admin/blob/HEAD/src/permission.js#L43-L44


可能的追问

  • 类似Tabs这类组件能不能使用v-permission指令实现按钮权限控制?

    <el-tabs> 
      <el-tab-pane label="⽤户管理" name="first">⽤户管理</el-tab-pane> 
    	<el-tab-pane label="⻆⾊管理" name="third">⻆⾊管理</el-tab-pane>
    </el-tabs>
    Salin selepas log masuk
  • 服务端返回的路由信息如何添加到路由器中?

    // 前端组件名和组件映射表
    const map = {
      //xx: require(&#39;@/views/xx.vue&#39;).default // 同步的⽅式
      xx: () => import(&#39;@/views/xx.vue&#39;) // 异步的⽅式
    }
    // 服务端返回的asyncRoutes
    const asyncRoutes = [
      { path: &#39;/xx&#39;, component: &#39;xx&#39;,... }
    ]
    // 遍历asyncRoutes,将component替换为map[component]
    function mapComponent(asyncRoutes) {
      asyncRoutes.forEach(route => {
        route.component = map[route.component];
        if(route.children) {
          route.children.map(child => mapComponent(child))
        }
    	})
    }
    mapComponent(asyncRoutes)
    Salin selepas log masuk

08 - 说一说你对vue响应式理解?

分析

这是一道必问题目,但能回答到位的比较少。如果只是看看一些网文,通常没什么底气,经不住面试官推敲,但像我们这样即看过源码还造过轮子的,回答这个问题就会比较有底气啦。

答题思路:

  • 啥是响应式?

  • 为什么vue需要响应式?

  • 它能给我们带来什么好处?

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

  • vue3中的响应式的新变化


回答范例:

  • 所谓数据响应式就是能够使数据变化可以被检测并对这种变化做出响应的机制

  • MVVM框架中要解决的一个核心问题是连接数据层和视图层,通过数据驱动应用,数据变化,视图更新,要做到这点的就需要对数据做响应式处理,这样一旦数据发生变化就可以立即做出更新处理。

  • Mengambil vue sebagai contoh, melalui responsif data ditambah DOM maya dan algoritma tampalan, pembangun hanya perlu mengendalikan data dan mengambil berat tentang perniagaan, tanpa perlu berurusan dengan operasi DOM yang menyusahkan, sekali gus meningkatkan kecekapan pembangunan. ., Kurangkan kesukaran pembangunan.

  • Respons data dalam vue2 akan diproses secara berbeza mengikut jenis data Jika ia adalah objek , gunakan Object.defineProperty() untuk menentukan pemintasan data. Apabila data diakses atau diubah, kami merasakan dan bertindak balas; jika ia adalah tatasusunan , kami mengatasi 7 kaedah perubahan prototaip objek tatasusunan supaya kaedah ini boleh memberikan pemberitahuan kemas kini tambahan dan bertindak balas. Mekanisme ini menyelesaikan masalah responsif data dengan sangat baik, tetapi ia juga mempunyai beberapa kelemahan dalam penggunaan sebenar: contohnya, rekursif traversal semasa permulaan akan menyebabkan kehilangan prestasi apabila menambah atau memadam atribut, pengguna perlu menggunakan Vue.set/delete sahaja API khas boleh berkuat kuasa masalah seperti struktur data Peta dan Set baharu yang dijana dalam es6 tidak disokong.

  • Untuk menyelesaikan masalah ini, vue3 telah menulis semula bahagian pelaksanaan ini: menggunakan proksi Proksi ES6 untuk bertindak balas kepada data, ia mempunyai banyak faedah, pengalaman pengaturcaraan adalah konsisten, tidak perlu Menggunakan API khas, prestasi permulaan dan penggunaan memori telah dipertingkatkan dengan banyaknya, kerana kod pelaksanaan responsif diekstrak ke dalam pakej kereaktifan bebas, kami boleh menggunakannya dengan lebih fleksibel, dan sambungan pihak ketiga lebih fleksibel untuk dibangunkan.


Tahu sebabnya

responsif vue2:

  • https://github1s.com/vuejs/vue/blob/HEAD/src/core/observer/index.js#L135-L136

vue3 responsif:

  • https://github1s.com/vuejs/core/blob/HEAD/packages/reactivity/src/reactive.ts#L89-L90

  • https:/ /github1s.com/vuejs/core/blob/HEAD/packages/reactivity/src/ref.ts#L67-L68


09 - kata Beritahu saya anda pemahaman tentang DOM maya?

Analisis

Hampir semua rangka kerja sedia ada memperkenalkan DOM maya untuk mengabstraksikan DOM sebenar, iaitu apa yang semua orang tahu sekarang VNode dan VDOM , jadi mengapa kita perlu memperkenalkan DOM maya? Jawab sahaja soalan ini!

Idea

  • Apakah itu vdom

  • Faedah memperkenalkan vdom

  • Cara vdom dijana dan bagaimana ia menjadi dom

  • Peranan

    dalam perbezaan seterusnya

Contoh jawapan

  • JavaScriptDom maya, seperti namanya, ialah objek dom maya, yang dengan sendirinya ialah objek

    , tetapi Ia menerangkan struktur pandangan melalui atribut yang berbeza.
  • Dengan memperkenalkan vdom kita boleh mendapat faedah berikut:

    Abstrak nod elemen sebenar ke dalam VNode, mengurangkan bilangan operasi dom langsung secara berkesan, dengan itu menambah baik program prestasi

    • Terdapat pengehadan untuk mengendalikan dom secara langsung, seperti operasi diff, klon dan lain-lain. Terdapat banyak kandungan pada elemen sebenar jika anda melakukan operasi diff padanya secara langsung, perbezaan tambahan akan dibuat dengan cara yang sama, jika anda perlu mengklon, anda perlu menyalin semua kandungannya, yang tidak perlu. Walau bagaimanapun, jika anda mengalihkan operasi ini ke objek JavaScript, ia menjadi lebih mudah.
    • Mengendalikan DOM ialah operasi DOM yang kerap dengan mudah boleh menyebabkan lukisan semula halaman dan pengaliran semula Walau bagaimanapun, melalui VNode abstrak untuk pemprosesan perantaraan, bilangan operasi DOM langsung boleh dikurangkan dengan berkesan, dengan itu mengurangkan lukisan semula halaman dan. pengaliran semula.

    Memudahkan pelaksanaan merentas platform

    • Nod VNod yang sama boleh diberikan kepada kandungan yang sepadan pada platform yang berbeza, contohnya: pemaparan dalam penyemak imbas ialah nod Elemen dom diberikan kepada kawalan yang sepadan dalam Native (iOS, Android), yang boleh melaksanakan SSR, menghasilkan ke dalam WebGL, dsb.
    • Vue3 membolehkan pembangun melaksanakan pemapar tersuai berdasarkan VNode untuk memudahkan Rendering untuk platform yang berbeza .
  • Bagaimana untuk menjana vdom? Dalam vue, kami sering menulis templat untuk komponen Templat ini akan disusun menjadi fungsi pemaparan oleh pengkompil Dalam proses pemasangan seterusnya, fungsi pemaparan akan dipanggil, dan objek yang dikembalikan ialah dom maya. Tetapi mereka bukan DOM sebenar lagi, jadi mereka akan ditukar lagi menjadi DOM dalam proses tampalan seterusnya.

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)

  • Selepas proses pemasangan selesai, program vue memasuki proses kemas kini. Jika beberapa data responsif berubah, ia akan menyebabkan komponen dipaparkan semula Pada masa ini, vdom baharu akan dijana dan perubahan akan diperoleh dengan membezakan hasil pemaparan terakhir, sekali gus menukarnya kepada jumlah minimum DOM. operasi dan kemas kini yang cekap.

Tahu sebabnya

definisi vnode: <🎜>

https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/vnode.ts#L127-L128

Perhatikan fungsi pemaparan: 21-vdom/test - render-v3.html

Buat vnode:

  • createElementBlock:

https://github1s.com/vuejs/core/blob/HEAD / packages/runtime-core/src/vnode.ts#L291-L292

  • createVnode:

https://github1s.com/vuejs/core/blob/ HEAD /packages/runtime-core/src/vnode.ts#L486-L487

  • Masa panggilan pertama:

https://github1s.com/vuejs/core / blob/HEAD/packages/runtime-core/src/apiCreateApp.ts#L283-L284


lekapkan:

https://github1s.com/vuejs/core/blob / HEAD/packages/runtime-core/src/renderer.ts#L1171-L1172

Nyahpepijat proses pemasangan: mountComponent

21-vdom/test-render-v3.html


10 - Adakah anda faham algoritma diff?

Analisis

Soalan yang diperlukan, yang melibatkan prinsip kemas kini Vue, secara perbandingan menguji kedalaman pemahaman.

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)


Berfikir

  • Apakah yang dilakukan oleh algoritma diff

  • Keperluan itu

  • Apabila ia dilaksanakan

  • Kaedah pelaksanaan khusus

  • Lebih tinggi: Mari kita bincangkan tentang pengoptimuman dalam vue3


Contoh jawapan

1. Algoritma diff dalam Vue dipanggil algoritma tampalan, yang diubah suai daripada Snabbdom Jika DOM maya hendak ditukar kepada DOM sebenar, ia perlu ditukar melalui kaedah tampalan.

2 Pada mulanya, setiap kebergantungan dalam paparan Vue1.x mempunyai fungsi kemas kini yang sepadan dengannya, yang boleh dikemas kini dengan tepat, DOM maya dan sokongan algoritma penampalan tidak diperlukan Vue1.x tidak dapat membawa aplikasi yang lebih besar; dalam Vue 2.x, untuk mengurangkan butiran Watcher, setiap komponen hanya mempunyai satu Watcher yang sepadan dengannya mengubah dan mengemas kininya dengan cekap.

3 Saat diff dilaksanakan dalam Vue ialah apabila data responsif berubah dalam komponen mencetuskan contoh untuk melaksanakan fungsi kemas kininya. dan kemudian laksanakan fungsi tampalan dan masukkan Bandingkan DOM maya lama dan baharu untuk mencari perubahan, dan akhirnya menukarnya kepada operasi DOM yang sepadan.

4. Proses tampalan ialah proses rekursif, mengikut strategi perbandingan depth-first, sama lapisan; adalah daripada jenis yang sama, jika berbeza, padam dan buat semula

    Jika kedua-dua belah adalah teks, kemas kini kandungan teks
  • Jika kedua-dua belah nod elemen, kemas kini elemen anak secara rekursif dan kemas kini atribut elemen pada masa yang sama
  • Terdapat beberapa situasi semasa mengemas kini nod anak:
  • Jika nod anak baharu ialah teks, jika nod anak lama ialah tatasusunan, ia akan dikosongkan dan teks akan ditetapkan;
    • Jika nod anak baharu ialah teks, Jika nod anak lama ialah teks, kemas kini teks secara terus
    • Jika nod anak baharu ialah tatasusunan, jika nod anak lama ialah teks, kosongkan teks dan cipta elemen anak dalam tatasusunan nod kanak-kanak baharu >Nod anak baharu ialah tatasusunan, dan nod anak lama juga tatasusunan, kemudian bandingkan dua set nod anak dan kemas kini butiran blabla
    • 5. Kemas kini strategi yang diperkenalkan dalam vue3: Susun secara berkala mengoptimumkan patchFlag, blok, dsb.


Tahu sebabnya


kod kunci tampalanhttps: //github1s.com/vuejs/core/blob/HEAD/packages/runtime- core/src/renderer.ts#L354-L355

Nyahpepijat test-v3.html

11 - Apakah ciri baharu vue3 yang anda tahu


Analisis

Ciri baharu yang paling penting yang disenaraikan di tapak web rasmi: https ://v3-migration.vuejs.org/

Iaitu, yang berikut:

20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)API Komposisi

gula sintaks API Komposisi SFC

    Portal Teleport
  • serpihan serpihan
  • Mengeluarkan pilihan
  • Penyampai tersuai
  • Pembolehubah CSS SFC
  • Suspense
  • Di atas ialah API berkaitan, dan terdapat banyak ciri rangka kerja yang tidak boleh ditinggalkan.

Contoh jawapan


1. Ciri baharu Vue3 pada tahap api terutamanya termasuk: API Komposisi, sintaks API Komposisi SFC gula, Pintu penghantaran Teleport, Serpihan, Pilihan Pancaran, pemapar tersuai, pembolehubah CSS SFC, Suspense2 Selain itu, Vue3.0 juga mempunyai banyak peningkatan yang menarik perhatian pada peringkat rangka kerja: <🎜. >

Lebih pantas

Penulisan semula DOM maya

Pengoptimuman pengkompil: promosi statik, patchFlags, blok, dll.
  • Sistem responsif berasaskan proksi
    • < .
  • Tahu sebabnya
  • Alami pengoptimuman pengkompil
      • https://sfc.vuejs.org/

      pelaksanaan reaktif

      • https://github1s .com/vuejs/core/blob/HEAD/packages/reactivity/src/reactive.ts#L90-L91


      12 - Bagaimana untuk menentukan penghalaan dinamik? Bagaimana untuk mendapatkan parameter dinamik yang diluluskan?

      Analisis

      Soalan API, menguji kebolehan asas, tiada kesilapan dibenarkan, cuba sedetail mungkin.

      Idea

      • Apakah itu penghalaan dinamik

      • Bila hendak digunakan ia Penghalaan dinamik, bagaimana untuk mentakrifkan penghalaan dinamik

      • Bagaimana untuk mendapatkan parameter

      • Butiran dan langkah berjaga-jaga


      Contoh jawapan

      • Banyak kali, kita perlu memetakan laluan untuk corak padanan yang diberikan kepada yang sama komponen, dalam kes ini penghalaan dinamik perlu ditakrifkan.

      • Sebagai contoh, kami mungkin mempunyai komponen User yang sepatutnya diberikan kepada semua pengguna, tetapi dengan ID pengguna yang berbeza. Dalam Vue Router, kita boleh menggunakan medan dinamik dalam laluan untuk mencapai ini, contohnya: { path: &#39;/users/:id&#39;, component: User }, dengan :id ialah parameter laluan

      • parameter laluan Diwakili oleh kolon :. Apabila laluan dipadankan, nilai paramnya akan didedahkan sebagai this.$route.params dalam setiap komponen.

      • juga boleh mempunyai berbilang parameter, seperti /users/:username/posts/:postId; sebagai tambahan kepada $route.params, objek $route juga mendedahkan maklumat berguna lain, seperti $route.query, $route.hash Tunggu.


      Soalan yang mungkin

      • Bagaimana untuk bertindak balas kepada perubahan dalam parameter penghalaan dinamik

      https ://router.vuejs.org/zh/guide/essentials/dynamic-matching.html#Respons kepada perubahan dalam parameter penghalaan

      • Bagaimana kami mengendalikan penghalaan 404 Not Found

      https://router.vuejs.org/zh/guide/essentials/dynamic-matching.html#Tangkap semua laluan atau -404-not-found-routes


      13-Jika anda diminta untuk menulis laluan vue dari awal, bercakap tentang idea anda

      Analisis fikir:

      Mula-mula fikirkan masalah yang perlu diselesaikan oleh penghalaan vue: apabila pengguna mengklik pada pautan lompat untuk menukar kandungan, halaman itu tidak dimuatkan semula.

      • Gunakan cincangan atau api sejarah untuk merealisasikan halaman lompat url tanpa menyegarkan
      • Pada masa yang sama, dengar acara perubahan hash atau acara popstate untuk memproses lompatan
      • Menurut nilai cincang atau nilai keadaan daripada Padankan komponen yang sepadan dalam jadual laluan dan jadikannya

      Contoh jawapan:

      Penghalaan aplikasi SPA perlu diselesaikan Masalahnya ialah kandungan lompat halaman berubah tanpa menyegarkan , dan laluan itu juga perlu wujud dalam bentuk pemalam, jadi:

      • Mula-mula saya akan mentakrifkan fungsi createRouter, Kembali ke tika penghala dan lakukan beberapa perkara di dalam contoh:

        • Simpan item konfigurasi yang dihantar oleh pengguna
        • Dengar acara cincang atau popstate
        • Padankan yang sepadan mengikut laluan dalam Penghalaan panggil balik
      • mentakrifkan penghala sebagai palam Vue -in, yang melaksanakan kaedah pemasangan dan melakukan dua perkara secara dalaman:

        • melaksanakan dua komponen global: pautan penghala dan paparan penghala melaksanakan lompat halaman dan paparan kandungan masing-masing
        • Tentukan dua pembolehubah global: $route dan $router Jalan semasa dan contoh penghala boleh diakses dalam komponen

      Tahu sebabnya: <🎜. >

        Cara createRouter mencipta tika
      https ://github1s.com/vuejs/router/blob/HEAD/src/router.ts#L355 -L356

        Mendengar acara
      https://github1s com/vuejs/router/blob/HEAD/src/history/html5.ts#L314-L315<. 🎜>

      RouterView

      Page JumpRouterLink
      • https://github1s.com/vuejs/router/blob/HEAD/src/RouterLink.ts#L184- L185

      Paparan kandungan RouterView
      • https:// github1s.com/vuejs/router/blob/HEAD/src/RouterView.ts#L43-L44


      14-Bolehkah anda bercakap tentang peranan kunci?

      Analisis: Ini adalah soalan yang sangat biasa, yang menguji penguasaan semua orang tentang DOM maya dan butiran tampung tahap kefahaman penemuduga.

      Analisis idea:

        Kesimpulannya diberi bahawa peranan kunci adalah untuk mengoptimumkan prestasi tampalan
      • Keperluan kunci
      • Penggunaan sebenar
      • Ringkasan: Cara menilai vue boleh diterangkan daripada sumber tahap kod Sama ada dua nod adalah sama

      回答范例:

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

      • vue在patch过程中判断两个节点是否是相同节点是key是一个必要条件,渲染一组列表时,key往往是唯一标识,所以如果不定义key的话,vue只能认为比较的两个节点是同一个,哪怕它们实际上不是,这导致了频繁更新元素,使得整个patch过程比较低效,影响性能。

      • 实际使用中在渲染一组列表时key必须设置,而且必须是唯一标识,应该避免使用数组索引作为key,这可能导致一些隐蔽的bug;vue中在使用相同标签元素过渡切换时,也会使用key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

      • 从源码中可以知道,vue判断两个节点是否相同时主要判断两者的key和元素类型等,因此如果不设置key,它的值就是undefined,则可能永远认为这是两个相同节点,只能去做更新操作,这造成了大量的dom更新操作,明显是不可取的。


      知其所以然

      测试代码,test-v3.html

      上面案例重现的是以下过程

      20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)

      不使用key

      20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)


      如果使用key

      // 首次循环patch A
      A B C D E
      A B F C D E
      
      // 第2次循环patch B
      B C D E
      B F C D E
      
      // 第3次循环patch E
      C D E
      F C D E
      
      // 第4次循环patch D
      C D
      F C D
      
      // 第5次循环patch C
      C 
      F C
      
      // oldCh全部处理结束,newCh中剩下的F,创建F并插入到C前面
      Salin selepas log masuk
      Salin selepas log masuk

      源码中找答案:

      判断是否为相同节点

      https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/vnode.ts#L342-L343

      更新时的处理

      https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/renderer.ts#L1752-L1753


      不使用key

      20 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)

      如果使用key

      // 首次循环patch A
      A B C D E
      A B F C D E
      
      // 第2次循环patch B
      B C D E
      B F C D E
      
      // 第3次循环patch E
      C D E
      F C D E
      
      // 第4次循环patch D
      C D
      F C D
      
      // 第5次循环patch C
      C 
      F C
      
      // oldCh全部处理结束,newCh中剩下的F,创建F并插入到C前面
      Salin selepas log masuk
      Salin selepas log masuk

      源码中找答案:

      判断是否为相同节点

      https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/vnode.ts#L342-L343

      更新时的处理

      https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/renderer.ts#L1752-L1753


      15-说说nextTick的使用和原理?

      分析

      这道题及考察使用,有考察原理,nextTick在开发过程中应用的也较少,原理上和vue异步更新有密切关系,对于面试者考查很有区分度,如果能够很好回答此题,对面试效果有极大帮助。

      答题思路

      • nextTick是做什么的?

      • 为什么需要它呢?

      • 开发时何时使用它?抓抓头,想想你在平时开发中使用它的地方

      • 下面介绍一下如何使用nextTick

      • 原理解读,结合异步更新和nextTick生效方式,会显得你格外优秀


      回答范例:

      1、nextTick是等待下一次 DOM 更新刷新的工具方法。

      2、Vue有个异步更新策略,意思是如果数据变化,Vue不会立刻更新DOM,而是开启一个队列,把组件更新函数保存在队列中,在同一事件循环中发生的所有数据变更会异步的批量更新。这一策略导致我们对数据的修改不会立刻体现在DOM上,此时如果想要获取更新后的DOM状态,就需要使用nextTick。

      3、开发时,有两个场景我们会用到nextTick:

      • created中想要获取DOM时;

      • 响应式数据变化后获取DOM更新后的状态,比如希望获取列表更新后的高度。

      4、nextTick签名如下:function nextTick(callback?: () => void): Promise<void>

      所以我们只需要在传入的回调函数中访问最新DOM状态即可,或者我们可以await nextTick()方法返回的Promise之后做这件事。

      5、在Vue内部,nextTick之所以能够让我们看到DOM更新后的结果,是因为我们传入的callback会被添加到队列刷新函数(flushSchedulerQueue)的后面,这样等队列内部的更新函数都执行完毕,所有DOM操作也就结束了,callback自然能够获取到最新的DOM值。


      知其所以然:

      • 源码解读:

      组件更新函数入队:

      https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/renderer.ts#L1547-L1548

      入队函数:

      https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/scheduler.ts#L84-L85

      nextTick定义:

      https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/scheduler.ts#L58-L59

      • 测试案例,test-v3.html


      16-watch和computed的区别以及选择?

      两个重要API,反应应聘者熟练程度。

      思路分析

      • 先看computed, watch两者定义,列举使用上的差异

      • 列举使用场景上的差异,如何选择

      • 使用细节、注意事项

      • vue3变化


      computed特点:具有响应式的返回值

      const count = ref(1)
      const plusOne = computed(() => count.value + 1)
      Salin selepas log masuk

      watch特点:侦测变化,执行回调

      const state = reactive({ count: 0 })
      watch(
        () => state.count,
        (count, prevCount) => {
          /* ... */
        }
      )
      Salin selepas log masuk

      回答范例

      • 计算属性可以从组件数据派生出新数据,最常见的使用方式是设置一个函数,返回计算之后的结果,computed和methods的差异是它具备缓存性,如果依赖项不变时不会重新计算。侦听器可以侦测某个响应式数据的变化并执行副作用,常见用法是传递一个函数,执行副作用,watch没有返回值,但可以执行异步操作等复杂逻辑。

      • 计算属性常用场景是简化行内模板中的复杂表达式,模板中出现太多逻辑会是模板变得臃肿不易维护。侦听器常用场景是状态变化之后做一些额外的DOM操作或者异步操作。选择采用何用方案时首先看是否需要派生出新值,基本能用计算属性实现的方式首选计算属性。

      • 使用过程中有一些细节,比如计算属性也是可以传递对象,成为既可读又可写的计算属性。watch可以传递对象,设置deep、immediate等选项。

      • vue3中watch选项发生了一些变化,例如不再能侦测一个点操作符之外的字符串形式的表达式; reactivity API中新出现了watch、watchEffect可以完全替代目前的watch选项,且功能更加强大。


      可能追问

      • watch会不会立即执行?

      • watch 和 watchEffect有什么差异


      知其所以然

      computed的实现

      • https://github1s.com/vuejs/core/blob/HEAD/packages/reactivity/src/computed.ts#L79-L80

      ComputedRefImpl

      • https://github1s.com/vuejs/core/blob/HEAD/packages/reactivity/src/computed.ts#L26-L27

      缓存性

      • https://github1s.com/vuejs/core/blob/HEAD/packages/reactivity/src/computed.ts#L59-L60

      • https://github1s.com/vuejs/core/blob/HEAD/packages/reactivity/src/computed.ts#L45-L46

      watch的实现

      • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/apiWatch.ts#L158-L159


      17-说一下 Vue 子组件和父组件创建和挂载顺序

      这题考查大家对创建过程的理解程度。

      思路分析

      • 给结论

      • 阐述理由


      回答范例

      • 创建过程自上而下,挂载过程自下而上;即:

        • parent created
        • child created
        • child mounted
        • parent mounted
      • 之所以会这样是因为Vue创建过程是一个递归过程,先创建父组件,有子组件就会创建子组件,因此创建时先有父组件再有子组件;子组件首次创建时会添加mounted钩子到队列,等到patch结束再执行它们,可见子组件的mounted钩子是先进入到队列中的,因此等到patch结束执行这些钩子时也先执行。


      知其所以然

      观察beforeCreated和created钩子的处理

      • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/componentOptions.ts#L554-L555

      • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/componentOptions.ts#L741-L742

      观察beforeMount和mounted钩子的处理

      • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/renderer.ts#L1310-L1311

      测试代码,test-v3.html


      18-怎么缓存当前的组件?缓存后怎么更新?

      缓存组件使用keep-alive组件,这是一个非常常见且有用的优化手段,vue3中keep-alive有比较大的更新,能说的点比较多。

      思路

      • 缓存用keep-alive,它的作用与用法

      • 使用细节,例如缓存指定/排除、结合router和transition

      • 组件缓存后更新可以利用activated或者beforeRouteEnter

      • 原理阐述


      回答范例

      • 开发中缓存组件使用keep-alive组件,keep-alive是vue内置组件,keep-alive包裹动态组件component时,会缓存不活动的组件实例,而不是销毁它们,这样在组件切换过程中将状态保留在内存中,防止重复渲染DOM。

        <keep-alive>
          <component :is="view"></component>
        </keep-alive>
        Salin selepas log masuk
      • 结合属性include和exclude可以明确指定缓存哪些组件或排除缓存指定组件。vue3中结合vue-router时变化较大,之前是keep-alive包裹router-view,现在需要反过来用router-view包裹keep-alive

        <router-view v-slot="{ Component }">
          <keep-alive>
            <component :is="Component"></component>
          </keep-alive>
        </router-view>
        Salin selepas log masuk
      • 缓存后如果要获取数据,解决方案可以有以下两种:

        • beforeRouteEnter:在有vue-router的项目,每次进入路由的时候,都会执行beforeRouteEnter

          beforeRouteEnter(to, from, next){
            next(vm=>{
              console.log(vm)
              // 每次进入路由执行
              vm.getData()  // 获取数据
            })
          },
          Salin selepas log masuk
        • actived:在keep-alive缓存的组件被激活的时候,都会执行actived钩子

          activated(){
          	  this.getData() // 获取数据
          },
          Salin selepas log masuk
          • keep-alive是一个通用组件,它内部定义了一个map,缓存创建过的组件实例,它返回的渲染函数内部会查找内嵌的component组件对应组件的vnode,如果该组件在map中存在就直接返回它。由于component的is属性是个响应式数据,因此只要它变化,keep-alive的render函数就会重新执行。


          知其所以然

          KeepAlive定义

          • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/components/KeepAlive.ts#L73-L74

          缓存定义

          • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/components/KeepAlive.ts#L102-L103

          缓存组件

          • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/components/KeepAlive.ts#L215-L216

          获取缓存组件

          • https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/components/KeepAlive.ts#L241-L242

          测试缓存特性,test-v3.html


          19-从0到1自己构架一个vue项目,说说有哪些步骤、哪些重要插件、目录结构你会怎么组织

          综合实践类题目,考查实战能力。没有什么绝对的正确答案,把平时工作的重点有条理的描述一下即可。

          思路

          • 构建项目,创建项目基本结构

          • 引入必要的插件:

          • 代码规范:prettier,eslint

          • 提交规范:husky,lint-staged

          • 其他常用:svg-loader,vueuse,nprogress

          • 常见目录结构


          回答范例

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

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

          • 接下来引入必要插件:路由插件vue-router、状态管理vuex/pinia、ui库我比较喜欢element-plus和antd-vue、http工具我会选axios

          • 其他比较常用的库有vueuse,nprogress,图标可以使用vite-svg-loader

          • 下面是代码规范:结合prettier和eslint即可

          • 最后是提交规范,可以使用husky,lint-staged,commitlint


          • 目录结构我有如下习惯:.vscode:用来放项目中的 vscode 配置

            plugins:用来放 vite 插件的 plugin 配置

            public:用来放一些诸如 页头icon 之类的公共文件,会被打包到dist根目录下

            src:用来放项目代码文件

            api:用来放http的一些接口配置

            assets:用来放一些 CSS 之类的静态资源

            components:用来放项目通用组件

            layout:用来放项目的布局

            router:用来放项目的路由配置

            store:用来放状态管理Pinia的配置

            utils:用来放项目中的工具方法类

            views:用来放项目的页面文件


          20-实际工作中,你总结的vue最佳实践有哪些?

          看到这样的题目,可以用以下图片来回答:

          120 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)


          思路

          查看vue官方文档:

          风格指南:https://vuejs.org/style-guide/

          性能:https://vuejs.org/guide/best-practices/performance.html#overview

          安全:https://vuejs.org/guide/best-practices/security.html

          访问性:https://vuejs.org/guide/best-practices/accessibility.html

          发布:https://vuejs.org/guide/best-practices/production-deployment.html


          回答范例

          我从编码风格、性能、安全等方面说几条:

          • 编码风格方面:

            • 命名组件时使用“多词”风格避免和HTML元素冲突
            • 使用“细节化”方式定义属性而不是只有一个属性名
            • 属性名声明时使用“驼峰命名”,模板或jsx中使用“肉串命名”
            • 使用v-for时务必加上key,且不要跟v-if写在一起
          • 性能方面:

            • 路由懒加载减少应用尺寸
            • 利用SSR减少首屏加载时间
            • 利用v-once渲染那些不需要更新的内容
            • 一些长列表可以利用虚拟滚动技术避免内存过度占用
            • 对于深层嵌套对象的大数组可以使用shallowRef或shallowReactive降低开销
            • 避免不必要的组件抽象
          • 安全:

            • 不使用不可信模板,例如使用用户输入拼接模板:template: <div> + userProvidedString + </div>
            • Gunakan v-html, :url, :style, dsb. dengan berhati-hati untuk mengelakkan suntikan html, url, style, dll.
          • dll.. ....


          21 - Secara ringkas beritahu saya pemahaman anda tentang vuex?

          120 soalan temu bual klasik Vue (dengan penjelasan peringkat kod sumber terperinci)

          Pemikiran

          • Berikan definisi

          • Penjelasan tentang keperluan

          • Bila hendak menggunakannya

          • Peluasan: beberapa pemikiran peribadi, pengalaman praktikal, dsb.


          Contoh

          • Vuex ialah perisian yang dibangunkan khusus untuk aplikasi Vue.js Perpustakaan corak pengurusan negeri . Ia menggunakan storan terpusat untuk mengurus status semua komponen aplikasi dan menggunakan peraturan yang sepadan untuk memastikan status berubah dengan cara yang boleh diramal.

          • Kami berharap untuk mengurus aplikasi dengan cara "aliran data sehala" yang mudah, iaitu, operasi gelung sehala -> Tetapi apabila aplikasi kami menemui keadaan perkongsian berbilang komponen, contohnya: berbilang paparan bergantung pada keadaan yang sama atau tindakan daripada pandangan berbeza perlu menukar keadaan yang sama. Kesederhanaan aliran data sehala boleh dipecahkan dengan mudah pada ketika ini. Oleh itu, adalah perlu bagi kita untuk mengekstrak keadaan kongsi komponen dan mengurusnya dalam mod tunggal global. Dengan mentakrifkan dan mengasingkan pelbagai konsep dalam pengurusan negeri dan mengekalkan kebebasan antara pandangan dan negeri dengan menguatkuasakan peraturan, kod kami akan menjadi lebih tersusun dan boleh dikekalkan. Ini adalah keperluan untuk kewujudan vuex Ia adalah konsep yang sama seperti redux dalam ekosistem tindak balas.

          • Vuex memperkenalkan banyak konsep semasa menyelesaikan pengurusan keadaan: seperti keadaan, mutasi, tindakan, dll. Sama ada ia perlu diperkenalkan perlu diukur berdasarkan situasi sebenar aplikasi: Jika anda tidak bercadang untuk membangunkan berskala besar Untuk aplikasi satu halaman, menggunakan Vuex adalah menyusahkan dan berlebihan mod kedai yang ringkas sudah memadai. Walau bagaimanapun, jika anda ingin membina aplikasi satu halaman sederhana hingga besar, Vuex pada asasnya adalah standard.

          • Saya berasa sedikit blabla semasa menggunakan vuex


          Soalan yang mungkin

          • Adakah terdapat sebarang kelemahan pada vuex? Adakah anda menghadapi sebarang masalah semasa pembangunan?

          • Apakah perbezaan antara tindakan dan mutasi? Mengapa membezakan mereka?


          22-Bercakap tentang proses daripada templat untuk dipaparkan

          Analisis

          Bertanya kepada kami tentang proses daripada templat kepada pemaparan sebenarnya menanyakan tentang cara vue compiler<code>编译器 berfungsi.

          Idea

          • Memperkenalkan konsep vue compiler

          • Penjelasan kompilasi Keperluan pengkompil

          • Terangkan aliran kerja pengkompil

          Jawapan contoh

          • Terdapat modul pengkompil unik dalam Vue, yang dipanggil "pengkompil".

          • Sebab proses penyusunan ini diperlukan adalah untuk memudahkan pengaturcara bahagian hadapan menulis templat paparan dengan cekap. Sebagai perbandingan, kami masih lebih suka menggunakan HTML untuk menulis paparan, yang intuitif dan cekap. Fungsi render tulisan tangan bukan sahaja tidak cekap, tetapi juga kehilangan keupayaan pengoptimuman masa kompilasi.

          • Dalam Vue, pengkompil akan menghuraikan templat terlebih dahulu. Selepas penghujung, objek JS akan diperolehi melaksanakan AST Dalam proses penukaran pemprosesan dalam, langkah ini dipanggil transform, dan akhirnya AST yang diperoleh sebelum ini dijana ke dalam kod JS, iaitu fungsi render.

          Tahu sebabnya

          Pengintipan proses kompilasi Vue3:

          • https ://github1s.com/vuejs/core/blob/HEAD/packages/compiler-core/src/compile.ts#L61-L62

          Ujian, test-v3.html

          Soalan yang mungkin

          • Bilakah pengkompil dilaksanakan dalam Vue?

          • Adakah React mempunyai pengkompil?


          23-Apakah yang berlaku semasa pemasangan contoh Vue?

          Analisis

          Proses pemasangan melengkapkan dua perkara paling penting:

          • Inisialisasi

          • Tubuhkan mekanisme kemas kini

          Cuma jelaskan dua perkara ini!

          Contoh jawapan

          • Proses pelekap merujuk kepada proses app.mount() Dalam proses ini, dua perkara dilakukan secara keseluruhan: Permulaan dan Mewujudkan mekanisme kemas kini<.>

          • Inisialisasi akan mencipta contoh komponen, memulakan status komponen dan mencipta pelbagai data responsif

          • Mewujudkan mekanisme kemas kini akan melaksanakan komponen dengan serta-merta Fungsi kemas kini akan melaksanakan fungsi pemaparan komponen untuk kali pertama dan melaksanakan tampalan untuk menukar vnod yang diperoleh sebelum ini kepada dom pada masa yang sama, melaksanakan fungsi pemaparan untuk kali pertama akan mewujudkan pergantungan antara data responsif dalamannya dan fungsi kemas kini komponen, yang akan menyebabkan perubahan data masa hadapan Fungsi kemas kini yang sepadan akan dilaksanakan.

          Tahu sebabnya

          • Kod ujian, test-v3.html definisi fungsi lekapkan

            https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/apiCreateApp.ts#L277-L278

          • Proses pemaparan pertama

            https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/renderer.ts#L2303-L2304

          Soalan yang mungkin

          • Cara membuat data responsif

          • Pergantungan Bagaimana untuk menubuhkan

          Alamat asal: https://juejin.cn/post/7097067108663558151

          Penulis: Ketua Kampung Yang

          (Belajar perkongsian video:

          tutorial video vue)

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan