Vue面试题

1.了解MVVM

MVC:数据model 视图view 控制器controlle   前后端无法独立开发 依赖后台

MVVM:数据model  视图view  控制数据改变视图更新viewModel  

html部分相当于View层, View层通过模板语法来声明式的将数据渲染进DOM元素 

ViewModel对Model进行更新时,通过数据绑定更新到View ViewModel层的核心是双向数据绑定

当Model层视图发生更新时,ViewModel也让Model层发生变化

2.v-model原理

采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,数据变动时触发相应的监听回调达到数据视图同步

v-model是  :value 和 @input的联合使用

3.vue中data为什么是函数

利用了闭包的思想,vue是单页面应用,组件式开发,每一个组件中都有一个data

通过函数闭包的思想,外层还是访问不到内存函数的变量

形成私有的作用域,使数据之间不会相互影响

4.v-if和v-show的区别

v-if是通过添加和删除DOM元素来进行显示或者隐藏

v-show是通过操作DOM元素样式来进行显示和隐藏,适用于需要频繁切换元素显示的场景

5.v-for中为什么需要有key

key可以有效的提高虚拟DOM的更新效率 

Vue使用就地复用的策略,操作DOM元素的时候,没有key值容易造成选项混乱

key只能是字符串或者number类型 开发中使用每条数据的唯一标识作为key。

6.虚拟DOM中key的作用

key是虚拟DOM对象的标识,当数据发生变化时,vue会感觉新数据产生新的虚拟DOM,新的虚拟DOM和旧的虚拟DOM比较key值,key值相同比较内容,内容相同就地复用,不同替换。

7.打包后dist目录过大,解决办法?

1.删除dist打包生成的.map文件

2.组件和路由使用懒加载,按需引入

3.对文件图片进行压缩。图片后缀

8.watch和computed的区别

watch和computed会自动执行预先定义的函数 watch功能强于computed

computed:计算属性,依赖其他属性的值。具有缓存,只有他依赖的值发生变化,下一次取当前属性时才会重新计算,避免了每次取值的重新计算。

watch:侦听器,当侦听的值发生改变时,其他变化会跟着改变有些操作也会被触发,watch中可以使用异步操作,当需要数据变化时执行异步或进行开销比较大的操作时,使用watch监听接收两个参数

9.vue组件间的数据传递

1.父子组件

父->子:父组件给子组件身上绑定自定义属性,子组件里使用props属性进行接收

子->父:调用函数传值  通过$emit自定义事件传值 

通过父组件给子组件绑定ref,子组件调用$refs $on传值

2.兄弟组件

事件总线Bus,全局事件bus挂载到vue的原型上,所用的组件都可以使用

兄弟A,通过$emit触发自定义事件,传递数据

兄弟B,通过$on监听自定义事件,接收数据

3.爷孙组件

爷爷组件provide要传递的数据

孙子组件inject接收数据

10.性能优化

1.减少请求  使用状态机维护多处使用的数据

2.减少重定向

3.使用懒加载图片和路由

4.减少频繁反复的DOM元素操作

5.使用外部js脚本和css样式

6.压缩脚本,样式,图片,字体

7.减少DNS查询

11.Vue

响应式,渐进式,组件化,轻量级,虚拟dom,单页面

12.Vue生命周期

beforeCreate  组件实例背创建之初,组件的属性生效之前  可以绑定loading事件

created  组件实例已经完全创建,属性也绑定,但真实dom还没有生成,$el 不可用

结束loading事件  异步请求

beforeMount 在挂载开始之前调用,相关的render函数首次被调用

mounted  el被新创建的vm.$el 替换,并挂载到实例上去之后调用该钩子  

挂载元素   获取DOM节点

beforeUpdate  组件或者实例数据更新之前调用,发生在虚拟DOM打补丁之前

update 组件或实例数据更新之后

数据的统一处理

beforeDestory  组件或实例被销毁之前调用

destoryed  组件或实例被销毁后调用

activited keep-alive 专属,组件被激活时调用

deactivited  keep-alive专属,组件被销毁时调用

errorCaptured  在捕获一个来自后代组件的错误时被调用

13.Vuex

Vuex是一个专为Vue的状态管理工具,主要用于多页面,多状态之间的通信

vuex中有state,getter,mutation,action,module五个属性

state存储数据 getter相当于计算属性computed

mutation是用来更改Vuex的store中的状态的唯一方法,在aciton中调用store.comiit来触发

aciton提交给mutation,不能直接变更状态,Aciton可以保护任意异步操作,通过store.dispatch

14.Vuex和localStorage的区别

