1.vue的生命周期有哪些?
vue2中有8个,如果使用了keep-active还会多两个。
beforCreate,create,beforeMount,mounted,beforUpdate,update,beforeDestory,destory,actived,deactived
create:有数据,没dom,mounted:有dom,create先执行的。
进入到组件会执行哪些声明周期?
beforCreate ,Created , beforemount ,Mounted:
加入keep-alive 会多两个声明周期: actived 和deactived
如果加入了 keep-alive,第一次进入组件会执行那些生命周期?
beforCreate ,Created , beforemount ,Mounted,actived
第N次进入 只执行一个actived ,因为被缓存起来了
2. Computed , methods , watch 区别
1, Computed 有缓存,methods无缓存
2, Watch 是监听,数据或者路由发生变化才会执行,一对多,computed是计算某一属性的值,值改变就会监听并返回,多对一。
2.v-show 和v-if的区别?
首先二者都是可以对元素进行隐藏和显示的操作。
v-show是通过display:none或者display:black进行显示隐藏的
v-if是通过dom得到创建和销毁进行显示个隐藏的
首次加载用v-if比较好,多次切换建议使用v-show。
3.v-if和v-for的优先级,为什么不建议一起使用?
在vue2中v-for的优先级比较高,vue3中v-if的优先级高,因为v-if每执行一次,都会执行一次v-for,会造成性能浪费,如果想一起使用就在外面包一个盒子。
4.NextTick是做什么的,以及它的原理?(需要后面补充)
在下次 DOM 更新循环结束后执⾏延迟回调,在修改数据之后⽴即使⽤ nextTick 来获取更新后的DOM
原理:将传入的回调函数包装成异步任务,异步任务又分微任务和宏任务,为了尽快执行所以优先选择微任务,延迟它地执行顺序
nextTick 提供了四种异步方法 Promise.then、MutationObserver、setImmediate、setTimeout(fn,0)
5.组件通信
父传子:父组件在子组件上通过v-bind绑定自定义属性,子组件通过props接收
子传父:子组件通过事件,利用$emit 给父组件传值,有两个参数,第一个是父组件自定义的方法,第二个是值,父组件通过事件接收
兄弟传递:创建个公共的bus.js。两个组件都引入,通过on接收。
跨组件:provide传递,inject接收
还可以使用vuex传值。
加载过程:父 *beforeCreate *-> 父 *create *-> 子 *beforeCreate *-> 子 *created *-> 子 *mounted *-> 父mounted
更新过程:父 *beforeUpdate *->子 *beforeUpdate *->子 *updated *->父updated
销毁过程:父 *beforeDestroy *->子 *beforeDestroy *->子 *destroyed *->父destroyed
6.VueX
是一个数据管理工具,有五个属性
state:类似与data,用来存放数据。
getters:相当于计算属性cumputed.
mutations:相当于方法methods。 actions:里面可以写一些异步的操作,用来提交mutations的
modules:细分属性,管理好仓库。
7.虚拟DOM
虚拟DOM:运行js的速度是很快的,大量的操作DOM就会很慢,时常在更新数据后会重新渲染页面,这样造成在没有改变数据的地方也重新渲染了DOM节点,这样就造成了很大程度上的资源浪费,用内存中生成与真实DOM与之对应的数据结构,这个在内存中生成的结构称为虚拟DOM,当model中数据发生变化时,Vue会将模板编译成虚拟 DOM 渲染函数,并结合响应系统,在应用状态改变时,vuejs能够智能地计算出重新渲染组件,并以最小代价并应用到DOM操作上
8.路由模式,区别,如何实现的,路由懒加载怎么做?
路由懒加载用import还有compoent
常见的路由模式有hash和history
1.url 展示上,hash 模式有 "#",history 模式没有
2.刷新⻚⾯时,hash 模式可以正常加载到 hash 值对应的⻚⾯,⽽ history 没有处理的话,会返回404,⼀般需要后端将所有⻚⾯都配置重定向到⾸⻚路由。
3.兼容性。hash 可以⽀持低版本浏览器和 IE。
9.hash 和 history如何让实现的?
# 后⾯ hash 值的变化,不会导致浏览器向服务器发出请求,浏览器不发出请求,就不会刷新⻚⾯。同时通过监听 hashchange 事件可以知道 hash 发⽣了哪些变化,然后根据 hash 变化来实现更新⻚⾯部分内容的操作。
history 模式的实现,主要是 HTML5 标准发布的两个 API, pushState 和 replaceState ,这两个 API 可以在改变 url,但是不会发送请求。这样就可以监听 url 变化来实现更新⻚⾯部分内容的操作。
10.路由守卫?
路由守卫有三个值,to:去哪里,form:来自哪里,next:要做什么
全局守卫: beforeEach,beforeResolve,afterEach
路由守卫:beforeEnter:在路由跳转前触发,这个钩子作用主要是用于登录验证
组件守卫: beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave
11.讲⼀讲MVVM吗?
MVVM是 Model-View-ViewModel 缩写,也就是把 MVC 中的 Controller 演变成 ViewModel 。
Model层代表数据模型,View代表视图层,ViewModel是View和Model层的桥梁,主要是解决了视图层数据层不能连动的问题,数据会绑定到viewModel层并⾃动将数据渲染到⻚⾯中,视图变化的时候会通知viewModel层更新数据。
12.双向绑定?
双向绑定是 数据变化更新视图,视图变化更新数据
vue2中的双向绑定是通过object.defineProperty进行数据劫持,监听getter和setter的数据变化,触发update方法,进行更新节点的,但是这样会有个问题,就是如果后面为声明的对象添加一个属性,这个新的属性就会失去响应,通过vue.$set就可以解决这个问题,但是这种方式有点不符合自动响应机制,所以vue3中又引入了一个代理,也就是porxy,这个相应方式根据retive实现的,由于porxy只能实现复杂数据类型,所以又提供了一个ref方法,通过.value,去调用value实现数据响应。
13.vue 中组件 data 为什么是 return ⼀个对象的函数,⽽不是直接是个对象?
如果将data定义为对象,这就表示所有的组件实例共⽤了⼀份data数据,因此,⽆论在哪个组件实例中修改了data,都会影响到所有的组件实例。
组件中的data写成⼀个函数,数据以函数返回值形式定义,这样每复⽤⼀次组件,就会返回⼀份新的data,类似于给每个组件实例创建⼀个私有的数据空间,让各个组件实例维护各⾃的数据。⽽单纯的写成对象形式,就使得所有组件实例共⽤了⼀份data,就会造成⼀个变了全都会变的结果。
14.Vue 框架怎么实现对象和数组的监听?
通过遍历数组 和递归遍历对象,从而达到利用 Object.defineProperty() 也能对对象和数组(部分方法的操作)进行监听。
vue2中 数组就是使用 object.defineProperty 重新定义数组的每一项,能引起数组变化的方法为 pop 、 push 、 shift 、 unshift 、 splice 、 sort 、 reverse 这七种,只要这些方法执行改了数组内容,就更新内容
vue3中 改用 proxy ,可直接监听对象数组的变化。
14.你都做过哪些Vue的性能优化?
1.SPA ⻚⾯采⽤keep-alive缓存组件
2.在更多的情况下,使⽤v-if替代v-show
3.key保证唯⼀
4.使⽤路由懒加载、异步组件
5.第三⽅模块按需导⼊
6.⻓列表滚动到可视区域动态加载
15.打包优化
- Happypack——将 loader 由单进程转为多进程 (webpack 是单线程的,但是cpu是多线程的,happypack 会充分释放 CPU 在多核并发方面的优势,帮我们把任务分解给多个子进程去并发执行,大大提升打包效率。)
- 使用 include 或 exclude 优化babel-loder来帮我们避免不必要的转译
- Tree Shaking:去除冗余代码
- 插件按需加载
- 开启gzip压缩:在request headers 加上accept-encoding:gzip 优化方案 ( 原理,是在一个文本文件中找出一些重复出现的字符串、临时替换它们,从而使整个文件变小。文件 中代码的重复率越高,那么压缩的效率就越高,收益也就越大。 )