Vue.js使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue.js的模板都是合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。
在底层的实现上,Vue将模板编译成虚拟DOM渲染函数。结合响应系统,Vue能够智能地计算出最少需要重新渲染多少组件,并把DOM操作次数减到最少。
简单的说:Vue模板语法就是前端渲染,前端渲染即是把数据填充到html标签中。数据(来自服务器)+模板(html标签)=前端渲染(产物是静态html内容)。
插值
插值就是将数据插入到 html 文档中,包含文本、html 元素、元素属性等。
1. 文本插值
文本插值中用得最多的就是用双大括号的形式
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 会与实例中的【data】中的属性绑定在一起,并且数据实现同步-->
<h1>{{ message }}</h1>
</div>
<script>
// Vue所做的工作也就是把数据填充把页面的标签里面。
var vm = new Vue({
el: "#app",
// data模型数据,值是一个对象。
data: {
message: "I LOVE YOU"
}
})
</script>
</body>
</html>

上面代码中当 data 中的值更新之后我们不需要操作 html,页面中会自动更新数据。 我们也可以让数据只绑定一次,在以后更新 data 中的属性时不再更新页面数据
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- v-once只编译一次。显式内容之后不再具有响应式功能。 -->
<!-- v-once的应用场景,如果显式的信息后续不需要再修改,可以使用v-once指令,可以可以提高性能,因为Vue就不需要去监听它的变化了。 -->
<h1 v-once>{{message}}</h1>
</div>
<script>
// Vue所做的工作也就是把数据填充把页面的标签里面。
var vm = new Vue({
el: "#app",
// data模型数据,值是一个对象。
data: {
message: "I LOVE YOU"
}
})
</script>
</body>
</html>
2. HTML 插值
双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你 需要使用 v-html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译,在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击 -->
<h1 v-html="msg"></h1>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: "<span style='color:blue'>BLUE</span>"//可以使用v-html标签展示html代码。
}
})
</script>
</body>
</html>

3. 属性插值
在开发的时候,有时候我们的属性不是写死的,有可能是根据我们的一些数据动态地决 定的,比如图片标签(<img>)的 src 属性,我们可能从后端请求了一个包含图片地址的数 组,需要将地址动态的绑定到 src 上面,这时就不能简单的将 src 写死。还有一个例子就是 a 标签的 href 属性。这时可以使用 v-bind:指令,其中,v-bind:可以缩写成:
使用 v-bind:指令绑定属性
<!DOCTYPE html>
<html xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head lang="en">
<meta charset="UTF-8">
<title>aa</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<img v-bind:src="imgUrl" alt=""/>
<a :href="searchUrl">百度一下</a>
</div>
</body>
<script>
var vm = new Vue({
el: "#app",
data: {
imgUrl:'F://vuewk//src//assets//1.jpg',
searchUrl:'http://www.baidu.com'
}
})
</script>
</html>
服务器请求过来的数据,我们一般都会在 data 那里做一下中转,做完中转过后再把需 要的变量绑定到对应的属性上面。
v-bind 除了在开发中用在有特殊意义的属性外(src, href 等),也可以绑定其他一些 属性,如 Class 与 Style 绑定
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
<head>
<meta charset="UTF-8">
<title>v-bind动态绑定属性class</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p :class="{fontCol:isName,setBack:!isAge}" class="weight">{{name}}</p>
<i :class="addClass">{{name}}真好看!</i>
</div>
<script>
var vm = new Vue({
el:"#app",
// 条件比较少
data:{
isName:true,
isAge:false,
name:"功守道"
},
//当v-bind:class的表达式过长或者逻辑复杂(一般当条件多于两个的时候),可以考虑采用计算属性,返回一个对象
computed:{
addClass:function(){
return {
checked:this.isName&&!this.isAge
}
}
}
})
</script>
</body>
</html>

既然是一个对象,那么该对象内的属性可能不唯一,但总是每一项为真的时候,对应的 类名就会存在。通过 v-bind 更新的类名和元素本身存在的类名不冲突,可以优雅的共存

v-bind 动态绑定属性 style
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
<head>
<meta charset="UTF-8">
<title>v-bind动态绑定属性style</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div :style="{'color': color,'fontSize':fontSize + 'px'}">修饰文本</div>
</div>
<script>
var vm= new Vue({
el: "#app",
data: {
color: 'red',
fontSize: 24
}
})
</script>
</body>
</html>
大多情况下,标签中直接写一长串的样式不便于阅读和维护,所以一般写在 dada 或 computed 里,代码如下:
<div id="app">
<div :style="{'color': color,'fontSize':fontSize + 'px'}">修饰文本</div>
</div>
<script>
var vm= new Vue({1
el: "#app",
data: {
styles:{
color: 'red',
fontSize: 24
}
}
})
</script>
应用多个样式对象时,可以使用数组语法
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
<head>
<meta charset="UTF-8">
<title>v-bind动态绑定属性style</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div :style="[styleA,styleB]">文本</div>
</div>
<script>
var vm=new Vue({
el: "#app",
data: {
styleA:{
color: 'red',
fontSize: 24 + 'px'
},
styleB: {
100 + 'px',
border: 1 + 'px ' + 'black ' + 'solid'
}
}
})
</script>
</body>
</html>