vuex存储在内存,localStorage文件存储在本地

localstorage只能存储字符串类型的数据,存储对象需要使用JSON的stringify和parse处理

vuex是vue的状态管理工具,用于组件之间的传值,在跨页面传递数据时使用

vuex能做到数据的响应式,localstorage做不到,vuex存储值在刷新页面时丢失

15.Vue-router

vue-router时vue.js官方路由管理器,vue的单页应用时基于路由和组件的,路由用于设定访问路径

组件:router-link,router-view路由出口

16.Vue-router实现原理

Vue是单页面应用(SPA)程序,只有一个完整页面,在加载页面时,更新视图而不重新请求页面

根据不同mode参数来选择hash还是history模式

Hash模式:vue-router默认模式,使用url的hash来模拟一个完整的url,hash(#)是url的描点,hash用来指导浏览器动作,改变hash后的路径都会在浏览器的访问历史中增加一个记录,使用后退可以回到上个位置,hash模式通过描点值的改变,根据不同的值,渲染指定Dom位置的不同数据。hash模式原理是监听onhashchange事件,在window对象上监听事件,通过window.hash获取url后面的hash值

History模式:利用H5 History Interface中新增的history.pushState history.replaceState  API来完成url跳转需要后台配置支持  服务器未响应会报404 无需重新加载页面

abstract模式

17.使用路由模块来实现页面跳转的方式

直接修改地址栏

this.$router.push('路由地址')

<router-link to='路由地址'></router-link>

18.$router和$route的区别

router是VueRouter的实例,是一个全局的对象,通过vue.use(VueRouter)和VueRouter构造函数得到一个router的实例对象,router包含了路由跳转的方法,钩子函数

route是路由信息对象|跳转的路由对象,每一个路由都有一个route对象,是一个局部的对象,可以获取对应的name,path,params,query等

19.Router的导航钩子

全局前置导航守卫:router.beforeEach

全局解析守卫:router.beforeResolve

全局后置钩子:router.afterEach

路由独享的守卫:beforeEnter

组件内守卫:beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave

20.路由懒加载

把不同路由对应的组件分割为不同的代码块,当路由被访问是才加载对应的组件

21.Vue单向数据流

所有的prop都使得其父子prop之间形成一个单向下行绑定:父级prop的更新会向下流动到子组件中,会防止子组件改变父组件的状态,只有当父组件更新时,子组件中的prop都会刷新为最新的值

22.vue-cli工程都用到了哪些技术,作用分别是什么?

1.vue.js:vue-cli工程的核心,主要特点是双向数据绑定和组件系统

2.Sass,Less

3.vue-router:vue官方推荐使用的路由框架

4.vuex:专为Vue.js项目开发的状态管理器,主要用于维护vue组件间共用的一些变量和方法

5.axios:用于发起GET,POST等请求,基于promise设计的

6.element-ui/vant-ui组件库

7.emit.js文件,用于vue事件机制的管理

8.webpack:模块加载和vue-cli工程打包器

23.v-if和v-for(修)

v-if和v-for不建议一起使用,在Vue2中v-for具有比v-if更高的优先级,意味着v-if将分别重复运行于每个v-for循环中,即先运行v-for循环,在v-for循环中进行v-if条件对比,先把元素遍历后判断隐藏,进行不必要的dom渲染,会造成性能问题,而在Vue3中v-if具有比v-for更高的优先级

24.自定义指令

局部指令 new Vue({directives:{指令名:配置对象}) 或 new Vue({directivea(){ } })

全局指令 Vue.directive(指令名,配置对象) 或Vue.directive(指令名,回调函数)

自定义指令在定义时不需要v-  在使用时要加v-  配置对象钩子函数 

bind 指令与元素成功绑定时调用

inserted 指令所在元素被插入页面时调用

update 指令所在模板结构被重新解析时调用

25.nextTick

vueDom的更新机制:vueDom采用异步更新,当数据发生改变时,dom不会立即同步更新,而是在下一次回调中更新dom,状态多次发生改变,dom只更新一次

nextTick可以实现数据更新dom同步更新

Vue.nextTick().then(() => { 获取更新后的dom })

Vue.nextTick(() => { 获取更新后dom })

this.$nextTick(() => { })

vue3之后 nextTick小钩子函数  await nextTick()  nextTick(() => { })

26.ref和reactive区别

1.ref的值可以接收任意数据类型

2.reactive只能接收对象数据类型( object,array,new Map(),new Set() )

3.reactive不能替换整个对象,会丢失响应性

4.不能使用解构的方法来使用reactive中的属性,会丢失响应性

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值