- 写在
<template>
里的语法 - Vue.js 模板语法是 XML:标签必须闭合,空 div 可写成
<div />
- 在底层实现上,vue 将模板编译成虚拟 DOM 渲染函数,结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。
- 可以不用模板,自己写渲染(render)函数
插入表达式 {{}}
声明式渲染: 声明式地将数据渲染进 DOM 的系统
所有数据都是响应式的,当 app.message
更新时, 页面也会跟着变化
不再与 HTML 直接交互。一个 Vue 应用会将其挂载到一个 DOM 元素上 (这里是 #app
) 然后对其进行完全控制。那个 HTML 是我们的入口,但其余都会发生在新创建的 Vue 实例内部
文本插值
<div id="app">
<!-- "Mustache" 语法:响应式 -->
<div> {{ message }} </div>
<!-- v-once 指令:一次性插值,非响应式 -->
<div v-once>{{ message }}</div>
</div>
new Vue({
el: '#app',
data: {
message: 'Hi'
}
})
原始 HTML
- 双大括号会将数据解释为普通文本,若要输出真正的 HTML ,要使用
v-html
指令
<p>Using mustaches: {{ rawHtml }}</p>
<p>
Using v-html directive: <span v-html='rawHtml'></span>
</p>
span
的内容将会被替换成为 property 值 rawHtml
,直接作为 HTML——会忽略解析 property 值中的数据绑定
可使用 JS 表达式绑定数据,每个绑定只能包含单个表达式,不能包含语句
{{ number + 1 }}
{{ ok ? 'yes' : 'no' }}
{{ message.split('').reverse().join('')}}
<div v-bind:id="'list-' + id"></div>
<!-- 语句无效,必须为单个表达式 -->
{{ var a = 1 }}
指令 Directives
- 指令是带有
v-
前缀的特殊 attribute - 指令是为了减少重复的 DOM 操作
绑定属性 v-bind
- 从 2.6.0 开始,可以用
[]
括起来的 JavaScript 表达式作为一个指令的参数 []
中不能有空格和引号[]
中变量名不使用大写,因为浏览器会全部转换为小写- 动态参数可接受唯一的非字符串类型的值为
null
, 该值可用于移除绑定
<!-- 绑定元素 -->
<a v-bind:href="url"> ... </a>
<!-- 若 key = "href", 则等价于 v-bind:href -->
<a v-bind:[key]="url"> ... </a>
<!-- v-bind缩写 -->
<a :href="url"> ... </a>
<a :[key]="url"> ... </a>
<div :style={width: 10%}></div>
绑定事件 v-on
使用 v-on`指令进行事件绑定
<!-- 绑定事件 -->
<a v-on:click="playTwoDays"> ... </a>
<a v-on:[event]="playTwoDays"> ... </a>
<!-- v-on缩写 -->
<a @click="playTwoDays"> ... </a>
<a @[event]="playTwoDays"> ... </a>
- 直接写 JS 代码
<div id="app">
<span>{{ number }}</span>
<button @click="number += 1">
+1
</button>
</div>
new Vue({
el: '#app',
data: {
number: 0
}
})
- 接收可调用的方法名 or 在内联 JS 语句中调用方法
<div id="app">
<span>{{ number }}</span>
<!-- 接收可调用的方法名 -->
<button @click="add1"> <!-- 在内联 JS 语句中调用方法: <button @click="add1()"> -->
+1
</button>
</div>
new Vue({
el: '#app',
data: {
number: 0
},
methods: {
add1() {
this.number += 1
}
}
})
条件渲染 v-if
v-if
指令:条件性地渲染一块内容,只有在指令地表达式返回 true 时才会被渲染
控制切换一个元素是否显示:
<div id="app-3">
<p v-if="seen">
出现!
</p>
</div>
new Vue({
el: '#app-3',
data: {
seen: true // 在控制台输入 app3.seen = false 则信息消失
}
})
v-else-if
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>
v-show
:只是简单地切换元素的 CSS propertydisplay
一般来说,v-if
有更高的切换开销,而 v-show
有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show
较好;如果在运行时条件很少改变,则使用 v-if
较好。
<h1 v-show="ok">Hello!</h1>
循环渲染 v-for
v-for
用于遍历数组来渲染一个列表- 遍历值
item in items
- 遍历值与索引
(item, index) in items
- 可用
of
代替in
,即item of items
- 遍历值
<!-- 遍历打印数组 -->
<div id="app-4">
<ol>
<li v-for="(item, index) in items" :key="item.message">
{{ item.message }} - {{ index }}
</li>
</ol>
</div>
new Vue({
el: '#app-4',
data: {
items: [
{message: '吃饭'},
{message: '睡觉'},
{message: '打豆豆'}
]
}
})
// out:
// 1. 吃饭 - 0
// 2. 睡觉 - 1
// 3. 打豆豆 - 2
在控制台输入 `app4.items.push({message: ‘继续打豆豆’}),列表最后会添加一条信息
v-for
遍历对象:- 遍历值
value in obj
- 遍历键值对
(value, key) in obj
- 遍历键值对与索引
(value, key, index) in obj
- 遍历值
<div id="app" v-for="(value key) in obj">
{{key}}: {{value}}
</div>
new Vue({
el: '#app',
obj: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10'
}
})
// out:
// title: How to do lists in Vue
// author: Jane Doe
// publishedAt: 2016-04-10
- 当
v-if
与v-for
一起使用时,v-if
具有比v-for
更高的优先级,一般不推荐一同使用,除了有些情况:- 只为部分项渲染节点 ```html
- {{ todo.name }}
- 跳过某些循环渲染
```html
<ul v-if="todo.length">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
- Vue 使用
v-for
渲染元素列表时,默认使用“就地更新”策略,如果列表项顺序改变,Vue 不会移动 DOM 元素,而是就地更新每个元素,若需要Vue跟踪每个节点的身份,从而重用和重新排序现有元素,则需要给每项提供一个唯一的key
<div v-for="item in items" :key="item.id">
<!-- 内容 -->
</div>
- 数组更新:Vue 对数组的操作进行了封装,包括
自定义指令
修饰符
v-on
事件修饰符
event.preventDefault
阻止默认事件event.stopPropagation
阻止冒泡event.once
事件只促发一次<a @clicl.once = "doSomeThing"></a>
按键修饰符
监听键盘事件时得到按键的信息
<!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
<input @keyup.enter="submit">
<input @keyup.13="submit">
Vue 提供了常用按键码的别名:.enter
, .tab
, .esc
, .space
, up
, .down
, .left
, .right
- 鼠标按钮修饰符
v-bind
.prop .camel .sync
v-model
- .lazy
- .number
- .trim