vue组件通信
1.props/$emit
父传子:props
子传父:emit
2.provide/inject
在父组件用provide
提供数据,在子组件用 inject
接收数据
3.vuex
数据管理模式
4.$parent/$child
子组件内部通过$parent对父组件操作
父组件内部通过 $children 对子组件操作
5.eventbus
使用一个空的vue实例作为中央事件总线,
使用$emit 发送事件
使用$on来接收
6.$attrs/$listeners
css垂直居中
设置行高(适用于单行文本)
1 | #parent { |
position:absolute/margin-top
1 | #parent { |
设置padding-top/padding-bottom
1 | #parent { |
flex
1 | { |
前端设计模式
- 单例模式
确保一个类只有一个实例,一般用于全局缓存,可以通过闭包来实现
1 | var single = (function(){ |
- 工厂模式
创建对象的
常用设计模式
,为了不暴露创建对象的具体逻辑,将逻辑封装在一个函数中,这个函数就称为一个工厂
1 | //安全模式创建的工厂方法函数 |
- 代理模式
代理模式为其他对象提供一种代理,当其他对象直接访问该对象时,如果开销较大,就可以通过这个代理层来控制该对象的访问
1 | (function(){ |
- 观察者模式
也叫发布/订阅模式,一个订阅者和一个发布者,当一个特定的时间发生时,发布者会通知调用所有的订阅者.
1 | var EventCenter = (function(){ |
- 模块模式
可以指定想暴露的属性和方法,并且不会污染全局.
1 | var Person = (function() { |
- 构造函数模式和混合模式
构造函数和混合模式就是js中继承的两种实现方式,前者通过构造函数的形式定义类,通过new新增实例。而后者是将构造函数的引用属性和方法放到其原型上,子类是父类原型的一个实例。
js实现继承的方法
定义父类:
1 | // 定义一个动物类 |
- 原型链继承
将父类的实例作为子类的原型
1 | function Cat(){ |
- 构造继承
使用父类的构造函数来增强子类实例,等于复制父类的实例属性给子类
1 | function Cat(name){ |
- 实例继承
为父类实例添加新特性,作为子类的实例返回
1 | function Cat(name){ |
- 组合继承
通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类的实例作为子类原型实现函数复用.
1 | function Cat(name){ |
- 继承组合继承
通过寄生方式,砍掉父类的实例属性,这样在调用父类的构造时,就不会初始化两次实例方法/属性.
1 | function Cat(name){ |
前端优化图片加载
- 对于较小的图片考虑base64
- 图片懒加载
- 图片压缩
- cdn
- 雪碧图
面向对象语言的特征
- 封装
- 继承
- 多态
确定数据类型
- typeof
1 | console.log(typeof a) ------------> string |
instanceof
1
2
3
4
5alert(c instanceof Array) ---------------> true
alert(d instanceof Date)
alert(f instanceof Function) ------------> true
alert(f instanceof function) ------------> false
注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。Object.prototype.toString.call()
事件执行机制
事件机制会经历三个阶段:
- 捕获阶段
- 触发阶段
- 冒泡阶段
1 | element.addEventListener(eventName,handler,useCapture); |
- event 时间名称
- handler 回调函数
- useCapture 执行机制(当useCapture==true)是在捕获阶段实行,否则在冒泡阶段执行.
捕获阶段由内到外,冒泡阶段由外到内
回流/重绘
渲染树=dom树+css对象模型树
渲染树布局生成盒模型
回流必定导致重绘
重绘不会回流
导致回流的原因(dom尺寸变化,添加修改):
- 宽高变化
- display:none
- 浏览器窗口大小改变等
导致重绘的原因(颜色变化)
- background-color变化
- color 变化等等
如何优化前端性能
减少http请求
一个完整的http请求,需要经历dns查询/tcp握手/客户端http请求/服务端接收请求/服务端处理请求并发回响应/浏览器接收响应等过程.
通过将多个小文件合并为一个大文件,可以减少http请求的此时.
使用 http2
http2的优点
- 解析速度快(http2是基于帧的协议)
- 多路复用(多个请求共用一个http连接)
- 首部压缩
- 优先级
- 流量控制
- 服务端推送
服务端渲染
ssr
静态资源使用cdn
css文件放在头部/js文件放在底部
使用字体图标iconfont代替图片图标
善用缓存
压缩文件
- JavaScript:UglifyPlugin
- CSS :MiniCssExtractPlugin
- HTML:HtmlWebpackPlugin
- gzip压缩(accept-encoding:gzip)
图片优化
- 图片延迟加载
- 响应式图片
- 调整图片大小
- 降低图片质量
- 使用css3替代图片
- 使用webp格式的图片
通过webpack按需加载代码
根据文件内容生成文件名,结合import动态引入组件实现按需加载
提取第三方库
减少重绘重拍
浏览器渲染过程
- 解析html生成dom树
- 解析css生成css规则树
- 将dom树与css树合并生成渲染树
- 遍历渲染树开始布局,计算每个节点的位置大小信息
- 将渲染树每个节点绘制到屏幕
- 重拍
当改变 DOM 元素位置或大小时,会导致浏览器重新生成渲染树,这个过程叫重排。
- 重绘
当重新生成渲染树后,就要将渲染树每个节点绘制到屏幕,这个过程叫重绘。不是所有的动作都会导致重排,例如改变字体颜色,只会导致重绘。记住,重排会导致重绘,重绘不会导致重排 。
使用事件委托
时间委托利用了事件冒泡,只指定一个时间处理程序,就可以管理某一类型的所有事件.
1 | <ul> |
使用requestAnimationFrame
1 | /** |
使用位操作
1 | //取模 |
1 | //取整 |
1 | //位掩码 |
不要覆盖原生方法
降低css选择器的复杂性
浏览器读取选择器原则:从右到左
1 | #block .text p { |
- 查找所有的
p
元素 - 查找结果1中是否有类名为
text
- 查找结果2中是否有id为
block
css选择器优先级
1 | 内联 > ID选择器 > 类选择器 > 标签选择器 |
使用flex布局
使用transform和opacity属性更改来实现动画
transform
和opacity
属性的更改不会导致触发重绘与重拍.