02 vue数据绑定与指令
系列文章导航
1 模板语法
在标记内通过模板语法:{{}}进行数据的绑定。
{{}}内支持变量,方法名,计算属性,表达式,不支持语句。
{{}}将数据解析为纯文本,如果需要解析为html,需要在标记上增加v-html指令。
2 属性绑定
在标记上,为标记属性绑定Vue数据时,不允许用模板语法,如下方式是不合法的。
<!-- 错误写法 -->
<a href="{{url}}">百度</a>
属性绑定需要使用vue指令v-bind实现
v-bind:属性名="data属性" :属性名=“data属性” <!-- 完整写法 --> <a v-bind:href="baidu">百度1</a> <!-- 简化写法 --> <a :href="baidu">百度1</a>
3 指令
3.1 v-bind 用于标签的属性绑定
v-bind:属性名="data属性"
:属性名=“data属性”
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 完整写法 -->
<a v-bind:href="baidu">百度1</a>
<!-- 缩写写法 -->
<a :href="baidu">百度1</a>
</div>
<script type="text/javascript">
var app = new Vue({
// 挂载元素 - 作用范围
el: '#app',
// vue数据
data: {
baidu:'http://www.baidu.com'
},
});
</script>
</body>
</html>
3.2 v-model 用于表单控件双向绑定
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<div>
文本框
<div><input v-model="baidu" type="text" /></div>
<div>控件值:{{baidu}}</div>
</div>
<div>
单选框
<div>男:<input type="radio" value="男" v-model="sex"></div>
<div>女:<input type="radio" value="女" v-model="sex"></div>
<div>控件值:{{sex}}</div>
</div>
<div>
复选框
<div>篮球:<input type="checkbox" value="篮球" v-model="loves"></div>
<div>足球:<input type="checkbox" value="足球" v-model="loves"></div>
<div>羽毛球:<input type="checkbox" value="羽毛球" v-model="loves"></div>
<div>控件值:{{loves}}</div>
</div>
<div>
单选下拉框
<div>
<select v-model="love">
<option value="">请选择</option>
<option>篮球</option>
<option>足球</option>
<option>羽毛球</option>
</select>
</div>
<div>控件值:{{love}}</div>
</div>
<div>
多选下拉框
<div>
<select v-model="loves" multiple="multiple">
<option value="">请选择</option>
<option>篮球</option>
<option>足球</option>
<option>羽毛球</option>
</select>
</div>
<div>控件值:{{loves}}</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
// 挂载元素 - 作用范围
el: '#app',
// vue数据
data: {
baidu: 'http://www.baidu.com',
sex:'男',
loves: [],
love:''
}
});
</script>
</body>
</html>
3.3 v-model 的指令修饰符

.lazy : 当光标离开控件时,才出发变量的数据变更。
<input v-model.lazy="baidu" type="text" />
.number : 限定文本框只能输入数值。
<input v-model.number="baidu" type="text" />
.trim : 自动去除内容两头的空格符号。
<input v-model.trim="baidu" type="text" />
3.4 v-text,v-html
v-text更新元素的textContent。
<span v-text="msg"></span>
<!-- 和下面的一样 -->
<span>{{msg}}</span>
v-html 更新元素的innerHtml,会解析HTML代码
<div v-html="html">{{包含html内的变量}}</div>
3.5 v-show,v-if,v-else,v-else-if
v-show 根据表达式的布尔值,切换内容块的display属性值,隐藏或显示
<h1 v-show="true">Hello1</h1> <h1 v-show="false">Hello2</h1>
v-if 根据表达式的布尔值,渲染或不渲染内容快,添加或移除
<h1 v-if="true">Hello-1</h1> <h1 v-if="false">Hello-2</h1>
v-else 前一个兄弟元素必须有v-if或者v-else-if,当不成立的时候渲染
<div v-if="Math.random() > 0.5"> 大于0.5 </div> <div v-else> 小于或等于0.5 </div>
v-else-if 多重if判断,前一兄弟元素必须有 v-if 或 v-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.6 v-for 迭代数组
<body>
<div id="app">
<!-- 实例1 -->
<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
<!-- 实例2 -->
<ul id="example-2">
<li v-for="(item, index) in items">
{{ index }} - {{ item.message }}
</li>
</ul>
<!-- 实例3 -->
<ul id="example-3">
<li v-for="(item, index) in items2">
{{ index }} - {{ item }}
</li>
</ul>
</div>
<script type="text/javascript">
var app = new Vue({
// 挂载元素 - 作用范围
el: '#app',
// vue数据
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
],
items2:['a','b','c']
}
});
</script>
</body>
输出结果:

