模板语法
展示内容
- 表达式
{{object.a}}表达式,构造选项中data内的object中的a显示出来 -{{n+1}}可以写任何运算,但不知支持逻辑判断(if/else){{fn(n)}}可以调用函数,调用在methods里的fn函数- 如果值为undefined或者null就不显示
- 另一种写法为
<div v-text="表达式"></div>,此方法与以上方法等价,但不常用
- 展示HTML内容
- 假设data.x的值为 "< strong>hi</ strong> ",不显示字符串,而是显示成HTML标签
-
<div v-html="x"></div>即可显示粗体的hi
- 假设data.x的值为 "< strong>hi</ strong> ",不显示字符串,而是显示成HTML标签
-
- 只展示{{n}}字段,不编译
<div v-prev> {{n}} </div>不会对内容进行编译
绑定属性
- 绑定src
<img v-bind:src="x" />x的值为url- 简写
<img :src="x" />把x的值求出来,赋值给img的src属性
- 绑定对象
修改div的样式
<div :style="{border:'1px solid red',height:100}">
</div>
绑定事件
- v-on事件
<button v-on:click="add">+1</button>点击之后,Vue会运行add()函数<button v-on:click="xxxx(1)">xxxX</button>点击之后,Vue会运行xxx(1)<button v-on:click="n+=1">xxxX</button>点击之后Vue会运行n+=1- 即发现函数就自动加上括号调用,否则直接运行代码
- 缩写
<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="(u,index) in users" :key="index"> // 数组是users,u是值,index是索引
索引:{{index}} 值:{{u.name}}
</li>
</ul>
对象遍历
<ul>
<li v-for="(value,name) in obj" :key="name"> // 对象是obj,value是属性值,name是属性名
属性名:{{name}} 属性值:{{name}}
</li>
</ul>
显示、隐藏
- v-show
<div v-show="n%2===o">n是偶数</div>判断n是否为偶数,选择显示或者隐藏内容。这是语法糖 - 近似等于
<div :style="{display:n%2===0?'block':'none'}">
n是偶数
</div>
- 注意:看得见的元素的dispaly值不只有block - 如table的display值为table - 如li的dispy为list-item
总结
Vue模板主要特点有
- 使用XML语法,不是HTML
- 使用{{}}插入表达式
- 使用v-html v-on v-bind等指令操作DOM
- 使用v-if v-for等指令实现条件判断和循环
指令 Directive
- 支持修饰符的指令
@click.stop="add"表示阻止事件传播/冒泡泡@click.prevent="add"表示阻止默认动作@click.prevent="add"同时表示两种意思
- 常用修饰符
- v-on支持的有
- .{keycode|keyAlias}即按键码/按键别名,
.stop.prevent.capture.self.once.passive.native` - 快捷键相关:.ctrl .alt .shift .meta .exact
- 鼠标相关
.left.right.middle
- .{keycode|keyAlias}即按键码/按键别名,
- v-bind 支持的有
.prop.camel.sync - v-model 支持的有
.lazy.number.trim
- v-on支持的有
.sync修饰符
场景描述
- Vue规则:组件不能修改外部数据
- Vue规则:
$emit可以触发事件并传参 - Vue规则:
$event可以获取$emit的参数
举例
常规方法
父组件
<template>
<div class="app">
父组件还剩下{{total}}
<hr>
<Child :money="total" v-on:update:money="total=$event" /> //父组件监听 update:money 事件 让父组件的total等于子组件的返回值
// update:money是整体,Vue建议这样写
//$event是vue提供的变量,用于存放子组件事件的返回值
</div>
</template>
<script>
import Child from './child.vue'
export default {
components: { Child },
data(){
return {total:1000}
}
}
</script>
<style>
.app{
border: 3px solid red;
}
</style>
子组件
<template>
<div>
子组件用剩下的{{money}}
<button @click="$emit('update:money',money-100)">//子组件点击事件,触发update:money,返回值为money-100
//$emit 触发事件,并返回值 :money-100
</div>
</template>
<script>
export default{
props:["money"]
}
</script>
使用.sync方法
以下代码简写
父组件
<Child :money.sync="total" />
//子组件修改了值,.sync使得父组件同步这个变化
由于这种场景很常见,所以Vue里面封装了.sync
-
:money.sync="total" 等价于`:money="total" v-on:updatate:money="total"=$event"