Win配置记录
Mac配置记录
在Gitee/github上可以架设自己的网站
alt: 图片未加载时候的提示文字,title是鼠标划过提示文字
设置rem的的单位元素,大小都参考根元素(html)的字体大小
em的字体大小参考的该元素本身的字体大小
1vw是指当前视口宽度的1%
BFC称为块级格式化上下文,是页面中独立渲染的区域
触发条件:
(1)根元素(html)
(2)float属性不为none
(3)position为absolute或fixed
(4)display为inline-block, table-cell, table-caption, flex, inline-flex
(5)overflow不为visible
特性:
(1)、BFC的区域不会与float box重叠。
(2)、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。
(3)、计算BFC的高度时,浮动元素也参与计算
媒体查询,当前分辨率在640-1024之间, body的最小高度为768
width = device-width:视口宽度和设备宽度设置为一致
initial-scale: 初始的缩放比例(默认设置为1.0)
minimum-scale:允许用户缩放到的最小比例(默认设置为1.0)
maximum-scale:允许用户缩放到的最大比例(默认设置为1.0)
user-scalable:用户是否可以手动缩放(默认设置为no,因为我们不希望用户放大缩小页面)
元素{posiiton:absolute;left:50%;top:50%;margin-left:-当前盒子的宽度的一半;marign-top:-当前元素高度的一半}
元素{posiiton:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}
元素{posiiton:absolute;left:0;top:0;bottom:0;right:0;margin:auto}
父元素{display:flex;justifiy-content:center;align-items:center}
盒子阴影 box-shadow:水平偏移 垂直偏移 模糊程度 阴影颜色;
文本阴影 text-shadow:水平偏移 垂直偏移 模糊程度 阴影颜色;
块级元素需要横向排列需要用到浮动
清除浮动的方法 ① 父元素overflow:hidden②浮动元素后添加div且设置clear:both;③父元素::after{content:"";clear:both;display:block;}
src是图片引入路径对应的属性,href是a标签的跳转路径,或者是link的引入css外部样式表对应的属性
id选择器 class选择器 后代选择器 群组选择器 伪类选择器 标签选择器等
给上面的盒子添加下边距,给下面的盒子添加了上边距,边距会产生重叠,以最大值显示,左右会相加
两个都是隐藏元素,前者隐藏之后不占位
是不能更改@import引入的样式
严格模式下:页面排版及 JS 解析是以该浏览器支持的最高标准来执行
混杂模式:不严格按照标准执行,主要用来兼容旧的浏览器,向后兼容
文本字体类:letter-spacing、line-height、color、font-family、font-size、font-style、font-weight、text-decoration、text-transform text-indent text-align
列表类: list-style、list-style-type、list-style-position、list-style-image
都可以加粗,strong表强调,都可以倾斜,em表强调
article audio canvas figcaption figure footer header hgroup mark nav section time video
1.html语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;
2.在没有样式CCS情况下也以一种文档格式显示,并且是容易阅读的。
3.搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO。
4.使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。
XHTML元素必须正确的被嵌套,元素必须关闭,标签必须小写,必须有根元素
标准盒模型 box-sizing:content-box;
盒模型的总宽=width+padding左右+border的左右+margin左右
怪异盒模型(ie盒模型) box-sizing:border-box/ie5以下如果缺失文档声明也会触发怪异盒模型
盒模型的总宽=width+margin的左右
渐进增强针对低版本浏览器进行构建页面,保证最基本的 功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
优雅降级 graceful degradation:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
gif 支持动画,只有全透明和不透明两种模式,只有 256 种颜色
jpg 采用有损压缩算法,体积较小,不支持透明,不支持动画
png 采用有损压缩算法,体积也相对较小,支持透明背景,不支持动画
s
vg 一般会保存颜色及形状相对简单的图片,可任意放大图形显示,边缘异常清晰
BMP 无损压缩格式,画质最好,文件太大,不利于网络传输
rgba()和 opacity 都能实现透明效果,但最大的不同是 opacity 作用于元素,以及元素内 的所有内容的透明度, 而 rgba()只作用于元素的颜色或其背景色。(设置 rgba 透明的元素的子元素不会继承透 明效果!)
由于浏览器兼容的问题,不同的浏览器对标签的默认样式值不同,若不初始化会造成不同 浏览器之间的显示差异 但是初始化 CSS 会对搜索引擎优化造成小影响
webkit-transform:scale(0.833); 0.833 是缩放比例
(1)图片懒加载,在页面中看不到的底部区域添加一个滚动条事件判断图片位置距离浏览器顶端的距离与页面的距离,如果前者小于后者,优先加载
(2)·如果为幻灯片、相册等,可以使用图片预加载技术,将当前展示图片的前一张和后一张优先下载
(3)·如果图片为css 图片,可以使用CSSsprite(精灵图),SVGsprite(精灵图),lconfont(字体图标)(精灵图,小图标…)
(4)如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验
(5)如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验
父元素:
diaplay:flex 形成弹性盒
主轴方向 flex-direction: row 主轴从左向右默认值/row-revese 主轴从右向左 /column 主轴从上到下 /column-reverse 主轴从下到上
主轴方向排列方式 justify-content:flex-start 主轴起点默认值 /flex-end 主轴终点 /center 居中 /space-between 两端对齐/space-around 中间的留白是两边的 2 倍 /space-evenly 平均分配留白
交叉轴排列方式 align-items :stretch 拉伸默认值去掉子元素的高度 /宽度/flex-start 交叉轴的起点 / flex-end 交叉轴的终点/center 居中
换行 flex-wrap:nowrap 不换行,默认值,会将子元素压缩 /wrap 换行/ wrap-reverse 反向换行
多行之间的排列方式 align-content :stretch 拉伸默认值需要去掉子元素的高/flex-start 主轴起点依次排列/flex-end 主轴终点依次排列 /center 居中 /space-between 两端对齐 /space-around 中间的两端的 2 倍 /space-evenly 平均分配
子元素:
重写子项对应的交叉轴的对齐方式 align-self :stretch 拉伸默认值去掉子元素的高度/flex-start 交叉轴的起点 /flex-end 交叉轴的终点 /center 居中 /
放大 flex-grow:0 不放大 / 数值 填充剩余的空间
压缩 flex-shrink:1 压缩 /0 不压缩
实现导航的滚动效果
a. 子项的宽度超出了父容器的宽度
b. 设置子项不压缩 flex-shrink:0;
c. 父元素设置溢出显示滚动条 overflow-x:auto;
子项的宽度 flex-basis:数值+px 类似于宽度
复合写法 flex:子项放大 子项压缩 子项宽
排序 order 数值值越大越向后,可以设置负数
在 ie 浏览器中,a 标签套图片,图片周围会自带边框 ie10 及以下
1. 解决:去掉边框 img{border:none}
图片自带底部 3px 的留白
. vertical-align: bottom/middle/top 给图片添加
2. display:block; 给图片添加
3. font-size:0; 给父元素添加
表单元素对齐不一致 比如按钮和input 按钮按照怪异盒接卸 text按照标准盒子解析
透明度 opacity 在 ie 浏览器中不支持 0-1
opacity 的值照常设置,适应正常的浏览器
单独设置 ie 中透明属性:filter:alpha(opacity=value);取值范围 value:
1-100(整数)1 完全透明 100 不透明
5. 双倍浮向(双倍边距)(只有IE6出现) 两个块级元素浮动且添加左边距的时候,正常浏览器如果左边距是20px,在ie6会解析程40px
解决:给float的元素添加一个display:inline
ie 浏览器:Trident
火狐:Gecko 代码开源
苹果 & 谷歌旧版本: Webkit
谷歌 & 欧鹏: Blink
div {
width: 0;height: 0;
border: 20px solid transparent; border-top: 20px solid pink;
}
(1)老祖宗的区别link是html提供的方式 @import是css提供的方式,所以只能引入css文件,link还可以引入网页标题旁边的图标
(2)加载顺序,@import引入的css,先加载结构,后加载样式,link引入的css,结构和样式同时加载
(3)浏览器的支持性,link得到所有的浏览器的支持,@import ie6以上才支持
(4)js可以更改通过link引入的样式,但
基本类型有:Undefined、Null、Boolean、Number、String、Symbol
引用类型有:统称为 Object 类型。
1)、内存的角度:
基本类型在内存中,占据一块空间,空间里存储的就是数据,获取数据是直接获取
引用类型在内存中,占据两块空间,第一块存储的是地址,第二块存储的是数据,获取数据是属间接取值
2)、赋值的角度
基本类型赋的就是值,引用类型赋的就是地址
3)、函数传参
基本类型传的是值,引用类型传的是地址
undefined:定义变量后,没有赋值
null:对象没有引用的值,即就是引用类型里没有存储地址
相同点:都是用来定义变量的
不同点:
1)、声明提升:var会声明提升,let和const不会
2)、作用域:var是全局作用域和函数作用域,let和const是块级作用域(包括全局和函数作用域)
var定义的全局变量是window对象的属性,let和const定义的全局变量不是window的属性
3)、多个同名的变量:var可以,let和const不行
4)、暂时性死区:var没有,let和const有
5)、let在循环里,可以暂存循环便变量
6)、const定义的变量是常量,必须赋初始值而且不可修改
this是函数的内置对象,this是代名词,所以,this代表哪个对象,要看函数属于哪种情况。
this的指向有四种情况:
①当this所在函数是事件处理函数时,this代表事件源
②当this所在函数是构造函数时,this代表new出来的对象
③当this所在函数时类的方法时,this代表调用方法的对象。
④当this所在函数没有明确的所属对象,this代表window对象。
另外:箭头函数根本没有自己的this,它内部的this就是外层代码块的this
相同点:三个函数都会改变this的指向(调用这三个函数的函数内部的this)
不同点:
1)、bind会产生新的函数,(把对象和函数绑定死后,产生新的函数)
2)、call和apply不会产生新的函数,只是在调用时,绑定一下而已。
3)、call和apply的区别,第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来。
1.写法格式不同
2.箭头函数不能作为构造函数使用
3.箭头函数中没有this和arguments
4.箭头函数不具有prototype原型对象
5.箭头函数不具有super
原型:
每一个构造函数都有一个 prototype 属性,这个属性会在生成实例的时候, 成为实例对象的原型对象。javascript 的每个对象都继承另一个对象,后者称为“原 型”(prototype)对象。
原型链:
每一个对象都有一个 proto 属性,对象的属性和方法,有可能定义在自 身,也有可能定义在它的原型对象。由于原型本身也是对象,又有自己的原型,所 以形成了一条原型链(prototype chain)。(“原型链” 的作用是:读取对象的某个属 性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如 果还是找不到,就到原型的原型去找。如果直到最顶层的 Object.prototype 还是找 不到,则返回 undefined。举例来说,如果让某个函数的 prototype 属性指向一个数 组,就意味着该函数可以当作数组的构造函数,因为它生成的实例对象都可以通过 prototype 属性调用数组方法。)
继承:
继承就是在子类构造函数中继承父类构造函数的私有属性和原型属性。我们 在子类构造函数中使用 call 或 apply 方法调用父类构造函数并改变其 this 指向为 子类构造函数的 this,此时子类的构造函数就继承了父类的私有属性和私有方法。 将父类的实例化对象赋值给子类的原型对象,此时子类就继承了父类的原型属性和 原型方法。
作用域,就是变量起作用的区域(范围)。或者说,js代码执行时,查找变量的范围。
作用域链是指:
当js编译器在寻找变量时,先在最近的作用域(花括号)里找,如果找不到,则朝上一级作用域(花括号)里找,依次类推,直到找到或者找不到为止。这就是作用域链。
function ajax(obj){
let defaultObj = {
method:"get",
url:"#",
params:"",
callback:null,
isAsync:true
}
for(let key in defaultObj){
// 把obj里没有传入的属性使用defaultObj的对应属性。
if(obj[key]==undefined){
obj[key]=defaultObj[key];
}
}
// 1、创建XMLHttpRequest对象
let xhr = new XMLHttpRequest();
// 2、设置请求相关信息
let urlAndParams = obj.url;
if(obj.method.toLowerCase()=="get"){
urlAndParams += "?"+obj.params
}
xhr.open(obj.method,urlAndParams,obj.isAsync);
// 3、设置回调函数(后端响应时,调用的函数)
xhr.onreadystatechange = function(){
if(xhr.readyState==4 && xhr.status==200){
obj.callback && obj.callback(xhr.responseText);
}
}
if(obj.method.toLowerCase()=="get"){
// 4、发送请求
xhr.send();
}else if(obj.method.toLowerCase()=="post"){
// 如果是post方式,必须设置请求头。
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(obj.params);
}
}
function copyObj(obj){
let newObj ={};
for(let key in obj){
if(typeof obj[key] == "object"){ //如果说当前属性是对象的话,那么再做深拷贝
newObj[key] = copyObj(obj[key]);
}else{
newObj[key] = obj[key];
}
}
return newObj;
}
概述:
Promise是异步编程的一种解决方案,从语法上讲,Promise是一个对象,可以获取异步操作的消息
作用:
(1)、避免回调地狱的问题
(2)、Promise对象提供了简洁的API,使得控制异步操作更加容易
Promise有三种状态:
pendding :正在进行中,
rejected :失败,
resolved : 成功
Promise 常用的三种方法
第一种:then 表示异步成功执行后的数据状态变为 resolve
第二种:catch 表示异步失败后执行的数据状态变为 reject
第三种:all 表示把多个没有关系的 Promise 封装成一个 Promise 对象使用 then 返回一个数组数据。
push 尾增
pop 尾删
unshift 头增
shift 头删
concat 数组拼接
join 数组转字符串
reverse 逆序
sort 按字符串UniCode码排序
map 对数组的每个元素做某个处理,参数是回调函数,并且有返回值
slice 复制
indexOf 查找数组中的元素,找到返回该元素下标, 没找到返回-1
splice 截取
filter 过滤
every 对数组中的每一项进行判断,若都符合则返回true,否则返回false
some 对数组中的每一项进行判断,若都不符合则返回false,否则返回true
reduce:将数组所有数值进行叠加返回
forEach 对数组的每个元素做某个处理,参数是回调函数
概念:定义在一个函数内部的函数,并且这个内部函数能够访问到外层函数中定义的变量
作用:
①让外部访问函数内部变量成为可能
②局部变量会常驻在内存中
③可以避免使用全局便变量,防止全局变量污染
缺点:
会造成内存泄露(内存空间长期被占用,而不被释放)
事件委托还有一个名字叫事件代理,JS 高程上讲:事件委托就是利用事件冒泡,只 制定一个时间处理程序,就可以管理某一类型的所有事件。
将子元素的事情委托给它们的祖先级元素来干,然后使用 event.target(低版本 IE 用 的是 event.srcElement)来代替已经混乱 this 关键字
数据的生命
cookie:一般由服务器生成,可设置失效时间。如果在浏览器端生成 Cookie,默认是关闭浏览器后失效
localStorage:除非被清除,否则永久 保存
sessionStorage:仅在当前会话下有效, 关闭页面或浏览器后被 清除
存放数据大小
cookie:4K左右
localStorage、sessionStorage:一般为5MB
与服务器端通信
cookie:每次都会携带在 HTTP 头中,如果使用 cookie 保存过多数据会带来性能问题
localStorage。sessionStorage:仅在客户端(即浏览器)中保存,不参与和服务器的通信
易用性
cookie:需要程序员自己封装,源生的 Cookie 接口不友好
localStorage。sessionStorage:源生接口可以接受,亦可再次封装来对 Object 和 Array 有更 好的支持
const 和 let
模板字符串
箭头函数
函数的参数默认值
对象和数组解构
for…of 和 for…in
ES6 中的类
返回值类型的区别:
函数名的区别:
调用方式的区别:
作用上的区别:
造成跨域的原因:
同源策略:
同源策略的数据:
JSONP:是一种解决跨域限制问题的一种方式
工作原理:前端使用一个 script 标签来创建一个 HTTP 请求,并且事先声明一个回 调函数,该回调函数的名字由 callback 参数的参数值发送给后端。后端接收到来自 前端的请求后利用 callback 参数的参数值和要给前端返回的数据拼接成一段 JS 执 行函数的代码段,此时实参就是要返回给前端的数据。前端接收到后端返回的结果 后,会自动的执行事先声明好的回调函数,此时函数的形参就代表了后端要返回的 数据。
为什么不是真正的 ajax:JSONP(JSON with padding)可用于解决主浏览器的跨域 数据访问的问题,与 JSON 没有关系,只是一种跨域访问的技巧。 ajax 的核心是 通过 xmlHttpRequest 获取非本页内容,jsonp 的核心是动态添加 script 标签调用 服务器提供的 js 脚本;jsonp 只支持 get 请求,ajax 支持 get 和 post 请求。
For 循环:在固定长度或者长度不计算的情况下 for 循环效率更高
Map 循环:在不确定长度或者计算长度有损性能的时候用 map 比较方便,如 果需要操作元素里面的每一个值并且返回一个新数组的话,那么 map 就是最好 的选择, 数组中的元素为原始数组调用函数处理后的值。
同步与异步: 同步与异步是对应的,它们是线程之间的关系,两个线程之间要 么是同步的,要么是异步的。
**区别:**同步就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发 出之后,这个调用就直接返回了,所以没有返回结果。同步就是在发出一个调用 时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值 了。当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出 后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
**阻塞与非阻塞:**阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处 于阻塞,要么处于非阻塞。
**区别:**阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得 到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞 当前线程。
解析 HTML,生成 DOM 树,解析 CSS,生成 CSSOM 树,将 DOM 树和 CSSOM 树结合生成渲染树(Render Tree)
Layout(回流):当渲染树中的一部分或者全部因为元素的尺寸、布局、隐藏等改变 而需要重新构建的时候,这时候就会发生回流。根据生成的渲染树,进行回流 (Layout),得到节点的几何信息(位置,大小)
Painting(重绘):在回流的时候,浏览器会使渲染树中受到影响的元素部分失效, 并重新绘制这个部分的渲染树,完成回流以后,浏览器会重新绘制受到影响的部 分元素到屏幕中,这个过程就是重绘。根据渲染树以及回流得到的几何信息,得 到节点的绝对像素
什么时候会发生回流和重绘
添加或删除可见的 DOM 元素
元素的位置发生变化
元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代。
页面一开始渲染的时候(这肯定避免不了)
浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大 小的)
回流一定会触发重绘,而重绘不一定会回流
如何减少回流,重绘?
charAt() 根据下标查找字符
concat() 字符串拼接,平时我们会用+运算代替
indexOf() 根据字符查找对应的下标从一个字符串中检索某个字符的下标, 如果没有找到对应的字符,则返回-1;如果要寻找的字符有多个,则默认返 回第一个的下标
lastIndexof() 根据字符查找对应的下标(从后往前找)
replace(“原字符”,“新字符”) 替换字符
//惰性匹配用 m 替换 e console.log(str.replace(“e”, “m”));
//全局匹配 console.log(str.replace(/c/g, “m”));
slice(start,end) 通过起始下标和终结下标截取一段字符串,结果中包含开始 位但不包含结束位;如果省掉第二个参数则代表一直截取到结束为止
substring() 同 slice 功能和参数都一致,不过第二个参数不允许传负数
split() 根据所传参数的字符作为分隔将原字符切割为长度若干的一个数组
substr() 通过起始下标和截取数量来截取一段字符串
toLowerCase() 转换字符串为小写
toUpperCase() 转换字符串为大写
内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未 释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等 严重后果。
避免内存泄漏:
基础选择器
层级选择器
过滤选择器
属性选择器
$(‘li[id]’).css(‘color’,‘red’);
$(‘li[class=what]’).css(‘font-size’,‘30px’);
$(‘li[class!=what]’).css(‘font-size’,‘50px’);
$(‘input[name^=username]’).css(‘background’,‘gray’);
( ′ i n p u t [ n a m e ('input[name (′input[name=222]’).css(‘background’,‘green’);
$(‘button[class*=danger]’).css(‘background’,‘orange’)
解释:
1、标签名【属性名】,查找所有含有 id 属性的该标签名的元素
2、匹配给定的属性是 what 值【attr=value】匹配给定的属性是某个特定 值的元素
3、没有 class 也会发生变化,[attr!=value]匹配所有不包含有特定的属 性,或者属性不等于特定值的元素
4、匹配给定的属性是以某些值开始的元素 ^
5、匹配给定的属性是以某些值结尾的元素 $
6、匹配给定的属性是以包含某些值的元素 *
筛选选择器
$(‘span’).eq(1).css(‘color’,‘red’);
$(‘span’).first().css(‘font-size’,‘28px’);
( ′ s p a n ′ ) . l a s t ( ) . c s s ( ′ c o l o r ′ , ′ g r e e n y e l l o w ′ ) ; c o n s o l e . l o g ( ('span').last().css('color','greenyellow');console.log( (′span′).last().css(′color′,′greenyellow′);console.log((‘span’).parent());
$(‘span’).parent(’.p1’).css({‘width’:‘300px’,height:‘400px’,‘backgro und’:‘red’});
$(’.list’).siblings(‘li’).css(‘color’,‘red’);
$(‘div’).find(‘button’).css(‘background’,‘gray’);
解释:
1、获取第 n 个元素数值从 0 开始 .eq()
2、获取第一个元素 .first()
3、获取最后一个元素 .last()
4、获取父元素 .parent()
5、选择所有的兄弟元素 .siblings()
6、查找所有的后代元素 .find() o jQuery 的筛选器的分类
相同点:
不同点:
vue面试题
相同点:
v-show和 v-if都是 控制 dom元素 的 显示和隐藏 的。
不同点:
1、原理:
v-show是通过控制元素的样式属性display的值,来完成显示和隐藏;
v-if是通过对dom元素的添加和删除,完成显示和隐藏
2、使用场景:由原理(做法)得出使用场景的区别
v-show:使用在dom元素频繁切换的场景
v-if:当dom元素的切换不频繁,可以使用。特别是,首次元素处于隐藏的情况下。
首先
单项数据流是发生在父组件朝子组件传值的时候,所有的 prop 使得其父子 prop 之间形成了一个单向下行绑定。
也就是说:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态。
而且
每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。所以,在一个子组件内部改变 prop,Vue 会在浏览器的控制台中发出警告。
首先(相同点):
computed 和 watch都可以实现数据的监听。
其次(区别):
第一(本质):
computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,当依赖的属性值发生改变时,才会重新计算 computed 的值,它可以设置getter和setter.
watch: 更多的是观察的作用,每当监听的数据变化时都会执行回调进行后续操作,它只能设置getter.
第二(运用场景):
computed:当我们需要进行数值计算,并且依赖于其它数据时,使用 computed。
watch:当我们需要在数据变化时执行异步或开销较大的操作时,应该使用 watch。
1)、生命周期是什么?
Vue 实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模版、挂载 Dom -> 渲染、更新 -> 渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。
2)、各个生命周期阶段及其钩子函数
vue的生命周期核心经历了四个阶段,在四个阶段的前后分别有两个钩子函数。
第一阶段:数据挂载阶段:把配置项data中的属性,赋给了vue对象本身,并做了数据劫持。
该阶段前后的两个钩子函数:beforeCreate和created
第二阶段:模板渲染阶段:把vue对象的数据渲染到模板上。
该阶段前后的两个钩子函数:beforeMount和mounted
第三阶段:组件更新阶段:当数据发送变化时,组件会进行重新渲染,所以,准确的说是,组件重新渲染阶段。
该阶段前后的两个钩子函数:beforeUpdate和updated
第四阶段:组件销毁阶段:组件销毁。
该阶段前后的两个钩子函数:beforeDestroy和destroyed
因为data是引用类型,如果不用函数,所有组件的data会指向同一块内存区域,导致数据之间互相影响。
而使用函数时,每次实例化组件时,调用函数,return一个新(new)的data对象。这样每个实例可以维护一份被返回对象的独立的拷贝,组件实例之间的 data 属性值不会互相影响。
v-model 指令主要用在表单元素上实现数据双向绑定的。
例如:input、textarea、select 等创建双向数据绑定,本质上不过是语法糖,其实v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:
vue数据绑定是通过 数据劫持和观察者模式 的方式来实现的。
1、数据劫持:使用Object.defineProperty();
,bv./c是:感知属性的变化。当给属性赋值时,程序是能够感知的(知道的)。如果知道的话,就可以控制属性值的有效范围,也可以改变其它属性的值等。
2、观察者模式(发布订阅模式)
目的:当属性发生变化时,使用该数据地方(模板,计算属性,watch等等)跟着变化
Vue 组件间通信主要指以下 3 类通信:父子组件通信、隔代组件通信、兄弟组件通信,下面我们分别介绍每种通信方式:
(1)props / $emit : 父子组件通信
(2)ref: 适用 父子组件通信
(3)EventBus ($emit / $on): 适用于 父子、隔代、兄弟组件通信
(4)$root:集中管理,适用于所有场景
(5)Vuex 适用于所有场景
keep-alive 可以缓存其它组件及其的组件的状态,避免了组件的频繁创建和销毁。
它有三个特性:
1)、用于缓存组件,一般结合路由和动态组件一起使用。
2)、提供 include 和 exclude 属性。两者都支持字符串或正则表达式, include 表示只有名称匹配的组件会被缓存,exclude 表示任何名称匹配的组件都不会被缓存 ,其中 exclude 的优先级比 include 高;
3)、对应两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数 activated,当组件被移除时,触发钩子函数 deactivated。
1)、params
传:
声明式:
User
编程式:
$router.push({ name: ‘user’, params: { id: ‘123’ }})
接:
模板里的写法:
$route.params.参数名
脚本里的写法:
this.$route.params.参数名
2)、query
传:
带查询参数,变成 /register?plan=private
$router.push({ path: ‘/register’, query: { plan: ‘private’ }})
注意:如果提供了 path,那么params 会被忽略
接:
模板里的写法:
$route.query.参数名
脚本里的写法:
this.$route.query.参数名
懒加载简单来说就是延迟加载或按需加载,即在需要的时候进行加载。为给客户 更好的客户体验,首屏组件加载速度更快,解决白屏问题,当构建的项目比较大 的时候,懒加载可以分割代码块,提高页面的初始加载效率。
使用
component
vue 异步组件懒加载:主要是使用了 Promise.resolve()的异步机制,用 require 代替了 import,实现按需加载: resolve=>(require([“引用的组件路径”],
ES 中的 import(推荐):const HelloWorld = ()=>import(’ 需要加载的模块地址’)
1)、全局守卫
全局守卫有前置守卫和后置守卫,是vueRouter对象的两个钩子函数,分别是 beforeEach和afterEach
2)、路由独享守卫
写在路由配置里。钩子函数名:beforeEnter,只有前置守卫
3)、组件内部守卫
写在组件对象里。分别有前置守卫,后置守卫,路由改变守卫(当前组件被复用的情况,不是路径改变)三个钩子函数。
分别是:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave
应该说,建议不要连用,或者说,在循环时,通过if只能拿到少部分数据时,建议不要使用。
原因: v-for比v-if优先级高,如果遍历的数组元素个数比较多,但是满足v-if条件比较少的情况下。会浪费性能。而且,每次刷新页面时,都会执行这样性能不高的代码。
Vuex 是一个专为 Vue.js 应用程序开发中管理的一个模式。通过创建一个集中 的数据存储,方便程序中的所有组件进行访问。
方法 1 :后端解决跨域 CORS(跨域资源共享)
方法 2 :使用 JQuery 提供的 jsonp
方法 3 :proxyTable 解决跨域
1)、首先:
SPA的英文是single-page application ,也就是说整个项目中只有一个页面。
单页面应用的实现思路: 就是在 Web 页面初始化时加载所有的 HTML、JavaScript 和 CSS,页面的内容的变化,靠动态操作DOM。
2)、其次:
它的优点有三点:
第一点:**局部刷新。**用户体验好、快,内容的改变不需要重新加载整个页面。
第二点:**服务器的压力小。**基于上面一点,SPA 对服务器的压力小;
第三点:**前后端职责分离。**架构清晰,前端进行交互逻辑,后端负责数据处理;
它的缺点也有三点:
第一点:**初次加载耗时多。**为实现单页 Web 应用功能及显示效果,需要在加载页面的时候将 JavaScript、CSS 统一加载,部分页面按需加载;
第二点:**前进后退路由管理问题。**由于单页应用在一个页面中显示所有的内容,所以不能使用浏览器的前进后退功能,所有的页面切换需要自己建立堆栈管理(这是vue-router做的);
第三点:**SEO 难度较大。**由于所有的内容都在一个页面中动态替换显示,所以在 SEO 上其有着天然的弱势
Vue 的父子组件钩子函数的执行顺序可以归类为4个 部分:
第一部分:首次加载渲染
父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted
第二部分:父组件修改子组件的props值时:
父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated
第三部分:父组件修改的数据跟子组件没有关系时,
不会影响子组件 父 beforeUpdate -> 父 updated
第四部分:销毁过程
父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed
第一个方面:代码层面的优化
第二个方面:Webpack 层面的优化
第三个方面:基础的 Web 技术的优化
1、vueX是干什么的
vuex能够保存全局数据,供整个应用使用,可以在组件之间传递数据。
vuex保存的数据是响应式的
vuex保存的数据可以跟踪状态的变化
2、vueX的核心概念
state : 数据仓库 ,存储所有的 共享数据 ,相当于vue组件里的data getter : 在state的基础上 派生的数据, 相当于vue组件里 computed mutation:修改state的数据时,用mutation,这与跟踪状态 有关系 action:解决mutation里只能有同步代码的问题,action里可以有异步代码
3、vueX的数据流
组件里 dispatch(派发)vueX中的 action,action里commit(提交)mutation,mutation里修改state。state被修改后,会响应式到组件上。
路由模式分为两种:hash和history;通过设置vueRouter对象的mode属性来完成修改。
区别:
1)、外观上
hash模式时,路径上有#。
history模式时,路径上没有#。
2)、原理上
hash模式通过修改location.href来完成
使用锚点连接的思路,使用hash模式不会给后端发请求。当然,在hash值变化时,会同时触发window对象的onhashchange事件,并可以通过事件对象的oldURL属性和newURL属性 得到新旧URL。
1、vue采用异步队列渲染是为了提高性能,在异步队里会去掉重复的无效的渲染。
当vue中的数据发生改变后,vue框架会把该数据引起的dom更新放入异步队列( 缓冲在同一事件循环中发生的所有数据变更 ),进行排队。 如果同一个 watcher 被多次触发,只会被推入到队列中一次 。 这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的 。
2、如果不采用 异步渲染,而是在数据发生改变后,立即更新dom,如果有重复无效的渲染,那么,就会造成性能的浪费。
1)、为什么用Vue.nextTick()
首先,JS是单线程的,那么,它如何处理异步操作。
所有同步任务都在主线程上执行,形成一个执行栈。
主线程之外,会存在一个任务队列,只要异步任务有了结果,就在任务队列中放置一个事件(所以,也叫事件队列),进行排队(处于等待状态)。
当执行栈中的所有同步任务执行完后,就会读取任务队列(事件队列)中的任务(事件)。即:任务队列中的任务就结束了等待状态,进入执行栈。
主线程不断重复第三步。直到任务队列和执行栈里的代码执行完毕。
其次,vue更新DOM的思路。使用的就是异步更新队列,所以,就使用了事件循环。目的是提高性能,避免无效的重复的DOM更新。即:vue中更新数据后,并不会立即更新DOM,而是把数据引起的DOM更新放入到异步更新队列里。等待下次事件循环(tick),并在两个tick之间进行UI渲染。这样程序员就不能在更改数据后,立即获取更新后的DOM,也不知道什么时候DOM能够更新。基于此,vue提供了nextTick函数。让程序员操作更新后DOM的代码放入到nextTick的回调函数里。由nextTick内部,在更新完DOM后,调用回调函数。
首先
key 是Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确、更快速。
再说一下,diff算法的执行过程:
1)、oldCh 和 newCh 各有两个头尾的变量 oldStartIndex、oldEndIndex 和 newStartIndex、newEndIndex,
2)、在新节点和旧节点进行两两对比时,共有4种比较方式:
a.newStartIndex 和oldStartIndex 、
b.newEndIndex 和 oldEndIndex 、
c.newStartIndex 和 oldEndIndex 、
d.newEndIndex 和 oldStartIndex,
如果以上 4 种比较都没匹配,如果设置了key,就会用 key 再进行比较。
全局过滤器
位置:创建实例之前
语法
Vue.filter(‘过滤器名称’,function(val){//val 表示需要处理的值 return val + 4; //返回处理后的数据 })
局部过滤器
只能在当前 vue 注册内容中使用
位置:在 vue 实例中与 el 属性 data 属性同级定义 62
语法
filters:{ “过滤器名字”:function(val){ return 输出内容 }}
过滤器的调用方法
{{msg | 过滤器名称 }}
注意事项
定义全局过滤器,必须放在 vue 实例化前面
在没有冲突的前提下,过滤器可以串联
tate 就是存放数据的地方,类似一个仓库 , 特性就是当 mutation 修改了 state 的数据的时候,他会动态的去修改所有的调用这个变量的所有组件里面的 值(若是 store 中的数据发生改变,依赖这个数据的组件也会发生更新)
getters:相当于之前组件中学习的计算属性,getters 属性主要是对于 state 中数 据的一种过滤
mutations:里面装着一些改变数据方法的集合,就是把处理数据逻辑方法全部放 在 mutations 里面,当触发事件的时候想改变 state 数据的时候使用 mutations(在 vuex 中如果想进行数据的修改,必须在 mutations 中进行操 作)
actions:进行异步操作(异步请求)