3.7 v-for 迭代对象
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 单值循环 -->
<ul id="v-for-object1" class="demo">
<li v-for="value in objName">
{{value}}
</li>
</ul>
<!-- 键值对循环 -->
<ul id="v-for-object2" class="demo">
<template v-for="(v,k) in objName">
<!-- 两层属性不循环 -->
<li v-if="k != 'parents'">
{{ v + ' - ' + k }}
</li>
<!-- 两层属性单独循环 -->
<li v-else>
遍历内层对象
<ul>
<li v-for="(v,k) in v">
{{ v + ' - ' + k }}
</li>
</ul>
</li>
</template>
</ul>
</div>
<script type="text/javascript">
var app = new Vue({
// 挂载元素 - 作用范围
el: '#app',
// vue数据
data: {
objName: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10',
method1: function() {
return "123";
},
parents:{
a:'123',
b:'456'
}
}
}
});
</script>
</body>
</html>
输出结果:

3.8 v-for 迭代模板
templete标签在实际渲染的时候元素是不显示在网页上的,如果v-for过程中要迭代生成多个标签内容,可以把v-for语法加载template上。
<ul> <template v-for="item in items"> <li>{{ item.msg }}</li> <li class="divider" role="presentation"></li> </template> </ul>
3.9 v-on 绑定事件
绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。
事件绑定用的:v-on:事件名="触发的方法名"
<!-- 方法事件处理器 --> <button v-on:click="doThis"></button>
<!-- 内联事件处理器,需要传递参数时用 --> <button v-on:click="doThat('hello', $event)"></button>
简写代码:@事件名="触发的方法名"
<!-- 方法处理器 -->
<button @click="doThis"></button>
代码实例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<input type="button" value="点击我1" v-on:click="handleClick1" />
<input type="button" value="点击我1 - 简写" @click="handleClick1" />
<input type="button" value="点击我2" v-on:click="handleClick2($event,'123')" />
<input type="button" value="点击我2 - 简写" @click="handleClick2($event,'123')" />
</div>
<script type="text/javascript">
var app = new Vue({
// 挂载元素 - 作用范围
el: '#app',
// vue数据
data: {},
methods: {
handleClick1: function(e) {
console.info(e);
},
handleClick2: function(e, arg) {
console.info(e);
console.info(arg);
}
}
});
</script>
</body>
</html>
输出结果:

在子组件上监听自定义事件 (当子组件触发“my-event”时将调用事件处理器handleThis):
<my-component @my-event="handleThis"></my-component>
3.9 v-on 修饰符

<!-- 停止冒泡 --> <button @click.stop="doThis"></button>
<!-- 阻止默认行为 --> <button @click.prevent="doThis"></button>
<!-- 串联修饰符 --> <button @click.stop.prevent="doThis"></button>
<!-- 键修饰符,键别名 --> <input @keyup.enter="onEnter">
<!-- 键修饰符,键代码 --> <input @keyup.13="onEnter">
<!-- 点击回调只会触发一次 --> <button v-on:click.once="doThis"></button>
3.9 v-once 单次渲染
只渲染元素和组件一次。随后的变量值变更不会重新渲染。
<input type="text" v-model="title" /> <div v-once> {{title}} </div>
3.10 v-bind绑定class
通过数据项的布尔值决定是否引用某个class属性。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
.active {
color: blue;
font-weight: 900;
}
.textError {
color: red;
font-weight: 900;
}
</style>
</head>
<body>
<div id="app">
<!-- 样式名:布尔数据 ,当数据值为true时绑定该样式 -->
<div class="myClass" :class="{active:isActive,textError:isError}">普通方式</div>
<!-- 对象形式 - 对象属性名是要绑定的样式,属性值为true时绑定 -->
<div :class="classObj">对象形式</div>
<!-- 数组形式 - 数组元素是数据,数据值代表要绑定的样式 -->
<div :class="[activeClass,errorClass]">数组形式</div>
<!-- 数据形式 - 含表达式 -->
<div :class="[isActive?activeClass:'',errorClass]">三元数组</div>
<div :class="[{active:isActive},errorClass]">普通方式和数组形式混合</div>
</div>
<script type="text/javascript">
var app = new Vue({
// 挂载元素 - 作用范围
el: '#app',
// vue数据
data: {
isActive: false,
isError: true,
classObj:{
active:true,
textError:false
},
activeClass:'active',
errorClass:'textError'
}
});
</script>
</body>
</html>
运行结果:

3.10 v-bind绑定style
当样式中包含中划线时,必须用单引号引起来。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app">
<!-- 对象属性是样式名,属性值是样式值,和style的原始值合并 -->
<div style="font-family: '新宋体'" :style="{color:activeColor,fontSize:fontSize,'margin-top':marginTop}">对象形式</div>
<!-- 样式对象属性是样式名,属性值是样式值 -->
<div :style="styleObj1">样式对象方式</div>
<!-- 数组方式,数组元素是多个样式对象 -->
<div :style="[styleObj1,styleObj2]">数组方式</div>
</div>
<script type="text/javascript">
var app = new Vue({
// 挂载元素 - 作用范围
el: '#app',
// vue数据
data: {
activeColor: 'blue',
fontSize: '30px',
marginTop:'30px',
styleObj1:{
color:'red',
fontSize:'30px'
},
styleObj2:{
border:'1px solid green'
}
}
});
</script>
</body>
</html>
输出:


浙公网安备 33010602011771号