一、谈一下你对Vue组件化的理解。
组件化是Vue的精髓,Vue应用就是由一个个组件构成的。Vue的组件化涉及到的内容非常多
可以从以下几点进行阐述:
1、定义:
组件是可复用的 Vue 实例,准确讲它们是VueComponent的实例,继承自Vue。
2、优点:
从上面案例可以看出组件化可以增加代码的复用性、可维护性和可测试性。
3、使用场景:
什么时候使用组件?以下分类可作为参考:
1、通用组件:实现最基本的功能,具有通用性、复用性,例如按钮组件、输入框组件、布局组件等。
2、业务组件:它们完成具体业务,具有一定的复用性,例如登录组件、轮播图组件。
3、页面组件:组织应用各部分独立内容,需要时在不同页面组件间切换,例如列表页、详情页组件
4、如何使用组件:
定义:Vue.component(),components选项,sfc(单 文件 组件)
分类:有状态组件,functional(无状态组件、函数式组件),abstract (抽象组件:缓存、动画、路由(函数组件)、防抖组件) 。
通信:props,on(),provide/inject,parent/attrs/$listeners 、bus,ref,vuex
内容分发:
<slot>,<template>,v-slot
使用及优化:is,keep-alive,异步组件
5、组件的本质
1、vue中的组件经历如下过程:
组件配置 => VueComponent实例 => render() => Virtual DOM=> DOM 所以组件的本质是产生虚拟DOM
谨慎(学清楚了,可以讲)
二、生命周期
关于Vue的生命周期,下列哪项是不正确的?()[单选题]
A、Vue 实例从创建到销毁的过程,就是生命周期。
B、页面首次加载会触发beforeCreate, created, beforeMount, mounted, beforeUpdate, updated。
C、created表示完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来。
D、DOM渲染在mounted中就已经完成了。
三、为什么mutation必须是同步?
因为:mutation直接操作全局的状态管理state 。 如果存在异步,则在回调函数中进行的状态的改变都是不可追踪的,(如果并发,你无法判断是哪个先回调,什么时候回调),导致程序很不靠谱,很难调试!
四、为什么出现getter?
如果有多个组件需要用到此属性,我们要么复制这个函数,或者抽取到一个共享函数然后在多处导入它——无论哪种方式都不是很理想。
所以放在store中用一个getter ,统一做(状态计算、拼接)处理!
五、为什么要用vuex的插件。
1、当你在状态初始化、或者状态更新时,做一些派生操作,跟我们的状态管理没有直接关联的额外逻辑。不应该写到状态管理里面(丑陋;业务逻辑没有抽取出去,其他模块不能复用)。
2、典型场景:持久化登录(操作调用接口、操作localStorage、等等);
六、为什么要用vue插件。
自定义指令、自定义组件、自定义过滤器、自定义混入等等,其实不适合去分发。这些东西放到github上都不行。
最佳的方式应该是插件(最安全、最有效的方式:如果重复引入可以有效规避,也可以有效管理和更新)
vuex、vue-router 都是典型的插件
插件本质:自己理解就是将自定义指令、自定义组件、自定义过滤器、自定义混入等等,包装后install到vue上。
七、watch vs computed ?
watch: 1影响n; computed:n影响1。
1.1、监听器更通用 , 理论上计算属性能实现的侦听器也能实现 处理数据的场景不同,
1.2、监听器适合一个数据影响多个数据,计算属性适合一个数据受多个数据影响
1.3、计算属性有缓存性 , 计算所得的值如果没有变化不会重复执行
1.4、监听器适合执行异步操作或较大开销操作的情况