模板语法03–模板语法
vue模板语法
vue.js使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所以Vue.js的模板都是合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。
插值文本
数据绑定最常见的形式就是使用"Mustache"语法(双大括号)的文本插值
范例:设置标题
<h2 >
<!-- 插值文本 -->
{
{
title}}
</h2>
特性
Mustache 语法不能作用在 HTML attribute 上,遇到这种情况应该使用 v-bind 指令:
范例:设置标题
<!-- 特性、属性值绑定使用v-bind命令 -->
<h2 v-bind:title="title">
...
</h2>
列表渲染
一、用 v-for 把一个数组对应为一组元素
我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。
<ul id="example-1">
<li v-for="item in items" :key="item.message">
{
{
item.message }}
</li>
</ul>
var example1 = new Vue({
el: '#example-1',
data: {
items: [
{
message: 'Foo' },
{
message: 'Bar' }
]
}
})
- v-for 还支持一个可选的第二个参数,即当前项的索引。
<ul id="example-2">
<li v-for="(item, index) in items">
{
{
parentMessage }} - {
{
index }} - {
{
item.message }}
</li>
</ul>
var example2 = new Vue({
el: '#example-2',
data: {
parentMessage: 'Parent',
items: [
{
message: 'Foo' },
{
message: 'Bar' }
]
}
})
二、在 v-for 里使用对象
- 你也可以用 v-for 来遍历一个对象的 property。
<ul id="v-for-object" class="demo">
<li v-for="value in object">
{
{
value }}
</li>
</ul>
new Vue({
el: '#v-for-object',
data: {
object: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10'
}
}
})
- 你也可以提供第二个的参数为 property 名称 (也就是键名):
<div v-for="(value, name) in object">
{
{
name }}: {
{
value }}
</div>
- 还可以用第三个参数作为索引:
<div v-for="(value, name, index) in object">
{
{
index }}. {
{
name }}: {
{
value }}
</div>
表单输入绑定
你可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
<input v-model="food" type="text" v-on:keydown.enter="addCourse">
事件处理
可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。
范例:增加食物
<!-- 事件处理 -->
<button v-on:click="addFood">新增</button>
const app = new Vue({
el:"#app",
data() {
return {
food:"",
foodList:["萝卜","白菜"]
}
},
methods: {
addFood() {
this.foodList.push(this.food);
this.food = "";
}
},
});
class与style绑定
操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attribute,所以我们可以用 v-bind
处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind
用于 class
和 style
时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。
范例:点选样式
<style>
.active {
background: #ddd;
}
</style>
<!-- class动态绑定-->
<div v-for="item in foodList" :key="item" :class="{active:selectedFood == item}" @click="selectedFood = item">
<!-- 冒号前面的key为class的名称,取决于 冒号后面的表达式 -->
{
{
item}}
</div>
<!-- style动态绑定 -->
<div v-for="item in foodList" :key="item" :style="{backgroundColor:selectedFood == item ? '#ddd' : 'transparent' }"
@click="selectedFood = item">
<!--
:style="{backgroundColor:selectedFood == item ? '#ddd' : 'red' }"
:style="{'background-color':selectedFood == item ? '#ddd' : 'red' }"
-->
<!--
对象中,冒号前面的为style,可以用 'background-color' 或者 backgroundColor
冒号后面为背景色的值
-->
{
{
item}}
</div>
const app = new Vue({
el: "#app",
data() {
return {
selectedFood: "",
}
},
});
条件渲染
v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。
范例:没有数据的时候的显示
<!-- 条件 编译-->
<p v-if="foodList.length == 0">没有数据</p>
<!-- v-else 配合 v-if 使用 -->
<div class="food_list" v-else >
<div v-for="item in foodList" :key="item.id"
:style="{backgroundColor:selectedFood == item.id ? '#ddd' : 'transparent' }"
@click="selectedFood = item.id">
{
{item.name}}
</div>
</div>
v-show vs v-if
- v-show通过css属性display控制元素显示,元素总是存在
- v-if惰性渲染元素,若一开始条件为falsy,元素是不存在的