一、vue模板语法分为2大类
-
插值语法
-
指令语法
二、插值语法
作用:用于解析标签体内容,可以把vue变量直接显示在标签内,在domo标签的中间使用,将vue的变量插入到模板中,帮我们获取到元素。
语法:{{js表达式}},可以直接读取到data中的所以属性。
演示:
<template>
//只能有一个根标签
<div>
<h1>{{ msg }}</h1>
<h2>{{ obj.name }}</h2>
<h3>{{ obj.age >18 ? '成年' : '未成年'}}</h3>
</div>
</template>
<script>
export default {
data(){ //格式固定,定义vue数据之处
return{ //key相对于变量名
//变量名:变量值
msg:"hello, vue",
obj:{
name:"小vue",
age:5
}
}
}
}
</script>
<style>
</style>
注意:data必须是一个函数,在函数里面 需要 return 一个对象
三、指令语法
作用:用于解析标签(包括:标签属性、标签体内容、绑定事件...)
指令:
1.数据绑定语法:
1.1 v-text
作用:更新元素的 textContent
演示:
<span v-text="msg"></span>
<!-- 和下面的一样 -->
<span>{{msg}}</span>
1.2 v-html
作用:更新元素的 innerHTML
注意:因为容易导致 XSS 攻击,不建议使用
<div v-html="html"></div>
2.条件渲染
2.1 v-show
根据表达式之真假值,切换元素的 display CSS property。
当条件变化时该指令触发过渡效果。
2.2 v-if
有条件地渲染元素
当 v-for 和 v-if 一起使用时,v-for 的优先级比 v-if 更高。
2.3 v-else
不需要表达式
限制:前一兄弟元素必须有 v-if 或 v-else-if。
<div v-if="Math.random() > 0.5">
成功
</div>
<div v-else>
失败
</div>
2.4 v-else-if
限制:前一兄弟元素必须有 v-if 或 v-else-if。
表示 v-if 的“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>
3.v-for
作用:
基于源数据多次渲染元素或模板块。
<div v-for="item in items">
{{ item.text }}
</div>
另外也可以为数组索引指定别名 (或者用于对象的键)
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, name, index) in object"></div>
v-for 的默认行为会尝试原地修改元素而不是移动它们。
<div v-for="item in items" :key="item.id">
{{ item.text }}
</div>
当 v-for 和 v-if 一起使用时,v-for 的优先级比 v-if 更高。
4.v-on
作用:
绑定事件监听器,事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
可以监听子组件触发的自定义事件。
修饰符:
- .stop - 调用 event.stopPropagation()。
- .prevent - 调用 event.preventDefault()。
- .capture - 添加事件侦听器时使用 capture 模式。
- .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
- .{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
- .native - 监听组件根元素的原生事件。
- .once - 只触发一次回调。
- .left - (2.2.0) 只当点击鼠标左键时触发。
- .right - (2.2.0) 只当点击鼠标右键时触发。
- .middle - (2.2.0) 只当点击鼠标中键时触发。
- .passive - (2.3.0) 以 { passive: true } 模式添加侦听器
5.v-bind
单向数据绑定
修饰符:
- .prop - 作为一个 DOM property 绑定而不是作为 attribute 绑定。
- .camel - (2.1.0+) 将 kebab-case attribute 名转换为 camelCase。(从 2.1.0 开始支持)
- .sync (2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的 v-on 侦听器。
用法:
动态地绑定一个或多个 attribute,或一个组件 prop 到表达式。
在绑定 class 或 style attribute 时,支持其它类型的值,如数组或对象。可以通过下面的教程链接查看详情。
在绑定 prop 时,prop 必须在子组件中声明。可以用修饰符指定不同的绑定类型。
没有参数时,可以绑定到一个包含键值对的对象。注意此时 class 和 style 绑定不支持数组和对象。
6.v-model
双向数据绑定
在表单控件或者组件上创建双向绑定
修饰符:
7.v-slot
缩写:#
提供具名插槽或需要接收 prop 的插槽。
<!-- 具名插槽 -->
<base-layout>
<template v-slot:header>
Header content
</template>
Default slot content
<template v-slot:footer>
Footer content
</template>
</base-layout>
<!-- 接收 prop 的具名插槽 -->
<infinite-scroll>
<template v-slot:item="slotProps">
<div class="item">
{{ slotProps.item.text }}
</div>
</template>
</infinite-scroll>
<!-- 接收 prop 的默认插槽,使用了解构 -->
<mouse-position v-slot="{ x, y }">
Mouse position: {{ x }}, {{ y }}
</mouse-position>
8.v-pre
不需要表达式
用法:
跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。
<span v-pre>{{ this will not be compiled }}</span>
9.v-cloak
不需要表达式
<div v-cloak>
{{ message }}
</div>
10.v-once
只能渲染组件和元素一次
四、什么时候用插值语法,什么时候用指令语法
插值语法用于解析标签体内容
指令语法用于解析标签