Vue模板语法
- Vue完整版,写在HTML里
1
2
3
4<div id="xxx">
{{n}}
<button @click="add">+1</button>
</div>
1 | new Vue({ |
Vue完整版,写在选项里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<div id="app"></div>
new Vue({
data: {
n: 0
},
template: `
<div>
{{ n }}
<button @click="add">+1</button>
</div>
`,
methods: {
add(){
this.n += 1
}
}
}).$mount('#app')Vue非完整版,配合xxx.vue文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20-- .vue文件 --
<template> // template标签里不是html而是xml(xml必须是闭合标签)
<div>
{{n}}
<button @click="add">+1</button>
</div>
</template>
<script>
export default {
data(){ <!--- vue组件里的data必须是函数 -->
return {n: 0}
},
methods: {
add() {
this.n += 1
}
}
}
</script>
1 | -- main.js文件 -- |
模板里有哪些语法
我们把html模板叫做template
一、展示内容:
1. 表达式
- 该表达式意为 把构造选项里data的 object.a 显示到HTML里
- NaN 可以写任何运算
- 可以调用函数,会在methods里找
- 若值为 null、undefined 就不显示
2. html内容
- 假设 data.x 值为 hi ,默认显示的时候就是 hi
- 若想展示粗体的 hi ,使用
3. 单纯想展示
1 | <div v-pre> {{ n }} </div> |
- v-pre 不会对模板进行编译,就只是单纯展示字符
二、绑定属性:
1 | <!--绑定src--> |
1 | <!--绑定对象--> |
三、绑定事件:
v-on:事件名
1 | <button v-on:click="add">+1</button> <!-- 点击后 运行add()--> |
四、条件判断:什么时候出现在DOM数中
if…else
1 | <div v-if="x>0"> 若x大于0,显示这个div </div> |
for循环
for(value,key) in 数组或对象1
2
3
4
5
6
7
8
9
10
11
12<!--数组例子-->
<ul>
<li v-for="(u,index) in users" :key="index"></li>
<!-- 将users里的每一项以u和index代替,u表示数组里的值value,index表示下标
使用时: 索引: {{ index }}、值: {{ u.name }} -->
</ul>
<!-- 对象例子 -->
<ul>
<li v-for="(value,name) in obj" :key="name"></li>
<!-- 一般来说使用了v-for,就必须有一个:key="",且key须用一个不会重复的值 -->
</ul>
显示、隐藏:
1 | <div v-show="n%2 === 0"> n为偶数 </div> |
指令Directive
什么是指令
1 | <!--以 v- 开头的就是指令--> |
语法
- v-指令名:参数=值,如 v-on:click=’add’
- 如果值里没有特殊字符,则可以不加引号
- 有些指令没有参数和值,如 v-pre
- 有些指令没有值,如 v-on:click.prevent 阻止默认事件
google
修饰符
一些指令支持修饰符
- @click.stop=”add” 阻止事件传播/冒泡
- @click.prevent=”add” 阻止默认动作
- @click.stop.prevent=”add” 既阻止事件传播,也阻止默认动作
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
29new Vue({
data:{
n:0
},
template:`
<div>
{{n}}
<a @click.prevent="x" href="https://google.com">google</a>
<input @input="y"/>
<input @keypress="z" />
<button @click=add>+1</button>
</div>
`,
methods:{
add(){
this.n += 1
},
x(){
console.log('xxx')
},
y(e){
console.log(e.target.value)
},
z(e){
if(e.keyCode === 13)
console.log('用户打了回车')
}
}
}).$mount("#app")
上述例子用修饰符的简单写法1
2
3
4
5
6
7
8
9
10
11
12new Vue({
template:`
<input @keypress.13 === "y" />
<input @keypress.enter === "y" />
`,
methods:{
y(e){
console.log('用户打了回车')
}
}
// keyCode很难记,比如 13是回车,1是49,所以使用 alias别名,如 @keypress.enter
})
具体可参考官方文档:
https://cn.vuejs.org/v2/guide/events.html?#%E6%8C%89%E9%94%AE%E4%BF%AE%E9%A5%B0%E7%AC%A6
有多少修饰符呢?
- v-on 支持的有 .{keyCode | keyAlias} .stop .prevent .capture(在捕获阶段监听) .self .once(只会触发一次的事件) .passive .native
- 快捷键相关 .ctrl .alt .shift .meta .exact
- 鼠标相关 .left .right .middle
- v-bind 支持的有 .prop .camel .sync
- v-model 支持的有 .lazy .number .trim
Vue需要重点了解的修饰符
@click.stop=”xxx” 阻止事件冒泡
由于冒泡机制,给元素绑定点击事件的时候,也会触发父级元素的绑定事件
1
2
3
4
5
6
7
8
9
10<div @click="shout(2)">
<button @click="shout(1)">ok</button>
</div>
shout(e){
console.log(e)
}
// 1
// 2@click.stop 可以阻止事件冒泡,相当于调用了 event.stopPropagation()
1
2
3
4<div @click="shout(2)">
<button @click.stop="shout(1)">ok</button>
</div>
// 只输出1
@click.prevent=”xxx” 阻止默认事件
- @click.prevent用于阻止默认事件,相当于写 event.preventDefault()
1
2<a @click.prevent href="https://google.com">google</a>
// 点击链接不会跳转
.sync 修饰符
场景描述:
- 爸爸给儿子钱,儿子要花钱怎么办? 儿子打电话(触发事件),向爸爸要钱
Vue规则:
- 组件不能修改 props 外部数据
- this.$emit 可以触发事件,并传参
- $event 可以获取 $emit 传来的参数
1 | // 父组件 App.vue |
1 | // 子组件Child.vue |
1 | <button @click="$emit('update:money', money - 100)"></button> |