打个比方,要计算375px的屏幕,设计稿给的是750px的,此时屏幕1px相当于设计稿的0.5px,所以设计稿上某个元素类imgTest100px,相当于屏幕上50px
设置html 下font-size 默认值为 0.5px,为了计算方便一般会以100倍计算,也就是50px,如下,即1rem = 50px:
@media screen and (min-width:375px) {
html {
font-size: 50px;
}
}
.imgTest{ width: 50px }
设置盒子绝对定位absolute,然后top,right,bottom,left都为0,margin: auto;
使用对象的id,有易于性能
1)设置图片对象无限循环
img{ display:block; annimation: rotate 6s infinite; }
2) 关键帧动画
@keyframe rotate{
0%{ transform: rotateZ(0deg) }
100%{ transform: rotateZ(360deg) }
}
1) 父组件向子组件传值
父组件:
子组件:
export default{
props{
title:{
type: string,
default:'Hellow World'
}
}
}
2)子组件向父组件传值
父组件:
子组件传来的值 : {{message}}
子组件:
state: vuex的基本数据
getter:从基本数据(state)派生的数据
mutation:提交更改数据的方法,同步
action:包裹mutation,使之可以异步
modules:模块化vuex
computed
1、computed是计算属性,也就是依赖某个值或者props通过计算得来得数据;
2、 computed的值是在getter执行之后进行缓存的,只有在它依赖的数据发生变化,会重新调用getter来计算;
3、 不支持异步,当computed内有异步操作时无效,无法监听数据的变化;
watch
1、watch是监听器,可以监听某一个数据,然后执行相应的操作;
2、不支持缓存,数据变直接会触发相应的操作;
3、监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
4、支持异步操作;
dispatch:含有异步操作
存储:
this.$store.dispatch('initUserInfo',friend);
取值:
this.$store.getters.userInfo;
commit:同步操作
存储:
this.$store.commit('initUserInfo',friend);
取值:
this.$store.state.userInfo;
防抖:对于短时间内连续触发的事件(上面的滚动事件),防抖的含义就是让某个时间期限(如上面的1000毫秒)内,事件处理函数只执行一次
在第一次触发事件时,不立即执行函数,而是给出一个期限值比如200ms,然后:
效果:如果短时间内大量触发同一事件,只会执行一次函数。
beforeCreate, created, beforeMount, mounted
主要在于有没有为拷贝出的新对象在堆中重新分配一块内存区域。浅度拷贝即直接赋值,拷贝的只是原始对象的引用地址,在堆中仍然共用一块内存。而深度拷贝为新对象在堆中重新分配一块内存,所以对新对象的操作不会影响原始对象。
所以深度拷贝是不会改变拷贝对象的值,
而浅度拷贝是会改变拷贝对象的值
VUE.JS 使用缓存我建议用 good-storage ,good-storage 是一个插件,需要安装
localStorage 临时缓存(主动清除缓存才会销毁)
sessionStorage 长期缓存(关闭浏览器自动销毁)
forEach没有返回,
map可以有返回,可以return
unshift:从第一位添加元素
shift: 删除数组第一项
push: 数组末尾添加内容
pop: 删除最后一项
slice:按照条件查找出其中内容部分
splice: 对数组进行增删改
join: 用指定的分隔符将数组拼成一个字符串
concat: 连接两个或多个数组
indexOf:检测在数组中第一次出现的索引
lastIndexOf: 检测在数组中最后一次出现的索引
includes: 判断数组是是否包含数组
trim: 去掉字符串首尾空格
获取实例对象
1)父子通信
父向子传递数据是通过 props,子向父是通过 events($emit
);通过父链 / 子链也可以通信($parent
/ $children
);ref 也可以访问组件实例;provide / inject API;$attrs/$listeners
2) 兄弟通信
Bus;Vuex
3)跨级通信
Bus;Vuex;provide / inject API、$attrs/$listeners
17.css吸附定位
position: sticky
18.css垂直居中
水平居中:margin: 0 auto;
垂直居中:
Content here
#parent {display: table;}
#child {
display: table-cell;
vertical-align: middle;
}
CORS
JSONP
Nginx反向代理
M: Modul(逻辑操作)
V: View(页面)
VM: ViewModel(Modul和View之间的枢纽,比如Vue.js)
1) Model与ViewModel之间的双向关系
Model通过Ajax通信,发送数据给ViewModel。
ViewModel也可以通过Ajax通信,发送请求给Model
2) ViewModel与View之间的双向关系
ViewModel中的数据改变,可以同时改变View上的显示内容。
View上的内容改变(比如输入框中的内容),也可以同时改变ViewModel中对应的数据
JS执行上下文:JS执行前,JS引擎做的准备工作,这份工作就是创建对应的上下文
主要分为三类:全局执行上下文,函数上下文,eval上下文(一般不使用)
IE: Trident
Chrome: webkit
FireFox: Gecko
[...new Set(arr)]
方式:
1)网站结构布局优化:尽量简单,开门见山,提倡扁平结构
控制首页链接数量;
扁平化目录层次;
导航优化(img必须添加alt和title的属性);
网站的结构布局(页面头部:logo及主导航,页面主体:左边正文,右边放热门文章及相应文章,页面底部:版权信息和友情链接);
控制页面的大小,减少http的请求,提高网站的加载速度
2)网页代码优化
: 关键词,列举出几个页面的重要关键词即可
: 网页描述,不能太长
3)文本缩进不要使用特殊符号 
4) 巧妙利用css布局,将重要的HTML放在最前面
5)重要内容不要用JS输出,因为“蜘蛛”不认识
6)尽量减少使用iframe框架,因为蜘蛛一般不会读取其中的内容
7)谨慎使用display: none; 因为搜索引擎会过滤掉display:none其中的内容
8)不断精进代码
9) js代码如果是DOM操作,应经历朗放在body结束标签之前,html代码之后
10)尽量不要使用通配符选择器
1) png8生成图像是索引模式;png24生成图像是rgb模式
2) png8生成图像较小;png24生成图像较大;
3) png8只支持完全透明的图像;png24即支持完全透明的图像,也支持半透明(apha通道)图像
4) png8与gif模式有相似之处,都是索引模式,只支持像素级的纯透明,不支持alpha通道;
1)执行一个宏任务(栈中没有就从事件队列中获取)
2)执行过程中,如果遇到微任务,就添加到微任务列表中
3)宏任务执行完成,就立即执行微任务列表中的微任务
4)微任务执行完毕,开始检查渲染,然后GUI线程接管渲染
5)渲染完毕后,JS继续接管,开始下一次渲染
1)在一般函数方法中使用,this指全局对象;
2)作为对象方法调用,this指上下级对象
3)作为构造函数调用,this指new出来的对象
4)apply 调用 ,apply方法作用是改变函数的调用对象,此方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数
created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作
一般情况下,变量取值到创建这个函数对象的作用域中取值
但是如果当前作用域中没有取到值,就会向上级作用域中查,直到查到全局作用域,这么一条查找的作用域过程叫做作用域链
回归本质,组件的意义是什么?个人的理解就是完成一个可以被抽象、复用并且可以扩展的功能组件,和使用什么框架无关。
关键在于抽象、复用和可扩展,当然安全性和易用性也要考虑进去。
计算属性
跨域:跨域的产生来源于同源策略,即浏览器地址的协议名、域名、端口名都一样的情况下,才允许访问相同的cookie、localStorge和Ajax。如果在不同源的情况下,就叫做跨域。
同源策略:请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同
beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave
全局钩子函数,定义在全局的路由对象中,主要有
beforeEach:路由切换时调用
afterEach: 在每次路由切换成功后被激活时调用
34.改变this指向的方式:
1)call
function f1(n1,n2){
console.log(this);
console.log(n1,n2);
}
// f1(10,20)
var obj = {name:'李云龙'}
f1.call(obj,10,20) // 此时的this,指向就变成了第一个参数obj,从第二个参数开始,就是函数f1的形参
2) apply
// apply方法
function f1(n1,n2){
console.log(this);
console.log(n1,n2);
}
var obj = {name:'李云龙'}
f1.apply(obj,[10,20])
3) bind
function f1(n1,n2){
console.log(this);
console.log(n1,n2);
}
var obj = {name:'李云龙'}
f1.bind(obj,10,20)
不会立即调用f1函数 ,而是会产生一个修改了this指向的新的函数
1)外形不同
// 普通函数
function func(){
// code
}
// 箭头函数
let func=()=>{
// code
}
2)普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。
// 具名函数
function func(){
// code
}
// 匿名函数
let func=function(){
// code
}
// 箭头函数全都是匿名函数
let func=()=>{
// code
}
3)箭头函数不能用于构造函数,不能使用new;普通函数可以用于构造函数,以此创建对象实例
function Person(name,age){
this.name=name;
this.age=age;
}
let admin=new Person("恩诺小弦",18);
console.log(admin.name);
console.log(admin.age);
4)箭头函数中this指向不同
==>
总结:
(1).箭头函数的 this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply()
(2).普通函数的this指向调用它的那个对象
基本数据类型:int, double,char,boolean
引用数据类型:String,StringBuffer,integer
hash, history, adstract.
在一个地方呆太久,即在舒适圈太久,容易松懈对于知识点的复习,所以还是要加油啊!