为了在必要的情况下支持旧浏览器,Vue 提供了绝大多数常用的按键码的别名:
.delete
(捕获“删除”和“退格”键)
.exact
允许你控制由精确的系统修饰符组合触发的事件
在自定义指令的时候,在指定指令名称时,不需要写v-
指令可以在不同生命周期阶段执行 bind(指令被绑定到元素上的时候执行)、inserted(绑定指令的元素被添加到父元素上时执行)...
为了便于使用,我们可以在项目根目录 src 下新建一个 directives 文件夹,在文件夹里新建一个 index.js文件,将全局指令相关的代码写入该文件,再在 main.js 里通过 import 的方式引入即可
//指令钩子函数 当被绑定的元素插入到 DOM 中时……模型:组件中的data属性
视图:组件中的template
一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。
二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。
在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信。
使用MVC的目的就是将M和V的代码分离。‘MVC是单向通信。也就是View跟Model,必须通过Controller来承上启下。
MVVM其实是MVC的改进版,两者没有很大的区别,只是MVVM实现了双向数据绑定,MVC是单向通信的。
mvc是比较早的偏后端开发的模式,而且各做各的事,互不干扰,想做双向绑定就只能dom模拟,但是mvvm是实现了响应式的双向数据绑定的,而且还是基于mvc模式演变出来的,你能做的我也能做,你没实现的我却能实现,所以mvvm模式更受前端市场的欢迎
jquery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。比如需要获取label标签的内容:$("lable").val(),
它还是依赖DOM元素的值。
Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定。这就是传说中的MVVM。
1.父组件向子组件通信:props。在子组件中定义props属性
2.子组件向父组件通信:emit。在子组件中使用emit发射事件,然后在父组件中定义方法实现这个事件
3.$emit和$on也可以实现任何组件之间的通信。包括父子、兄弟、跨级。不过它得有个中间桥梁来传输数据。这个桥梁一般是个空对象 new Vue()
ref、children可以实现父组件直接获取子组件的实例,通过实例可以直接使用子组件中的方法活或者属性。两者的不同点:children 是个按子组件位置存放子组件实例,ref 可以通过定义属性直接去获取指定的实例
parent 相反是提供给子组件访问父组件实例的方法
(1)vuex是什么?怎么使用?哪种功能场景使用它?
vue框架中状态管理。在main.js引入store,注入。新建一个目录store,…… export 。场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车
(2)vuex有哪几种属性?
A、Vuex就是一个仓库,仓库里面放了很多对象。其中state就是数据源存放地,对应于一般Vue对象里面的data
B、state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新
A、getters 可以对State进行计算操作,它就是Store的计算属性
B、 虽然在组件内也可以做计算属性,但是getters 可以在多组件之间复用
C、 如果一个状态只在一个组件内使用,是可以不用getters
两者都是用来对元素做显示隐藏的
v-if 是直接通过销毁和重建dom来实现的。
v-show 是通过元素的css属性来通知显示和隐藏的
性能上来讲的话 v-show或更高效。如果是要频繁切换的话建议使用 v-show
7、vue 如何让css只在自己的文件上生效
<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
把需要缓存的组件包裹在这个组件中。主要用于保留组件状态或避免重新渲染。
9、脚手架自定义组件的过程
第四步:在template视图view中使用,
10、路由组件的懒加载
computed 通过计算结果得到的属性,其本身就是个属性,只是这个属性是经过计算得到的,用法和属性的用法是一模一样的,只是定义的位置不同。
watch 做数据监听,只要监听的属性发生变化,定义的方法就会执行
计算属性具有缓存机制。如果某个值重复的调用而且没有改变,methods的话会重复的执行使用,计算属性是会把缓存中的数据直接取出来使用。只有计算属性中依赖的属性发生变化的时候,值才会重新计算
13、v-if的使用注意事项
2、为同一类的组件做显示隐藏的时候,最好加上 key 属性来做标识,被标识的组件就会重新渲染了
14、vue 生命周期函数相关面试题
组件实例从创建到销毁的过程,叫做生命周期。开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期
2、vue生命周期的作用是什么
生命周期中有多个函数(钩子函数),这些钩子函数可以让我们在特定的时刻执行特殊的事件,形成更好的逻辑。
3、第一次页面加载会触发的函数
4、DOM 渲染在 哪个周期中就已经完成
5、生命周期函数和使用场景
完成了 data 数据的初始化,el没有 |
vue实例的$el和data都初始化了,但还是虚拟的dom节点,就是说还没有挂载 |
配合路由钩子使用,可以在这里发送异步事件请求 |
数据更新时,做一些处理(此处也可以用watch进行观测) |
组件销毁时触发,vue实例解除了事件监听以及和dom的绑定(无响应了),但DOM节点依旧存在 |
15、同级元素为什么要使用key
同级相同标签名的元素切换时,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它们,高效更新虚拟dom,否则 Vue 为了效率只会替换相同标签内部的内容。
16、后期添加属性的方法
17、vue响应式原理
4、Dep 发布订阅者,添加观察者者以及在数据发生改变的时候通知观察者
3、Watcher 观察者,对数据进行观察以及保存数据修改需要触发的回调
2、Compiler 模板编译器,对HTML模板进行编译,提取其中的变量并转化为数据。
这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。
对模板进行编译的时候,收集跟变量有关的数据。
在使用getter方法时,总会通知wather实例对view层渲染页面。.
同样的,在使用setter方法时,总会在变更值的同时,通知wather实例对view层进行更新。
vue是结合数据劫持和发布订阅者模式来实现双向数据绑定的,当要读取数据的时候会自动触发方法,并且会被赋值
使用了ES6中的proxy对数据进行代理。
对象为引用类型,当重用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改。
而使用返回对象的函数,由于每次返回的都是一个新对(Object的实例),引用地址不同,则不会出现这个问题。
19、vue路由的几种模式
hash模式下路径有个 # 号
20、v-if和v-for一起使用的弊端以及解决办法
由于v-for的优先级比v-if高,所以导致每循环一次就会去v-if一次,而v-if是通过创建和销毁dom元素来控制元素的显示与隐藏,所以就会不停的去创建和销毁元素,造成页面卡顿,性能下降。
解决方案:在v-for的外层或内层包裹一个元素来使用v-if
21、vue父组件和子组件生命周期的顺序
22、vue中事件修饰符有哪些
.stop: 阻止事件冒泡
.once: 事件只执行一次
.self:将事件绑定在自身身上,相当于阻止事件冒泡
23、vue中如何解决页面不重新渲染问题
this(Vue).$forceUpdate() 这个方法可以迫使Vue 实例重新渲染。它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。
24、vue-router有哪些导航钩子(导航守卫)?
全局前置守卫:可以一次定义多个守卫,当一个导航触发时,全局前置守卫按照创建顺序执行。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。
全局解析守卫:router.beforeResolve
注册一个全局解析守卫。在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。
全局后置守卫:这个守卫没有 next 方法
路由独享守卫:beforeEnter直接定义在路由里面去
路由组件内直接定义以下路由导航守卫:(直接定义在组件内部,定义在跟data同级)
不过,你可以通过传一个回调给 next
来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。
完整的导航调用顺序:
动态路由使用 path 传参。动态路由path参数变化的时候,组件不会重新渲染而是会复用,所以生命周期函数不会再次执行,不过可以使用 watch 进行监听
参数不会显示在路径上
浏览器强制刷新参数会被清空
参数会显示在路径上,刷新不会被清空
验证Token:浏览器请求服务器时,服务器返回一个token,每个请求都需要同时带上token和cookie才会被认为是合法请求
验证Referer:通过验证请求头的Referer来验证来源站点,但请求头很容易伪造
XSS即Cross Site Scripting(跨站脚本),指的是通过利用网页开发时留下的漏洞,注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。常见的例如在评论区植入JS代码,用户进入评论页时代码被执行,造成页面被植入广告、账号信息被窃取
存储型:即攻击被存储在服务端,常见的是在评论区插入攻击脚本,如果脚本被储存到服务端,那么所有看见对应评论的用户都会受到攻击。
反射型:攻击者将脚本混在URL里,服务端接收到URL将恶意代码当做参数取出并拼接在HTML里返回,浏览器解析此HTML后即执行恶意代码
DOM型:将攻击脚本写在URL中,诱导用户点击该URL,如果URL被解析,那么攻击脚本就会被运行。和前两者的差别主要在于DOM型攻击不经过服务端
输入检查:对输入内容中的script iframe 等标签进行转义或者过滤
设置httpOnly:很多XSS攻击目标都是窃取用户cookie伪造身份认证,设置此属性可防止JS获取cookie
开启CSP,即开启白名单,可阻止白名单以外的资源加载和运行
防抖和节流的作用都是防止函数多次调用。区别在于,假设一个用户一直触发这个函数,且每次触发函数的间隔小于阈值,防抖的情况下只会调用一次,而节流会每隔一定时间调用函数。