2023vue面试扫盲贴-day1-(第一个问题就颠覆你的认知)

336 阅读3分钟

本系列旨在给初级/中级前端科普vue面试题,大佬们的面经贴有很多,但是都是由于篇幅问题,回答得基本都是点到为止,而我们只知道浅尝辄止去背,面试官刚问题,刚开始是倒背如流,一旦面试官追问、展开讨论便起来哑口无言,实属尴尬。

所以本系列是基于大家烂熟于心的基本面试题的情况下,进行追问、反思、拓展

组件间如何进行通信


1. Vuex(当然也有其他好的状态管理库)

  • 拓展: 举例几个不同的状态管理库?

  • 拓展: commit,dispatch使用语法?

  • 5大模块: Getter,Modules,Actions,Mutations,State的各个提问

  • 追问1: 在Actions,Mutations里面分别做的事情有什么不一样?

      答案:mutations用于同步状态的修改,actions用于执行异步操作并间接修改状态
    
  • 追问2: 如果我在mutations里面执行异步操作可以吗?

      答案:其实是可以的!页面数据会跟着改,但是在devtools里面数据不会发生变化,并且f12的控制天会有warming。
      
      这就是追问1的意义! actions用来专门处理异步,里面触发mutations,就可以很清楚的看到mutation是何时被记录下来的,并且立即查看他们对应的状态。
      
    
  • 追问3: Vuex为什么要模块化?什么是nameSpaced

      答案:vuex是一个难以维护的状态树,如果在复杂的项目里面不分modules,只有一个store,便变得难以维护。
      进行模块管理之后,就可以精准地往项目所属模块拉屎!(说实话Vuex的语法挺混乱的,每次使用都要翻笔记)
    
  • 追问4: Vuex的缺点是什么?有什么替代方法?

      除了上面第一点说的之外,Vuex也是较为庞大的,并且对ts支持的不友好,没有代码提示,可以使用Vite+Vue3进行解决,也可以用vuex-module-decorators去进行类型支持。
    
  • 追问5: Vuex既然不是那么轻便的插件,那如果项目是比较小型,需要使用轻便的状态管理库,你又应该怎么做?

2. props和$emit

  • 反思1 : 这个写法是什么?
this.$emit("update:hidden", false);
        答案 :  .sync语法
  • 反思2 : 怎么实现双向绑定?

3. ref和$refs

直接拿到实例去获取数据或者触发事件

4. eventBus事件总线($emit,$on)

重点:需要在main.js注册eventBus才可以使用

5. $parent$children

  • 盲点:$parent得到的是对象,$children得到的是数组

  • 反思1: $root得到的是什么

  • 反思2: 在根组件#app上用$parent得到的是什么?

答案2: new Vue()

  • 反思3: 那如果在new Vue()的基础上在获取$parent得到的是?

答案3: undefined

6. 依赖注入(provide,inject)

provide/ injectvue2.2.0新增的api, 简单来说就是父组件中通过provide来提供变量, 然后再子组件中通过inject来注入变量。

但是需要注意的是provide之后的数据不是响应式的

7. $attrs$listeners

vue2.4中,为了解决该需求,引入了$attrs$listeners , 新增了inheritAttrs 选项。 在版本2.4以前,默认情况下,父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外),将会“回退”且作为普通的HTML特性应用在子组件的根元素上。

  • 盲点:隔代传值

反思总结:

  • 以上列举的这么多种方法,哪些只能够进行父子通信?哪些不但能够进行父子通信,甚至能够进行兄弟通信、爷孙通信?