Vue面试题

129 阅读3分钟

什么是框架,什么是库

库:就是一个封装好方法和代码的工具,而且还是特定一方面的集合,库使用很自由
框架:框架顾名思义就是一套架构,框架有很多很多功能,不想库只有单方面的功能,框架有自己的规则的,我们开发者必须遵循

什么是渐进式 JavaScript 框架

就是用你想用的功能特性,你不想用的功能特性可以先不可以不用,Vue不强求我们一次性接收并是它的全部功能,也就可以说,根据自己需要再去逐渐增加功能

使用 Object.defineProperty() 来进行数据劫持有什么缺点?

这个方法只能已经存在的对象属性进行劫持和更改,比如通过数组的小标和给新增对象属性的时候,这都不能触发重新渲染的,因为definedProperty拦截不到这些操作,对于数组而言,大部分操作都是拦截不了的
Vue通过保留数组本身方法功能,对push pop UNshift shift sort splice reverse 这些方法做了重写,这些方法都有一个共同的特点就是 他们都能改变原数组,还增加了一个全局方法she 和实例方式$set
进行对对象数据响应式,在Vue中已经使用 proxy 和 reflect 来实现响应式,这两个对象都是为了操作对象提供的API proxy表示的是代理,在目标对象之前设定一个拦截,外界对该对象访问都必须通过拦截
definedproperty是有三个参数,一是对象,二是对象的属性三是callback proxy有两个属性 对象和callback,这样的好处就是,可以对对象任何属性进行获取和更改,reflect 让object更加的函数化
 将Object对象的一些明显属于语言内部的方法 放到Reflect对象上 基本上proxy 和 defined上的方法 reflect都有

MVVM、MVC、MVP的区别

MVVM 其中 m表示的model v表示的view vm其实就表示 model 中数据的监听并控制view视图的更新,处理用户的交互作用 视图和模板并没有什么关联,全靠vm来进行联系的,Vue也是借鉴了MVVM,模板数据会通过
vm绑定给视图,当视图发生改变vm监听到 更改模板中的数据,其实viewmodel表示就是vue的实例对象,称为 vm

Computed 和 Watch 的区别

computed 表示的是计算,当要用的属性不存在是,要通过已有的属性计算得到,computed内部具有缓存机制,它依赖的数据发生变化时,才会重新计算,computed一般有两个写法,当需要set就是对象的写法
当值需要得到的结果,那就写成函数的方式 不支持异步,当Computed中有异步操作时,无法监听数据的变化

Watch表示监听嘛,当监听数据发生变化,回调函数自动调用,进行相关操作,不支持缓存,可以监听异步,回调有两个参数新值和旧值,也有两种写法  在对象的写法 可以写入两个属性,初始化立即调用,
还有就是深度监视,也有简写方式那就函数写法,但不能传入两个属性,在项目中我们经常遇到  用 v-for来进行遍历,但数据没有返回回来这个时候就可以使用watch

Vue data 中某一个属性的值发生改变后,视图会立即同步执行重新渲染吗?

不会立即同步执行重新渲染。Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化, Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。

v-if、v-show、v-html 的原理

v-if生成 虚拟节点的时候会忽略对应的节点,render的时候就不会去渲染
v-show 会生成虚拟节点 render也会去渲染真实的节点,只是在render的过程中会通过样式来修改 也就是 display
v-html 会先移除节点下的文本,相当于还是使用 innerHTML来插入文本的

v-if和v-show的区别

v-if是动态的向DOM树添加或删除DOM元素  v-show是通过样式来进行修改的DOM元素的隐藏 也就是display
v-if切换有一个局部编译/卸载的过程 切换过程中是适当的销毁和重建内部的事件监听和子组件,而 v-show只是通过简单css切换
v-if只有为 true 的时候才会被编译, 而v-show不管true还是false都会被编译
v-if 切换有这高消耗性能 适用于切换不频繁,v-show 有这很高初始化渲染销毁 适合频繁切换

assets与static(public)的区别

assets 与 static 有着一个相同的的特点:两者都是存储一些图片,字体这些静态资源的
assets 里面的静态资源打包会进行压缩,也就是说 webpack进行处理,而因为 webpack是遵循 commonJS的 所以是使用requir e引入模块  而这只是个图片使用要使用的 file-loader 进行编译
static 里面的静态资源是不会进行打包的,最后会复制到最终目录中,必须使用绝对路径引用这些文件这是通过在 config.js 文件中的 build.assetsPublicPath和build.assetsSubDirectory连接来确定的。
所以建议把第三方和功能的放在 static中  assets中可以放一些需要处理的资源,这样帮我大大减少体积

routeroute 和router 的区别

每个组件都有属于组件的 route ,route是路由信息对象,可以获取 path query Params,hash
$router 是路由实例对象,有路由跳转的方法 如push replace 还有钩子函数

Vue中key的作用

for 循环中 我们经常用到 key key 的作用就是就是 虚拟DOM的标识,通过key diff操作有更准确,更快速,当数据发生变化时,vue根据新数据生成 新的虚拟dom ,随后进行 新虚拟dom和 旧虚拟dom进行比较
当发现 没有两个相同的key时,就会重新创建新的真实dom,随后在渲染到页面, 旧虚拟dom找了新 虚拟dom 相同的key时,如果DOM的内容没有变,直接使用之前的真实的DOM,当内容发生变化就生成新DOM,替换
页面中真实DOM
所以建议使用数据唯一标识来作为key,可以提高页面渲染速度,增加效率
当然也可以使用 v-for的index来标识key,但是前提不要逆序添加数据,因为这样会是key值全部发生变化,这样会产生没有必要的DOM更新,效率低,还有就是遍历的结构中输入类的DOM 如input,这样也会出现页面问题,vue官方也建议我们使用 为每一项数据唯一的key
v-if 中使用 key。由于 Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染 v-if 也可以使用 key来做为标识 v-if是动态添加DOM和删除DOM的,
如果使用key 可以保证在切换时出现相同的类型的元素,那么这个元素就会被复用,但如果是相同的input元素,里面的类容用户切换过是不会清楚掉的,这个时候就也需要一个 key的唯一标识识别一个元素