Vue的Temlate语法
1.插值
插值的定义
就是在data中定义了一些属性的值插入到DOM中渲染显示。
语法名称 | 语法格式 | 语法用途 |
---|---|---|
Mustache | {{属性名称}} | 将data属性中的值插入到DOM中 |
v-once指令 | <标签体 v-once>{{属性名}} | 你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上的其它数据绑定 |
v-html指令 | <标签体 v-html='属性名'> | 输出真正的 HTML |
v-text指令 | <标签体 v-text='属性名'> | 输出的是文本,和Mustache基本一致 |
v-pre指令 | <标签体 v-pre='属性名'> | 就是想让标签体内的东西原封不动的展示,不进行解析 |
v-cloak指令 | <标签体 v-cloak> | 在vue解析之前有这个属性的标签是不会显示的,display:none,vue解析之后就会将v-cloak删掉 |
Mustache:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Interpolation</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--Mustache语法-->
<span>{{msg}}</span><br/>
<span>{{msg}}!</span><br/>
<!--大括号内可以有简单的表达式-->
<span>{{name + ' : ' + phone}}</span><br/>
<!--可以在大括号里面进行四则运算-->
<span>{{money + 1000}}</span><br/>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
msg: 'msg',
name: '张三',
phone: '333',
money: 4000,
}
})
</script>
</body>
</html>
v-once:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Interpolation</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--Mustache语法-->
<span>{{msg}}</span><br/>
<span>{{msg}}!</span><br/>
<!--大括号内可以有简单的表达式-->
<span>{{name + ' : ' + phone}}</span><br/>
<!--可以在大括号里面进行四则运算-->
<span>{{money + 1000}}</span><br/>
<span v-once>{{msg}}</span>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
msg: 'msg',
name: '张三',
phone: '333',
money: 4000,
}
})
</script>
</body>
</html>
v-html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Interpolation</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--Mustache语法-->
<span>{{msg}}</span><br/>
<span>{{msg}}!</span><br/>
<!--大括号内可以有简单的表达式-->
<span>{{name + ' : ' + phone}}</span><br/>
<!--可以在大括号里面进行四则运算-->
<span>{{money + 1000}}</span><br/>
<span v-once>{{msg}}</span>
<!--可以将html形式得字符串,以html得格式渲染-->
<span v-html="title"><span><br/>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
msg: 'msg',
name: '张三',
phone: '333',
money: 4000,
title: '<h1>Interpolation</h1>'
}
})
</script>
</body>
</html>
v-text:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Interpolation</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--Mustache语法-->
<span>{{msg}}</span><br/>
<span>{{msg}}!</span><br/>
<!--大括号内可以有简单的表达式-->
<span>{{name + ' : ' + phone}}</span><br/>
<!--可以在大括号里面进行四则运算-->
<span>{{money + 1000}}</span><br/>
<span v-once>{{msg}}</span>
<!--可以将html形式得字符串,以html得格式渲染-->
<span v-html="title"></span><br/>
<span v-text="text"></span><br/>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
msg: 'msg',
name: '张三',
phone: '333',
money: 4000,
title: '<h1>Interpolation</h1>',
text: 'v-text指令'
}
})
</script>
</body>
</html>
v-pre:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Interpolation</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--Mustache语法-->
<span>{{msg}}</span><br/>
<span>{{msg}}!</span><br/>
<!--大括号内可以有简单的表达式-->
<span>{{name + ' : ' + phone}}</span><br/>
<!--可以在大括号里面进行四则运算-->
<span>{{money + 1000}}</span><br/>
<span v-once>{{msg}}</span>
<!--可以将html形式得字符串,以html得格式渲染-->
<span v-html="title"></span><br/>
<!--v-text-->
<span v-text="text"></span><br/>
<!--v-pre-->
<span v-pre>{{msg}}</span><br/>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
msg: 'msg',
name: '张三',
phone: '333',
money: 4000,
title: '<h1>Interpolation</h1>',
text: 'v-text指令'
}
})
</script>
</body>
</html>
小结:
v-text 与 Mustache不同之处
1.当页面的数据过大或者网络不好,又或者js延缓执行,Mustache是会暴露你写在DOM中的Mustache表达式的如:{{msg}}当然可以和v-cloak联用解决这个问题,而v-text指令则不会,它会直接隐藏。
2.v-text不够灵活,它会直接覆盖标签体内的内容。
2.绑定
绑定的定义:
将data中的属性的值,绑定到标签属性上不同于插值绑到标签体内。
语法名称 | 语法格式 | 语法用途 |
---|---|---|
v-bind指令 | <标签体 v-bind:属性名称='值'> | 将data中的属性的值,绑定到标签属性上 |
v-bind的语法糖 | <标签体 :属性名称='值'> | 其实就是v-bind指令的简写 |
v-for指令 | <标签体 v-for=‘(元素,index) in 数组名称’> | 在该需要的循环添加的标签上添加 |
v-on指令 | <标签体 v-on:[事件名称]='[调用的方法名称]'> | 给该标签的事件绑定Vue中的方法 |
v-on的语法糖 | <标签体 @[事件名称]='[调用的方法名称]'> | v-on指令的简写 |
v-bind:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Binding</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--将data属性中的值绑定到href属性上-->
<!--v-bind的简写-->
<a v-bind:href="ahref">跳转</a>
<a :href="ahref">baidu</a>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
ahref: 'https://www.baidu.com/'
}
})
</script>
</body>
</html>
按跳转之后就到了百度了
绑在class上:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Binding</title>
<link rel="stylesheet" type="text/css" href="../css/vuecss.css">
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--将data属性中的值绑定到href属性上-->
<!--v-bind的简写-->
<a v-bind:href="ahref" v-bind:class="aclass">跳转</a>
<a :href="ahref" :class="aclass">baidu</a>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
ahref: 'https://www.baidu.com/',
aclass: 'binding'
}
})
</script>
</body>
</html>
给class绑定一个对象:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Binding</title>
<link rel="stylesheet" type="text/css" href="../css/vuecss.css">
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--将data属性中的值绑定到href属性上-->
<!--v-bind的简写-->
<a v-bind:href="ahref" v-bind:class="{binding : isBinding, fontClass : isFontClass}">跳转</a>
<a :href="ahref" :class="aclass">baidu</a>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
ahref: 'https://www.baidu.com/',
aclass: 'binding',
isFontClass: true,
isBinding: true,
}
})
</script>
</body>
</html>
当然也可以通过调用方法实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Binding</title>
<link rel="stylesheet" type="text/css" href="../css/vuecss.css">
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--将data属性中的值绑定到href属性上-->
<!--v-bind的简写-->
<a class="title" v-bind:href="ahref" v-bind:class="getClasses()">跳转</a>
<a :href="ahref" :class="aclass">baidu</a>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
ahref: 'https://www.baidu.com/',
aclass: 'binding',
isFontClass: true,
isBinding: true,
},
methods: {
getClasses: function () {
return {binding : isBinding, fontClass : isFontClass};
}
}
})
</script>
</body>
</html>
往绑定的class传入数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Binding</title>
<link rel="stylesheet" type="text/css" href="../css/vuecss.css">
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--将data属性中的值绑定到href属性上-->
<!--v-bind的简写-->
<a class="title" v-bind:href="ahref" v-bind:class="getClasses()">跳转</a>
<a :href="ahref" :class="[binding, fontClass]">baidu</a>
</div>
<script>
const app = new Vue({
el: '#app',
data: {
ahref: 'https://www.baidu.com/',
aclass: 'binding',
isFontClass: true,
isBinding: true,
binding: 'binding',
fontClass: 'fontClass'
},
methods: {
getClasses: function () {
return {binding : this.isBinding, fontClass : this.isFontClass};
}
}
})
</script>
</body>
</html>
将对象绑定到style中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BindingStyle</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--style绑定对象的格式:styel="{key(css属性名) : value(css的属性值)}"-->
<div :style="{'font-size' : '100px'}" v-text="msg"></div>
<div :style="{fontSize : defindFontSize}" v-text="msg"></div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
msg: 'Style',
defindFontSize: '100px'
}
})
</script>
</body>
</html>
将数组绑定到style
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BindingStyle</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--style绑定对象的格式:styel="{key(css属性名) : value(css的属性值)}"-->
<div :style="{'font-size' : '100px'}" v-text="msg"></div>
<div :style="{fontSize : defindFontSize}" v-text="msg"></div>
<!--style绑定数组-->
<div :style="[baseStyle, {fontSize : defindFontSize}, {color: defindColor}]" v-text="msg"></div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
msg: 'Style',
defindFontSize: '100px',
defindColor: 'red',
baseStyle: {'font-style': 'italic'}
}
})
</script>
</body>
</html>
v-for:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Location</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<ol>
<li v-for="item in locations">{{item}}</li>
</ol>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
locations: ['北京', '上海', '广州', '深圳']
}
});
</script>
</body>
</html>
v-on:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Now Time</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<h1>当前时间: {{nowTime}}</h1>
<!--这里的v-on:click之间不要空开,不然事件监听会失效-->
<!--v-on:用于绑定事件,可以语法糖简写:@click,即代替v-on-->
<button v-on:click="refeshTime">刷新当前时间</button>
<button @click="refeshTime">刷新当前时间</button>
</div>
<script>
var app = new Vue({
el: "#app",
data: {
//值得注意的是在data里面起名字的时候不要起Vue的关键,不然响应式渲染会失败,如:date, dateTime
nowTime: Date.now().toString()
},
//用于定义定义方法
methods: {
refeshTime: function () {
var that = this;
that.nowTime = Date.now().toString();
}
}
})
</script>
</body>
</html>