🌳前言
本篇文章主要写的是前端高频面试题(Vue框架)篇,如果有需要http/html/浏览器 方面面试题的小伙伴们,请在下方评论区留言,有时间我会去更新一篇相关面试题。如果没有的话,下一篇预备更新 前端高频面试题(React框架)篇
面试题参考文章:
🌴正文
1.有使用过Vue吗?说说你对Vue的理解
Vue 是一个构建数据驱动的渐进性框架,它的目标是通过 API 实现响应数据绑定和视图更新。
2. 说说 Vue 的优缺
- 优点:
- 数据驱动视图,对真实 dom 进行抽象出
virtual dom (本质就是一个 js 对象), 并配合 diff 算法、响应式和观察者、异步队列等手段以最小代价更新 dom,渲染页面 - 组件化,组件用单文件的形式进行代码的组织编写,使得我们可以在一个文 件里编写
html\css(scoped 属性配置 css 隔离)\js 并且配合 Vue-loader 之后,支 持更强大的预处理器等功能 - 强大且丰富的 API 提供一系列的 api 能满足业务开发中各类
- 由于采用虚拟 dom,让
Vue SSR(服务器渲染) 先天就足 - 生命周期钩子函数,选项式的代码组织方式,写熟了还是蛮顺畅的,但仍然 有优化空间(
Vue3 composition-api ) - 生态好,社区活跃
- 缺点:
- 由于底层基于
Object.defineProperty 实现响应式,而这个 api 本身不支持 IE8 及以下浏览器 CRS (浏览器端渲染) 的先天不足,首屏性能问题(白屏)- 由于百度等搜索引擎爬虫无法爬取 js 中的内容,故
spa (单页Web应用) 先天就对 seo (搜索引擎优化) 优化心有余力不足
3. Vue 和 React 有什么不同?使用场景分别是什么?
- Vue 是完整一套由官方维护的框架,核心库主要有由尤雨溪大神独自维护,而 React 是很多库由社区维护,曾经一段时间很多人质疑 Vue 的后续维护性, 似乎这并不是问题。
- Vue 上手简单,进阶式框架,白话说你可以学一点,就可以在你项目中去用一点, 你不一定需要一次性学习整个 Vue 才能去使用它,而 React,恐怕如果你这样会面对项 目束手无策
- 语法上 Vue 并不限制你必须 es6+完全 js 形式编写页面,可以视图和 js 逻辑尽可能分 离,减少很多人看不惯
React-jsx 的恶心嵌套,毕竟都是作为前端开发者,还是更习惯于 html - Vue 轻量级,适合移动端中小型项目,但Vue 完全可以应对复杂的大型应用,甚 至于说如果你 React 学的不是很好,写出来的东西或根本不如 Vue 写的,毕竟 Vue 跟着 官方文档撸就行,自有人帮你规范,而 React 比较懒散自由,可以自由发挥
- Vue 在国内人气明显胜过 React,这很大程度上得益于它的很多语法包括编程思维更符合国人思想。
4.什么是虚拟 DOM?
虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,在 react,vue 等技术出现之前, 我们要改变页面展示的内容只能通过遍历查询 dom 树的方式找到需要修改的 dom 然 后修改样式行为或者结构,来达到更新 UI 的目的。
这种方式相当消耗计算资源,因为每次查询 dom 几乎都需要遍历整颗 dom 树,如果 建立一个与 dom 树对应的虚拟 dom 对象( js 对象),以对象嵌套的方式来表示 dom 树,那么每次 dom 的更改就变成了 js 对象的属性的更改,这样一来就能查找 js 对象 的属性变化要比查询 dom 树的性能开销小
5. vue 如何监听键盘事件?
-
@keyup. 方法 <template>
<input
ref="myInput"
type="text"
value="hello world"
autofocus
@keyup.enter="handleKey"
/>
</template>
<script>
export default {
methods: {
handleKey(e) {
console.log(e)
},
},
}
</script>
-
addEventListener 方法 <script>
export default {
mounted() {
document.addEventListener('keyup', this.handleKey)
},
beforeDestroy() {
document.removeEventListener('keyup', this.handleKey)
},
methods: {
handleKey(e) {
console.log(e)
},
},
}
</script>
6. watch 怎么深度监听对象变化
deep 设置为 true 就可以监听到对象的变化
<script>
let vm = new Vue({
el: '#first',
data: { msg: { name: '北京' } },
watch: {
msg: {
handler(newMsg, oldMsg) {
console.log(newMsg)
},
immediate: true,
deep: true,
},
},
})
</script>
7.删除数组用 delete 和 Vue.delete 有什么
delete :只是被删除数组成员变为 empty / undefined ,其他元素键值不变Vue.delete :直接删了数组成员,并改变了数组的键值(对象是响应式的,确保 删除能触发更新视图,这个方法主要用于避开 Vue 不能检测到属性被删除的限制)
8. watch 和计算属性(computed)有什么区别?
-
通俗来讲,既能用computed 实现又可以用 watch 监听来实现的功能,推荐用 computed , 重点在于 computed 的缓存功能 -
computed 计算属性是用来声明式的描述一个值依赖了其它的值,当所依赖的值或者变量 改变时,计算属性也会跟着改变; -
watch 监听的是已经在 data 中定义的变量,当该变量变化时,会触发 watch 中的方法。
9. Vue 双向绑定原
Vue 数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get) 和设置属性值(set) 。
10. v-model 是什么?
一则语法糖,相当于 v-bind:value="xxx" 和 @input ,意思是绑定了一个 value 属性的值, 子组件可对 value 属性 监听,通过$emit('input', xxx) 的方式给父组件通讯。自己实现 v-model 方式的组件也是这样的思路。
11.在 vue 项目中如何引入第三方库(比如 jQuery)?有哪些方法可以
方法一:绝对路径直接引入
- 在index.html 中用 script 引入:
<script src="./static/jquery-1.12.4.js"></script> - 然后在 webpack 中配置 external :
externals: { 'jquery': 'jQuery - 在组件中使用时 import :
import $from 'jquery'
方法二:在 webpack 中配置 alias
resolve: { extensions: ['.js', '.vue', '.json'], alias: { '@': resolve('src'), 'jquery': resolve('static/jquery-1.12.4.js') } } - 在组件中使用时 import :
import $from 'jquery'
方法三:在 webpack 中配置 plugins
plugins: [ new webpack.ProvidePlugin({ $: juqery})] - 全局使用,但在使用
eslint 情况下会报错,需要在使用了 $ 的代码前添加 /* eslint-disable*/ 来去掉 ESLint 的检查
12.说说 Vue\React\angularjs\jquery 的
-
jquery与另外几者最大的区别是,jquery是事件驱动,其他两者是数据驱动。 -
jquery业务逻辑和 UI 更改该混在一起, UI 里面还参杂这交互逻辑,让本来混乱的逻 辑更加混乱。 -
Angular,Vue 是双向绑定,而 React 不是 -
其他还有设计理念上的区别等
13. Vue3.0 里为什么要用 Proxy API 替代 defineProperty API ?
响应式优化。
a. defineProperty API 的局限性最大原因是它只能针对单例属性做监听。 Vue2.x 中的响应式实现正是基于 defineProperty 中的 descriptor ,对 data 中的属性做了遍 历 + 递归,为每个属性设置了 getter 、setter 。 这也就是为什么 Vue 只能对 data 中预定义过的属性做出响应的原因,在 Vue 中使用 下标的方式直接修改属性的值或者添加一个预先不存在的对象属性是无法做到 setter 监 听的,这是 defineProperty 的局限性。
b.Proxy API 的监听是针对一个对象的,那么对这个对象的所有操作会进入监听操作,这 就完全可以代理所有属性,将会带来很大的性能提升和更优的代码。 Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须 先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。
c. 响应式是惰性的 在 Vue.js 2.x 中,对于一个深层属性嵌套的对象,要劫持它内部深层次的变化,就需要 递归遍历这个对象,执行 Object.defineProperty 把每一层对象数据都变成响应式的,这 无疑会有很大的性能消耗。 在 Vue.js 3.0 中,使用 Proxy API 并不能监听到对象内部深层次的属性变化,因此它的 处理方式是在 getter 中去递归响应式,这样的好处是真正访问到的内部属性才会变成响 应式,简单的可以说是按需实现响应式,减少性能消耗。
14. Vue3.0 编译做了哪些优化
- 生成
Block tree slot 编译优化diff 算法优化
15. Vue 3.0 新特性 —— Composition API 与 React.js 中 Hooks的异同点
-
React.js 中的 Hooks 基本使用
React Hooks 允许你 “勾入” 诸如组件状态和副作用处理等 React 功能中。Hooks 只能 用在函数组件中,并允许我们在不需要创建类的情况下将状态、副作用处理和更多东西 带入组件中。 React 核心团队奉上的采纳策略是不反对类组件,所以你可以升级 React 版本、在新组 件中开始尝试 Hooks,并保持既有组件不做任何更改。
-
Vue Composition API 基本使用
Vue Composition API 围绕一个新的组件选项 setup 而创建。setup() 为 Vue 组件提供了 状态、计算值、watcher 和生命周期钩子。 并没有让原来的 API(Options-based API )消失。允许开发者 结合使用新旧两种 API (向下兼容)
-
原理:
-
React hook 底层是基于链表实现,调用的条件是每次组件被 render 的时候都会顺序执行 所有的 hooks。 -
Vue hook 只会被注册调用一次,Vue 能避开这些麻烦的问题,原因在于它对数据的响 应是基于 proxy 的,对数据直接代理观察。(这种场景下,只要任何一个更改 data 的地 方,相关的 function 或者 template 都会被重新计算,因此避开了 React 可能遇到的性能 上的问题)。 -
React 中,数据更改的时候,会导致重新 render ,重新 render 又会重新把 hooks 重新注 册一次,所以 React 复杂程度会高一些
16. Vue3.0 是如何变得更快的?(底层,源码)
-
diff方法优化
Vue2.x 中的虚拟 dom 是进行全量的对比。 Vue3.0 中新增了静态标记(PatchFlag ):在与上次虚拟结点进行对比的时候,值对比 带有 patch flag 的节点,并且可以通过 flag 的信息得知当前节点要对比的具体内容化。
-
hoistStatic 静态提升
Vue2.x : 无论元素是否参与更新,每次都会重新创建。
Vue3.0 : 对不参与更新的元素,只会被创建一次,之后会在每次渲染时候被不停的复用。
-
cacheHandlers 事件侦听器缓存
默认情况下 onClick 会被视为动态绑定,所以每次都会去追踪它的变化但是因为是同一 个函数,所以没有追踪变化,直接缓存起来复用即可。
17. vue 在 created 和 mounted 这两个生命周期中请求数据有什么区别呢?
看实际情况,一般在 created(或 beforeRouter ) 里面就可以,如果涉及到需要页面加载 完成之后的话就用 mounted 。
在 created 的时候,视图中的 html 并没有渲染出来,所以此时如果直接去操作 html 的 dom 节点,一定找不到相关的元素
而在 mounted 中,由于此时 html 已经渲染出来了,所以可以直接操作 dom 节点,(此时 document.getelementById 即可生效了)。
18. 说说你对 proxy 的理
vue 的数据劫持有两个缺点:
-
无法监听通过索引修改数组的值的变化 -
无法监听 object 也就是对象的值的变化
所以 vue2.x 中才会有$set 属性的存在
proxy 是 es6 中推出的新 api,可以弥补以上两个缺点,所以 vue3.x 版本用 proxy 替换 object.defineproperty
🎃专栏分享:
Vue框架相关面试题就更新到这里啦,相关 Web前端面试题 可以订阅专栏哦 🥰 专栏地址:《面试题》
?
名
言
警
句
:
说
能
做
的
做
说
过
的
\textcolor{red} {名言警句:说能做的做说过的}
名言警句:说能做的做说过的
?
原
创
不
易
,
还
希
望
各
位
大
佬
支
持
一
下
\textcolor{blue}{原创不易,还希望各位大佬支持一下}
原创不易,还希望各位大佬支持一下
👍
点
赞
,
你
的
认
可
是
我
创
作
的
动
力
!
\textcolor{green}{点赞,你的认可是我创作的动力!}
点赞,你的认可是我创作的动力!
??
收
藏
,
你
的
青
睐
是
我
努
力
的
方
向
!
\textcolor{green}{收藏,你的青睐是我努力的方向!}
收藏,你的青睐是我努力的方向!
??
评
论
,
你
的
意
见
是
我
进
步
的
财
富
!
\textcolor{green}{评论,你的意见是我进步的财富!}
评论,你的意见是我进步的财富!
|