Vue.js 权威指南
第1章 遇见Vue.js
MVVM
M 模型(Model), V 显示(View), V 显示模型(ViewModel) 实现了ViewModel 自动同步到 View
Vue.js是什么
Vue.js是一个构建数据驱动的Web界面的库
Vue.js特性
- 轻量
- 数据绑定
- 指令
- 插件化
Vue.js的Hello World
1 | <!DOCTYPE html> |
第2章 数据绑定
语法
插值
使用双大括号
1 | {{}} |
插入HTML片段
1 | {{{}}} |
表达式
双大括号中可以插入表达式
1 | {{cents/100}} |
指令
1 | v-if="show" |
分隔符
可以在Vue.config中配置绑定的语法
delimiters
1
Vue.config.delimiters = ["<%","%>"] 将默认的{{}} 改为<%%>
unsafeDelimiters
1
Vue.config.unsafeDelimiters = ["<%","%>"] 将默认的HTML插值改为<%%>
第3章 指令
内部指令
v-if
判断语句
1 | <div id="didi-navigator"> |
v-show
是否显示,不显示的时候,使用样式表 display:none,这里和v-if的显示不同。
1 | <body> |
v-else
必须同 v-if
或 v-show
一起使用充当else功能
1 | <body> |
v-model
v-model 绑定input, select, text, checkbox, radio等表单控件的双向数据
** v-model参数 **
number 将用户的输入自动转换为Number类型
lazy 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32<body>
<div id="didi-navigator">
<ul v-show="ok">
<li v-for="tab in tabs">
{{tab.text}}
</li>
</ul>
<p v-if="ok">我是对的</p>
<p v-else="ok">我错了</p>
<input v-model.lazy="msg"><br>
{{msg}}
</div>
<script>
new Vue({
el: '#didi-navigator',
data: {
tabs: [
{text: '巴士'},
{text: '快车'},
{text: '专车'},
{text: '顺风车'},
{text: '出租车'},
{text: '代驾'}
],
ok: false,
msg: "内容是在change事件后才改变的"
}
})
</script>
</body>trim 如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符
v-for
for循环
1 | <body> |
Vue.js 1.0.17及以后版本都支持of分割符 item in/of items
v-text
使用v-text可以使用Mustache语法轻松的操控元素中的纯文本
1 | <body> |
v-html
使用v-html可以使用Mustache语法轻松的操控元素中的HTML片段(不推荐使用,容易导致XSS攻击)
v-bind
v-bind将一个或多个attribute动态绑定到表达式, v-bind:
可以缩写为:
1 | <body> |
v-on
v-on 用于绑定事件监听器。v-on:
可以缩写为 @
1 | <body> |
相关事件修饰符
- .stop 阻止冒泡
- .prevent 阻止默认行为
- .capture 添加事件侦听器时使用capture模式
- .self 绑定元素本身时触发回调
1 | <!-- 阻止单击事件继续传播 --> |
v-el 和 v-ref被 ref所替换
为DOM元素注册一个索引,方便通过所属势力的$els访问这个元素。
1 | <body> |
v-pre 可以用来显示原始Mustahce标签。
1 | <body> |
v-cloak 这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。
v-cloak 在CSS样式表中添加
自定义指令
基础
一、钩子函数
+ bind 只调用一次,指令第一次绑定到元素上时调用
+ update 在bind之后立即以初始值为参数第一次调用,之后每当绑定值变化时调用。
+ unbind 只调用一次,在指令从元素上解绑时调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Vue.directive('my-directive', {
bind: function(){
//准备工作
//例如,添加事件处理器或只需要运行一次的高耗任务
},
update: function(newValue, oldValue){
//值更新时的工作
//也会以初始值为参数调用一次
},
unbind: function(){
//清理工作
//例如,删除bind()添加的事件监听器
}
})
+ 注册之后,在Vue.js模板中添加前缀 `v-` 使用
如 `<div v-my-directive="someValue">`
二、指令实例属性(2.x更新了此属性)
属性 | 说明 |
---|---|
el | 指令绑定的元素 |
vnode | Vue 编译生成的虚拟节点。 |
oldVnode | 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。 |
binding | 一个对象,包含以下属性 |
expression | 指令的表达式,不包括参数和过滤器 |
arg | 指令的参数 |
value | 指令的绑定值,例如:v-my-directive=”1 + 1” 中,绑定值为 2。 |
oldValue | 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。 |
name | 指令的名字,不包含前缀 |
modifiers | 一个对象,包含指令的修饰符 |
以上属性视为只读
不同于 Vue 1.x,所有的挂载元素会被 Vue 生成的 DOM 替换。因此不推荐挂载root实例到 `<html>` 或者 `<body>` 上。
**Vue去掉警告 You are running Vue in development mode**
这样解决:
`Vue.config.productionTip = false`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<body>
<div id="example" @click='up' style="height: 500px; width: 100%; background: #CC0000">
<div id="demo" v-demo:hello.a.b="message"></div>
</div>
<script>
Vue.config.productionTip = false;
Vue.directive('demo', {
bind: function (el, binding, vnode) {
var s = JSON.stringify
el.innerHTML =
'name: ' + s(binding.name) + '<br>' +
'value: ' + s(binding.value) + '<br>' +
'expression: ' + s(binding.expression) + '<br>' +
'argument: ' + s(binding.arg) + '<br>' +
'modifiers: ' + s(binding.modifiers) + '<br>' +
'vnode keys: ' + Object.keys(vnode).join(', ')
}
})
new Vue({
el: '#example',
data: {
message: 'hello!'
}
})
</script>
</body>
三、对象字面量
如果指令需要多个值,可以传入一个 JavaScript 对象字面量。记住,指令函数能够接受所有合法类型的 JavaScript 表达式。
1 | <div id="demo" v-demo="{color: 'write', text: 'Hello!'}" ></div> |
四、字面修饰符
当指令使用了字面修饰符时,他的值将按普通字符串处理并传递给update方法。update方法将只调用一次,因为普通字符串不能相应数据变化。
五、元素指令(Vue.js V2.0已移除)有时我们想以自定义元素的形式使用指令,而不是以属性的形式。
高级选项
Vue.js允许注册自定义指令。
params
自定义指令可以接受一个params数组,制定一个特性列表,Vue编辑器将自动提取绑定元素的这些特性。(之后补充例子)
deep
自定义指令使用在一个对象上,当对象内部属性变化时要触发update,则在指令定义对象中指定deep: true
注意监听数组的变动不需要这么做。(之后补充例子)
第4章 计算属性
什么是计算属性
当其依赖属性的值发生变化时,这个属性的值会自动更新,与之相关的DOM部分也会同步自动更新
1 | <body> |