一、概念
基础概念
- 单页面应用(Single Page Application,SPA),资源是动态加载到页面,不需要服务器控制页面跳转
- 响应式设计(Responsive web design,RWD),不同设备分辨率自适应。
- 数据导向,区别于页面导向,通过后台REST服务获取JSON,而不是通过服务器渲染动态页面来实现。
- 数据链,连通数据的链路,修改元数据的值来触发一系列数据的更新。
- 函数式编程(Functional Programming),是一种结构化的编程方式,核心是根据元数据生成新的衍生数据,可通过lambda表达式。Vue中通过computed计算属性选项,以生成衍生数据对象。
MVVM(Model-View-ViewModel)
从MVC过度到MVVM,使用ViewModel替代Controller,分离View和Model,它们之间的松散耦合,通过数据绑定起到两者的桥梁作用。常见的有Vue、React、和angular。
- View,视图层负责展示视图
- ViewModel,一方面响应用户事件并向模型层发送请求,另一方面将模型层返回的数据通过数据绑定在视图中展现
- Model,模型层负责处理交互请示并返回响应的数据
Vue
简单小巧的核心,渐进式技术栈,足以应付任何规模的应用。
- 虚拟DOM,DOM操作成本很高,在渲染流程中采用虚拟DOM性能更好。
- 双向数据绑定,解耦视图与数据。由于实现原理使用的Object.defineProperty是ES5中一个无法shim(自定义扩展)的特性,因此无法在IE8及以下使用。
- 轻量级
- 可复用的组件
- 前端路由
Vue Devtools
一个拓展程序,用于在浏览器查看Vue组件和Vuex数据。
源码编译方法如下。
1 | $ npm install yarn -g # 安装yarn |
双向数据绑定原理
- 核心是采用数据劫持结合发布者订阅者模式,通过Object.defineProperty()对每个属性的get和set进行拦截。在数据发生变化的时候发布消息给订阅者,触发相应的监听回调。
- 使用Object,defineProperty()就能完成一个简单的双向绑定,但是效率比较低。
- 观察者模式让双向绑定更有效率,它是一对多的模式,一指的是修改的一处数据,凡是用了这个数据的地方都更新。
1 |
|
二、Vue语法
插值绑定
- 文本绑定,使用双大括号(Mustache语法)绑定变量、值或表达式
- HTML插值,使用v-html指令
1 |
|
属性绑定
- v-bind指令,将元素的某个属性和vue实例的某个属性绑定。支持属性、类名和样式等绑定,可省略不写,只保留冒号。
- 类名和样式绑定, 比较特殊,除了字符串,还可以通过数组和对象的方式,来为节点动态绑定类名属性。
- 加冒号的,说明值是一个变量或者表达式,没加冒号的后面就是对应的字符串字面量。
- Vue中父组件通过prop传值给子组件时,只有传递字符串常量时,不采用v-bind形式,其余情况(Number类型,Boolean类型,数组,对象等)均采用v-bind形式传递。
1 |
|
事件绑定
- v-on指令,将事件代码绑定到DOM节点上。可简写成@形式。
- 修饰符,可按顺序叠加
- 点击事件@click。键盘事件@keyup,@keydown。鼠标事件@mouseup,@mousedown。
- 事件有捕获阶段和冒泡阶段,捕获阶段由外向内触发(window->document->body->div->a),冒泡阶段由内向外触发(a->div->body->document->window)
名称 | 说明 |
---|---|
.stop | 事件触发时,阻止事件冒泡 |
.prevent | 事件触发时,阻止元素默认行为 |
.capture | 添加事件侦听器时使用事件捕获模式,会在捕获时直接触发。会比冒泡优先执行。 |
.once | 事件触发一次后解除监听 |
.self | 限制事件仅作用于节点自身时触发,冒泡到该元素时不会触发,2.1.4以上 |
.passive | 移动端,限制事件永不调用preventDefault方法,2.3.0以上。一般用在滚动监听@scoll,@touchmove等,让内核线程跳过判断,提高流畅度 |
- 按键修饰符,允许将按键键值作为修饰符来使用。
名称 | 说明 |
---|---|
.delete/tab/enter/esc/left/right/up/down | 删除/制表/回车/退出/左/右/上/下,配合键盘事件使用。 |
.left/right/middle | 左键/右键/中键,配合鼠标事件使用,2.2.0以上 |
.ctrl/alt/shift/meta | ctrl键/alt键/Shift键/meta键,配合点击事件使用,2.1.0以上 |
1 |
|
双向绑定
- v-model指令,为可输入元素创建双向数据绑定,根据元素类型自动更新元素。
- v-model和v-show是Vue内置,开发者无法自定义的指令。
- v-model修饰符,为其后缀以丰富用户输入的行为。
名称 | 说明 |
---|---|
.lazy | 将用户输入的数组赋值于变量的时机由输入时延迟到数据改变时 |
.number | 自动转换用户输入为数值类型 |
.trim | 自动过滤用户输入的首尾空白字符 |
条件渲染和列表渲染
- v-if,v-elseif,v-else
- v-show,切换元素的display属性
- v-for,可以实现数组或对象键值对的列表渲染,数组使用index,键值对使用key。
当使用push、pop、shift、unshift、sort、reverse等方法时,视图会同步更新。如直接使用下标/键名为数组/对象设置成员时,不会将其加入数据响应式系统。
1 |
|
生命周期
1 |
|
三、Vue选项
数据和方法
- 数据(data)
data可接受的类型有对象和函数两种,定义组件时只能使用函数类型。
- 属性(props)
props可以为组件注册动态特性,props选项可以是数组或者对象类型,用于接受从父组件传递过来的参数。可使用类型检测type、默认值default、校验规则required、validator等。
- 方法(methods)
methods中的方法将被绑定到Vue实例上,因此方法中的this会自动指向Vue实例。如使用箭头函数,this将会指向浏览器内置对象windows,因此不要用箭头函数在其中定义方法。
- 计算属性(computed)
当数据链上出现复杂衍生数据时,可以使用computed减轻模板上的业务负担。computed依赖于响应式属性,因此当且仅当响应式属性变化时,computed才会重新计算。computed和methods一样,不能通过箭头函数声明,也会被混入Vue实例,可以通过this调用。
- 侦听属性(watch)
watch属性更注重于处理数据变化时的业务逻辑,相比computed,还可以异步修改数据。
1 |
|
DOM渲染
- 指定被挂在元素(el)
el选项用于指定Vue实例的挂载目标,属性值仅限于CSS选择器或者DOM节点对象。当然也可以使用Vue实例的mount方法手动挂载。
- 视图的字符串模板(template)
Vue允许使用字符串作为实例的模板,模板字符串由template选项接收。
- 渲染函数(render)
render函数用于渲染视图,提供了回调方法createElement以供创建DOM节点。render创建的不是真实的DOM节点,而是虚拟节点(Virtual Node,VNode)。Vue通过VNode在页面中渲染出真实的DOM。
DOM渲染时,el、template和render三个选项的功能是一致的,都是获取实例模板。他们优先级是,render > template > el。
1 |
|
封装复用
- 过滤器(filter)
用于在双括号插值中的JS表达式尾部添加管道符号”|”,表达式的值将作为参数传入filter。当有多个filter时从左向右执行。
- 自定义指令
Vue提供一些钩子函数,通过directives选项进行自定义。自定义指令提供了几个钩子函数:
1、bind,指令与元素绑定时调用
2、inserted,指令绑定的元素被挂载到父元素上时调用
3、update,指令所在VNode更新时调用
4、componentUpdated,指令所在VNode和子VNode全部更新后调用
5、unbind,指令与元素解绑时调用
钩子函数会被传入以下参数:
1、el,指令绑定元素,可用于操作DOM
2、binding,包含指令相关属性的对象。
binding包含以下属性:
1、name,指令名称
2、value,指令绑定的值
3、oldValue,指令值改变前的值
4、arg,传给指令的参数
5、modifiers,修饰符对象
6、vnode,虚拟节点
7、oldNode,虚拟节点更新前的值
- 组件的注册(components)
components用于为组件注册从外部引入的组件。
- 混入(mixins)
默认策略为,data优先采用组件的数据,钩子函数全部调用且先调用mixin的钩子函数,methods、components等优先采用组件的键值对,watch全部调用且优先mixin的watch方法。
1 |
|
内置组件
- 动态组件
- 插槽
- 组件缓存
- 过度效果
vue-cli
1 | $ npm uninstall vue-cli -g |
1 | $ vue init webpack NAME |
- Babel
- TypeScript
- PWA
- Vue-router
- Vuex
- CSS预处理
- eslint prettier
- Unit测试
- e2e测试
1 | $ npm install sass-loader node-sass --save-dev |
其他
v-model 只是语法糖, 下面的两行代码是一致的
1 | <input v-model="message"> |
es6函数
属性名 + 左小括号 + 参数列表(可为空) + 右小括号 + 左大括号 + 函数体 + 右大括号。
1 | <script type="text/javascript"> |
Vue的render函数
1 | <script> |
https://www.jianshu.com/p/7508d2a114d3 Vue render函数
https://www.jianshu.com/p/b12d0d3ad4c1 Vue事件修饰符(二).prevent .passive