Vue模板三种写法
一 完整版,写到HTML中
<div id=xxx>
{{n}}
<button @click="add">+1</button>
</div>
new Vue({
el:"#xxx",
data:{n:0}, //data可以改成函数
methods:{add(){}}
})
二 完整版,写到选项里。注意,div#app会被替换掉
<div id=app></div>
new Vue({
template:`
<div>
{{n}}
<button @click="add">+1</button>
</div>
`,
data:{n:0},
methods:{add(){this.n += 1}}
}).$mount("#app")
三 非完整版,配合xxx.vue文件,注意template里面是xml,而不是html。
xml中,1 无内容标签可以直接闭合
为什么Vue模板xml语法?因为xml更容易写编译器。
<template>
<div>
{{n}}
<button @click="add">+1</button>
</div>
</template>
<script>
export default{
data(){return {n:0}}
methods:{add(){this.n += 1}}
}
</script>
<style>
</style>
在另一个地方引用xxx.vue文件
import Xxx from './xxx.vue'
///Xxx是一个options对象
new Vue({
render:h=>h(Xxx)
}).$mount('#app')
模板中有哪些语法
表达式
{{object.a}} 表达式
{{n+1}} 可以写任何运算
{{fn(n)}} 可以调用函数
如果值为undefined或null就不会显示了
另一种写法为<div v-text="表达式"></div>
HTML内容
假设data.x的值为hi
这是声明式,而命令式是:div.innerHTML = xxx
就想展示:{{n}}
<div v-pre>{{n}}</div>
v-pre不会对这段{{n}}进行编译,直接原样展示。
绑定属性
绑定src,用v-bind
<img v-bind:src="x" />
v-bind:简写为
<img :src="x" />
绑定对象
<div :style="{border:'1px solid red',height:100}">
注意这里可以把'100px'写成100
</div>
绑定事件
v-on:事件名
<button v-on:click="add">+1</button>
点击之后,Vue会运行add(),这个括号是自动加上的
<button v-on:click="xxx(1)">xxx</button>
点击之后,Vue会运行xxx(1)
<button v-on:click="n+=1">xxx</button>
点击之后,Vue会运行n+=1
即发现函数就加括号调用之,否则就直接运行代码
这导致一个问题,如果xxx(1)返回一个函数咋办
答:用Vue的人怎么可能想出这么复杂的用法,一般不会遇到这种情况的。
如果硬要解决:把xxx(1)赋值给add变量,然后v-on:click="add"即可。
缩写,例如@click
<button @click="add">+1<button>
条件判断
if…else
<div v-if="x>0">
x大于0
</div>
<div v-else-if="x===0">
x为0
</div>
<div v-else>
x小于0
</div>
循环
for(value,key) in 对象或数组
<ul>
<li v-for="(user,index) in users" :key="index"> //key="index"有bug
索引:{{index}}值:{{user.name}}
</li>
</ul>
<ul>
<li v-for="(value,name) in obj" :key="name">
属性:{{name}}属性值:{{name}}
</li>
</ul>
显示、隐藏
v-show
<div v-show="n%2===0">n是偶数</div>
近似等于
<div :style="{display:n%2===0?'block':'none'}">n是偶数</div>
但你要注意,看得见的元素display不只有block
如table的display默认为table
如li的display默认为list-item
模板语法总结
Vue模板特点
使用XML语法(不是HTML)
使用{{}}插入表达式
使用v-html v-on v-bind等指令操作DOM
使用v-if v-for等指令实现条件判断和循环
还没讲的指令
v-model在Vue表单里讲
v-slot在Vue插槽里讲
v-cloak看文档
v-once看文档
指令Directive
什么是指令?
<div v-text="x"></div> 以v-开头的就是指令
语法
v-指令名:参数=值,如v-on:click=add
如果值里没有特殊字符,则可以不加引号
有些指令没有参数和值,如v-pre
有些指令没有值,如v-on:click.prevent,prevent是阻止默认事件
修饰符
有些指令支持修饰符
@click.stop="add"表示阻止事件传播/冒泡
@click.prevent="add"表示阻止默认动作
@click..stop.prevent="add"同时表示两种意思
一共有多少种修饰符呢?
v-on支持有
.{keycode|keyAlias} keyAlias是别名的意思
.stop 阻止冒泡
.prevent
.capture 捕获阶段监听
.self 点击的元素就是监听的元素,就触发
.once 只触发一次
.passive
.native
快捷键相关
.ctrl 按下ctrl时触发
.alt
.shift
.meta
.exact
鼠标相关
v-bind支持的有
v-model支持的有
需要记住的只有三个
.sync 修饰符
场景描述
爸爸给儿子钱,儿子要花钱怎么办?
答:儿子打电话(触发事件)向爸爸要钱
Vue规则:组件不能修改props外部数据
Vue规则:$emit可以触发事件,并传参
Vue规则:$event可以获取$emit的参数
由于这种场景很常见,所以发明了.sync
发明了.sync
:money.sync="total"
等价于
这是App.vue,(total是data里的数据)
<Child :money="total" v-on:useMoney="total=$event" />
这是child.vue
<button @click="$emit('useMoney',money - 100)">花钱</button>
而官方推荐这样写
App.vue
<Child :money="total" v-on:update:money="total=$event" />
child.vue,事件名叫update:money,这是一个整体,:号没有其他含义
<button @click="$emit('update:money',money - 100)">花钱</button>
用.sync简写
App.vue中
<Child :money.sync="total" />
资料来源:饥人谷