vue面试题

1.VUE中的数据发生了改变,vm却知道数据发生改变了?(VUE中的双向数据绑定的原理是什么?)

VUE创建vm的时候,会将数据配置到实例中

然后通过内部的Object.defineProperty()方法,对数据绑定了get与set

当获取数据的时候,会触发对应的get方法

当设置数据的时候,会触发set方法

一旦set方法触发完毕之后,内部会进一步触发watcher,从而实现数据改变,视图重新渲染。

2.动态改变属性值得时候为什么不会更新视图?怎么让其变成响应式的?

name属性是被vue实例进行挂载了,所以会动态的为其添加get与set方法(数据劫持)。

name属性改变 ==> 调用set方法 ==> 调用watcher ==> 视图更新

后续通过vm.user.age = 18 改变数据,没有进行内部的数据劫持,去进行动态的添加get与set方法,所以数据改变,视图也不会更新。

方法:vue当中提供了一个全局的api方法 Vue.set(), 就可以为动态添加的数据也会被vue管理,双向数据绑定了。

3.请你说一下v-model底层实现原理?有哪些修饰符?(v-model指令只能用在组件或者表单控件中)

绑定了value属性与监听了input事件

 <p>{{msg2}}</p>
 <p><input type="text" v-bind:value="msg2" @input="msg2=$event.target.value"></p>

v-model.lazy:默认是实时更新,加了lazy之后是失去焦点之后,内部才会更新。

v-model.number:这个值无法被parseFloat解析的时候原样输出,否则转换。

v-model.trim:去掉前后空格。

4.computed(计算属性) 和 watch的区别

1.watch 只能监听单个属性,每次监听只能监听一个变量的修改,不能同时监听多个变量的修改。

2.当需要数据变化时执行 异步 或者较大的操作时,只能采用watch

5.为什么v-for指令中添加key?

虚拟DOM对比的时候,添加元素,删除元素的时候,key可以提高对比效率。

因为如果没有加key,内部插入新的元素,后面的元素都会经历卸载与重新装载的过程,效率大大降低。

添加key之后,内部本着key值相同,DOM节点复用原则。

6.v-if与v-show的区别?

v-if的值为false的话,就会将元素在DOM树中直接删除

v-show的值为false的话,给元素添加display:none

v-else只能跟v-if一起使用

v-for不能与v-if一起使用,因为v-for优先级比v-if高。

*7.为什么一个组件的data,必须是函数?

因为每个实例对象可以维护一份被返回对象的独立的拷贝。

8.组件的生命周期可以分为几个阶段?

初始化阶段:beforeCreate created beforeMount (render) mounted

运行中阶段:beforeUpdate updated

销毁阶段: beforeDestroy destroyed

9.为什么要用自定义指令?

需要操作底层DOM的时候,用自定义指令。(初始化的时候让输入框获取焦点 )

10.scoped属性的原理https://www.jianshu.com/p/b92e2a022cd8

给当前组件的标签上面添加了额外的一些属性,所以在添加css样式的时候,不仅要匹配class,同时还要匹配额外添加的属性。

vue中的scoped 通过在DOM结构以及css样式上加唯一不重复的标记:data-v-hash的方式,以保证唯一(而这个工作是由过PostCSS转译实现的),达到样式私有化模块化的目的。

11.编辑器怎么识别vue

通过vue-loader来识别后缀为vue的文件。

12.路由模式有几种?原理是什么?

hash(默认)----调用了window.onhashChange方法进行hash值得切换

history---------本质使用H5的history.pushState方法来更改url

13.hash模式和history模式的区别

hash模式较丑(地址栏里有#)

hash兼容IE8以上,history兼容IE10以上

history模式需要后端配合将所有访问都指向index.html,否则用户刷新页面,会导致404错误

14.声明周期(钩子函数)? keep-alive动态组件的钩子函数?

八个:beforeCreate, created, beforeMount, mounted, beforeUpdate, updated, beforeDestroy, destroyed

keep-alive: activated, deactivated

15. 自定义组件的钩子函数?什么时候用自定义组件?

5个: bind, inserted, update, componentUpdated, unbind(bind与inserted:bind时父节点为null,inserted时父节点存在;)

需要操作真实dom的时候使用自定义组件。

不太会使用?它的使用方法不太清楚啊

16.路由守卫/导航守卫?

全局路由钩子:beforeEach((to,from,next)=>{}), afterEach((to,from)=>{})

单个路由钩子:

routes:[
	{
		path:"/foo",
		component:Foo,
		beforeEnter:(to,from,next)
	}
]

路由组件钩子:beforeRouteEnter(to,from,next){}, beforeRouteUpdate(to,from,next){}, beforeRouteLeave(to,from,next)

17.数组去重

最简单的new Set()方法:Array from(new Set())(最高效的数组去重:set遵循元素唯一,不重复)

18.es6新增的数组方法

forEach()会遍历数组,循环体内没有返回值,forEach()循环不会改变原来数组的内容,forEach()有三个参数,第一个是当前元素,第二个参数是当前元素的索引,第三个参数是当前元素所属的数组(item,index,arr)

map()主要作用其实是创建一个新的数组,map()的参数和forEach()是一样的(item,index,arr)

filter()参数和forEach()也是一样的,主要是过滤,用来过滤数组中不满足条件的元素,把满足条件的元素放到新的数组里,并且不会改变原数组。

19.原型链

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值