4. 插值中使用 Javascript 表达式
实际上,对 于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持
部分 表达式格式代码如下:
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id">
</div>
这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就 是,每个绑定都只能包含单个表达式,所以下面的表达式都不会生效,代码如下:
<!-- 这是语句,不是表达式 -->
{{ var a = 1 }}
<!-- 流控制也不会生效,请使用三元表达式 -->
{{ if (ok) { return message } }}
使用 Javascript 表达式
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
<head>
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{ number + 1 }}</p>
<hr>
<p>{{msg + '~~~~~'}}</p>
<hr>
<p>{{flag ? '条件为真' : '条件为假'}}</p>
<hr>
</div>
<script>
var vm = new Vue({
el:'#app',
data:{
msg:'Hello beixi!',
flag:true,
number:2
}
})
</script>
</body>
</html>
指令
指令其实在上面我们已经使用过了【v-bind:】和【v-html】,指令就是值这些带有 v- 前 缀的特殊属性。
1.参数
一些指令能够接收一个“参数”,在指令名称之后以冒号表示。如 v-bind 指令可以用 于响应式地更新 HTML attribute,代码如下:
<a v-bind:href="url">...</a>
在这里 href 是参数,告知 v-bind 指令将该元素的 href attribute 与表达式 url 的值绑定。
2.动态参数
从 2.6.0 开始,可以用方括号括起来的 JavaScript 表达式作为一个指令的参数,响应式 使得 vue 更加灵活多变,其动态参数也是有其含义的,代码如下:
<a v-bind:[attributeName] = 'url'>...</a>
同样的,当 eventName 的值为‘focus’时,v-on:[eventName]将等价于 v-on:focus。
当然动态参数的值也是有约束的,动态参数预期会求出一个字符串,异常情况下值为 null。这个特殊的 null 值可以被显性地用于移出绑定。任何其他非字符串类型的值都将会触 发一个警告。
3.修饰符
修饰符(Modifiers)是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊 方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调 event.preventDefault(), 代码如下:
<form v-on:submit.prevent="onSubmit">...</form>
过滤器
过滤器分全局过滤器和局部过滤器,全局过滤器在项目中使用频率非常高。
定义过滤器
全局过滤器
Vue.filter('过滤器名称', function (value1[,value2,...] ) {
//逻辑代码
})
局部过滤器
new Vue({
filters: {
'过滤器名称': function (value1[,value2,...] ) {
// 逻辑代码
}
}
})
2. 过滤器使用的地方
Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个 地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示,格式代码如下:
<!-- 在双花括号中 -->
<div>{{数据属性名称 | 过滤器名称}}</div>
<div>{{数据属性名称 | 过滤器名称(参数值)}}</div>
<!-- 在 v-bind 中 -->
<div v-bind:id="数据属性名称 | 过滤器名称"></div>
<div v-bind:id="数据属性名称 | 过滤器名称(参数值)"></div>
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
<head>
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!--文本后边需要添加管道符号( | )作为分隔,管道符 | 后边是文本的处理函数,处理函数的第一个参数是:管道符前边的——文本内容,如果处理函数上边传递参数,则从第二个参数依次往后是传递的参数。-->
<p>电脑价格:{{price | addPriceIcon}}</p>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
price:200
},
filters:{
//处理函数
addPriceIcon(value){
console.log(value)//200
return '¥' + value;
}
}
})
</script>
</body>
</html>

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
<head>
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!--过滤器接收多个参数-->
<span>{{value1|multiple(value2,value3)}}</span>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
msg: 'hello',
value1:10,
value2:20,
value3:30
},
//局部过滤器
filters: {
'multiple': function (value1, value2, value3) {
return value1*value2*value3
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
<head>
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h3>{{viewContent | addNamePrefix}}</h3>
</div>
<script>
/*addNamePrefix是过滤器的名字,也是管道符后边的处理函数;value是参数*/
Vue.filter("addNamePrefix",(value)=>{
return "my name is" + value
})
var vm = new Vue({
el:"#app",
data:{
viewContent:"贝西"
}
})
</script>
</body>
</html>
