前端面试宝典

vue的核心是什么

vue是一套构建用户界面的MVVM框架。vue的核心值关注视图层。

核心思想:

  • 数据驱动(视图的内容随着数据的改变而改变)
  • 组件化(可以增加代码的复用性,可维护性,可测试性,提高开发效率,方便重复使用,体现了高内聚低耦合)

vue单页面的优缺点

优点:

  1. 数据驱动视图,对真实dom进行抽象出virtual dom(本质就是一个js对象),并配合diff算法,响应式和观察者、异步队列等手段以最小代价更新dom,渲染页面。
  2. 组件化,组件用单文件的形式进行代码的组织编写,使得我们可以在一个文件里编写html/css(scoped属性配置css隔离)/js,并且配合vue-loader之后,支持更强大的预处理器等功能
  3. 强大且丰富的API提供一系列的api能满足业务开发中各类需求
  4. 由于采用虚拟dom,让vue ssr(服务器端渲染) 先天不足
  5. 生命周期钩子函数,选项式的代码组织方式,写熟了还是蛮顺畅的,但是仍然有优化空间(vue3 composition-api)
  6. 生态好,社区活跃

缺点:

  1. 由于底层基于Object.defineProperty实现响应式,而这个api本身不支持IE8及以下浏览器
  2. csr的先天不足,首屏性能问题(白屏)
  3. 由于百度等搜索引擎爬虫无法爬取js中的内容,故spa先天就对SEO优化不好。

请详细说下你对vue生命周期的理解?

总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。总结起来八个字:创建 加载 更新 销毁

创建前/后: 在beforeCreate阶段,vue实例的挂载元素el和数据对象data都为undefined,还未初始化。在created阶段,vue实例的数据对象data有了,el为undefined,还未初始化。

载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。

更新前/后:当data变化时,会触发beforeUpdate和updated方法

销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在

vue中组件如何通讯

父子组件:propsthis.$emit(自定义事件名,要发送的数据)
自定义事件:event.$on event.$off event.$emit Vue 实例自带api,可以定义一个全局vue实例。
还有 vuex插件 通讯。

请简述vue的单向数据流

父级prop的更新会向下流动到子组件中,每次父组件发生更新,子组件所有的prop都会刷新为最新的值

数据从父组件传递给子组件,只能单向绑定,子组件内部不能直接修改父组件传递过来的数据(可以使用data和computed解决)

vue双向绑定的原理

双向绑定就是:数据变化更新视图,视图变化更新数据

vue数据双向绑定是通过数据劫持和观察者模式来实现的。

数据劫持: object.defineproperty 它的目的是:当给属性赋值的时候,程序可以感知到,就可以控制改变属性值

观察者模式: 当属性发生改变的时候,使用该数据的地方也发生改变

双向数据绑定v-model的实现原理

  • input 元素的 value = this.name
  • 绑定input事件this.name = $event.target.value
  • data更新触发re-render

vue中常用的修饰符有哪些

// 输入框修饰符:
.lazy 改变后触发,光标离开input输入框的时候值才会改变
.number 将输出字符串转为number类型
.trim 自动过滤用户输入的收尾空格

// 事件修饰符
.stop 阻止点击事件冒泡,相当于原生js中的event.stopPropagation()
.prevent 防止执行预设的行为,相当于原生js中的event.preventDefault()
.capture 添加事件侦听器时使用事件捕获模式,就是谁有改事件修饰符,就先触发谁。
.self 只会触发自己范围内的事件,不包括子元素
.once 只执行一次

// 键盘修饰符
.enter 回车键
.tab 制表键
.esc 返回键
.space 空格键
.up 向上键
.down 向下键
.left 向左键
.right 向右键

// 系统修饰符
.ctrl
.alt
.shift
.meta

vue中指令有哪些?

  • v-for: 循环数组,对象,字符串,数字
  • v-on: 绑定事件监听
  • v-bind: 动态绑定一个或者多个属性
  • v-model: 表单控件或者组件上创建双向绑定
  • v-if v-else v-else-if 条件渲染
  • v-show: 根据表达式真假,切换元素的display
  • v-html: 更新元素的innerHtml
  • v-text: 更新元素的textcontent
  • v-pre: 跳过这个元素和子元素的编译过程
  • v-clock:这个指令保持在元素上知道关联实例结束编译
  • v-once 只渲染一次

v-if 和 v-show 的区别

v-if 是根本不会渲染DOM节点。
v-show 是基于css的display属性值对DOM进行显示隐藏的。

v-if 与 v-for 优先级

首先不要把v-if与v-for用在同一个元素上,原因:v-for比v-if优先,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候。

vue循环的key作用

  • 必须用key,且不能是index和random
  • diff算法中通过tag和key来判断,是否是sameNode
  • 减少渲染次数,提升渲染性能。

v-on 可以绑定多个方法吗?

可以,如果绑定多个事件,可以用键值对的形式(事件类型:事件名)
如果绑定是多个相同事件,直接使用逗号分隔就行。

如何定义一个过滤器

过滤器本质就是一个有参数返回值的方法

new Vue({
	filters: {
		myCurrency: function(myInput){
			return 处理后的数据
		}
	}
})

// 使用方法
<span>{{ 表达式 | 过滤器 }}</span>

过滤器高级用法:可以指定参数,告诉过滤器按照参数进行数据的过滤

什么是计算属性

计算属性是用来声明时的描述一个值依赖了其他的值,当它依赖的这个值发生改变时,就更新 DOM

当在模板中把数据绑定到一个计算属性上时, vue 会在它依赖的任何值导致该计算属性改变时更新 DOM
每个计算属性都包括一个 getter 和 setter,读取时触发 getter,修改时触发 setter

计算属性与watch区别

Computed watch 区别就是 computed 的缓存功能,当无关数据数
据改变时,不会重新计算,直接使用缓存中的值。计算属性是用来声明
式的描述一个值依赖了其他的值,当所依赖的值后者变量发生变化时,
计算属性也跟着改变,
Watch 监听的是在 data 中定义的变量, 当该变量变化时, 会触发 watch
中的方法

watch怎么深度监听对象变化

new Vue({
	el: "#first",
	data: { msg: {name: 'zz'} },
	watch:{
		msg: {
			handler(newMsg, oldMsg){
				console.log(newMsg);
			},
			immediate: true,
			deep: true
		}
	}
})

何时需要使用beforeDestory

  • 解除自定义事件 event.$off
  • 清除定时器
  • 解绑自定义的DOM事件,如window.onscroll等

在vue项目中如何引入第三方库(比如jQuery)?有哪些方法可以做到?

1.绝对路径直接引入。

在index.html中用`script`引入
<script src="./static/jquery-1.12.4.js"></script>
然后在webpack中配置external
externals:{'jquery': 'jQuery'}
在组件中使用时import
import $ from 'jquery'

2.在webpack中配置alias

resolve: { 
	extensions: ['.js','.vue','.json'], 
	alias: { 
		'@': resolve('src), 
		'jquery': resolve('static/jquery-1.12.4.js') 
	} 
}

然后在组件中import

3.在webpack中配置plugins

plugins: [new webpack.ProvidePlugin({ $: 'jquery' })]

全局使用,但在使用eslint情况下会报错,需要在使用了$的代码前添加 /*eslint-disable*/ 来去掉eslint的检查。