1、事件修饰符
(1) .stop:等同于js的event.stopPropagation(),防止事件冒泡
(2) .prevent :等同于js的event.preventDefault(),防止事件的默认行为
(3) .capture:事件捕获,从外到内
(4) .self:只会触发自己范围内的事件,不包括子元素
(5) .once:只会触发一次
2、data为什么是一个函数而不是对象
1.data的两种形式
var app = new Vue({
el: '#app',
data: {
searchText: '123'
}
})
var app = new Vue({
el: '#app',
data() {
return {
searchText: '123'
}
}
})
有效规避多实例污染的问题
Vue组件可能存在多个实例,如果使用对象定义data,则会导致他们共用同一个data对象,状态变更的时候就会影响多个实例。 采用函数形式定义,在initData时,会返回一个全新的data对象,可以有效的规避多实例污染的问题
3、vue封装数组的几个方法
1.vue利用了Object.defineProperty对数据进行拦截,但是这个方法无法监听到数组内部的变化,数据的长度变化,下标变化,截取变化等,所以vue对数组的监听专门做了处理对引起数据变化的方法pop、push、unshift、shift、reverse、sort、splice,vue进行了包装
2.vue封装的原理
就是在vue中重写数组的原生方法,首先获取这个数组的__ob__,也就是它的observer对象,如果有新的值,就调用observerArray继续对新的值观察变化,然后手动调用notify,通知渲染watcher,执行update
4、template到render的过程
1.template→ast→render
2.在vue编译的过程中会利用compileToFunctions 将template转化成render()函数
3.compileToFunctions的主要工作
(1)调用parse方法将template转成ast (2)对静态节点进行优化 (3)生成代码
4.vue模版编译的3个阶段
解析阶段
使用大量的正则表达式对tempate字符串进行解析,将指令、标签、属性等转化成抽象语法树
优化阶段
遍历AST,找到静节点,做标记,在diff的时候可以提高效率
生成阶段
将最终的AST转换成render函数
5、子组件可以直接改变父组件的值吗?
子组件不可以直接改变父组件的值,这样做主要是为了维护父子组件的单向数据流,每次父组件发生更新时,子组件中的props都会刷新为最新的值
子组件只能通过emit派发一个事件给父组件,由父组件更改
6、static和assets的区别
相同点
assets和static文件都是存储静态的资源,项目需要的资源图片、字体图标、样式文件等
不同点
assets中的资源在打包时,也就是运行npm run build的时候,会进行打包处理,也就是压缩体积,最后压缩后的静态资源最后都会放到static中和index.html一起上传服务器,
static中文件不会走打包流程,直接进入打包好的目录中,上传服务器 static中的资源没有进行打包,所以体积比assets体积大
建议
在template中定义的css和js文件放入到assets中进行打包压缩
引入的第三方库的资源文件比如iconfont.css 就放在static,因为这些引入的文件已经经过处理,不需要在进行压缩,直接上传
7、delete和vue.delete的区别
<template>
<div>delete和vue.delete的区别</div>
</template>
<script>
export default {
data () {
return {
arr1: [1, 2, 3],
arr2: [1, 2, 3]
}
},
created () {
this.init()
},
methods: {
init () {
delete this.arr1[0]
console.log(this.arr1) // [empty, 2, 3]
this.$delete(this.arr2, 0)
console.log(this.arr2) // [2, 3]
}
}
}
</script>
delete删除完数组元素后,元素的值会变成empty/undefined,数据的key不变,不会删除数组在内存中的占位
vue.delete删除完数组元素后,元素的key会发生改变,会删除数组在内存中的占位
8、对SSR的理解
1.原理
服务器端渲染(Server-Side Rendering)简称SSR SSR就是将Vue在客户端把标签渲染成HTML的工作放到服务器端完成,然后服务器端把处理好的HTML页面返回给客户端
当浏览器请求一个url的时候,服务器端将首屏需要的异步请求数据填充成完整的html返回客户端,返回前端的过程中,SSR是一份代码运行在两份环境中,服务端和客户端。首屏请求的时候,服务器将模板+异步数据,渲染陈html界面,返回给前端,前端再载入js文件,完成激活,剩下的就是SPA了,只有首屏是服务器端渲染且有数据的html。首屏只需要渲染一个界面,后续激活SPA是发生在浏览器中,不需要在服务器端操作所以解决了首屏加载时间慢的问题
2.优点
(1)有利于SEO检索
SPA页面的内容是Ajax获取,而搜索引擎爬取工具并不会等待Ajax异步完成后再进行爬取页面内容,所以在SPA页面是抓取不到页面通过Ajax获取到的内容,爬虫获取的html,是一个没有数据的空壳子。而SSR,是服务端直接将数据处理好,再拼接组装好,返回一个已经渲染好的页面(数据已经包含在页面中),所以爬虫可以爬取渲染好的页面。
(2)首屏加载更快
SPA页面,需要等所有的Vue编译后的js文件全部下载完成之后,才开始进行页面的渲染,文件下载需要一定的时间,所以首屏渲染需要一定的时间。SSR直接有服务端渲染好页面直接返回显示,不需要等待下载js文件后再去渲染,所以SSR能解决SPA页面首屏渲染时间太长的问题
3.缺点
服务端只支持brforeCreate和created两个钩子
服务器端承担了更多的负载
9、vue的性能优化
1.编译阶段
尽量减少data中的数据,每个数据都会增加setter和getter
v-for和v-if不要一起使用
尽量使用v-show代替v-if
如果需要使用v-for给每个元素绑定事件要使用事件代理
key值保持唯一
防抖、节流
2.SEO优化
预渲染
服务器端渲染
3.打包优化
压缩代码
4.用户体验
使用缓存,浏览器缓存,服务器缓存
keep-alive缓存界面
路由懒加载
图片懒加载
按需引入第三方组件库