Vue快速入门(二:数据绑定)《快乐Vue》
2019-02-23 本文已影响123人
Negen
数据绑定
数据绑定语法
主要介绍 Vue.js 的数据绑定语法.
使用的是双大括号标签 {{}},为“Mustache”语法(源自前端模板引擎 Mustache.js)
有文本插值、HTML属性、绑定表达式、过滤器
直接看例子:
<!DOCTYPE html>
<html>
<head>
<title>数据绑定语法</title>
<meta charset="utf-8">
</head>
<!-- 引入vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<body>
<div id="app" style="text-align: center;">
<!-- 文本插值 -->
<h2>{{msg1}}</h2>
<!-- HTML属性 -->
<div :id="'id' + msg2"></div>
<!-- 绑定表达式开始 -->
<h2>{{index + 10}}</h2>
<h2>{{index == 1?true:false}}</h2>
<!-- 绑定表达式结束 -->
<!-- 过滤器开始
vue选项中添加filters选项并定义uppercase
Vue.js 允许在表达式后添加可选的过滤器,以管道符“|”指示。
-->
<h2>{{name | uppercase}}</h2>
<!-- 过滤器结束 -->
</div>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
msg1: "文本插值",
msg2: "9527",
index: 1,
name: "Vue",
ok: true
},
filters: {
uppercase: function(str){
return str.toUpperCase();
}
}
});
</script>
</body>
</html>
计算属性
Vue.js 还提供了计算属性这种方法,避免在模板中加入过重的业务逻辑,保证模板的结构清晰和可维护性
示例:
<!DOCTYPE html>
<html>
<head>
<title>数据绑定语法</title>
<meta charset="utf-8">
</head>
<!-- 引入vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<body>
<div id="app" style="text-align: center;">
<h2>{{'fullName is ' + fullName}}</h2>
</div>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
firstName: "David",
lastName: "li"
},
computed: {
fullName: function(){
return this.firstName + ' ' + this.lastName;
}
}
});
</script>
</body>
</html>
运行效果:

此时,对 vm.firstName 或vm.lastName进行修改,会同时修改 fullName 的值。
如果上面这个例子没有体现出计算属性的优势,那计算属性的Setter方法则在更新属性时给我们带来了便利。
示例:
<!DOCTYPE html>
<html>
<head>
<title>数据绑定语法</title>
<meta charset="utf-8">
</head>
<!-- 引入vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<body>
<div id="app" style="text-align: center;">
<h2>{{'price is ' + price}}</h2>
</div>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
cents: 100
},
computed: {
price: {
set: function(value) {
this.cents = value * 100;
},
get: function() {
return (this.cents / 100).toFixed(2)
}
}
}
});
</script>
</body>
</html>
在处理商品价格的时候,后端往往会把价钱定义成以分为单位的整型,避免在处理浮点类型数据时产生的问题。而前端则需要把价钱再转成元进行展示,而且如果需要对价钱进行修改的话,则又要把输入的价格再恢复到分传给后端,很是繁琐。而在使用 Vue.js 的计算属性后,我们可以将 vm.cents 设置为后端所存的数据,计算属
性 price 为前端展示和更新的数据。
此时更改 vm.price = 2,vm.cents 会被更新为 200,在传递给后端时无需再手动转化一遍数据。

表单控件
Vue.js 中提供 v-model 的指令对表单元素进行双向数据绑定,在修改表单元素值的同时,实例 vm 中对应的属性值也同时更新,反之亦然。本小节会介绍主要 input 元素绑定v-model 后的具体用法和处理方式。
示例:
<!DOCTYPE html>
<html>
<head>
<title>表单控件</title>
<meta charset="utf-8">
</head>
<!-- 引入vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<body>
<div id="app">
<!-- 输入框示例,用户输入的内容和 vm.message 直接绑定 -->
输入框示例(Text):<br/>
<input type="text" name="" v-model="message"><br/>
<span>您输入了:{{message}}</span>
<hr>
<!-- 单选框示例 -->
单选框示例(Radio):<br/>
<label><input type="radio" name="sex" value="male" v-model="gender">男</label>
<label><input type="radio" name="sex" value="female" v-model="gender">女</label><br>
当前选中的性别为:{{ gender }}
<hr>
<!-- Checkbox 分两种情况:单个勾选框和多个勾选框。
单个勾选框,v-model 即为布尔值,此时 input 的 value 并不影响 v-model 的值 -->
单个勾选框(CheckBox):<br>
<input type="checkbox" name="" v-model="checked"><br>
<span>checked: {{ checked }}</span><br>
多个勾选框(CheckBox):<br>
<label><input type="checkbox" value="篮球" name="" v-model="multiChecked">篮球</label><br>
<label><input type="checkbox" value="足球" name="" v-model="multiChecked">足球</label><br>
<label><input type="checkbox" value="网球" name="" v-model="multiChecked">网球</label><br>
<span>multiChecked: {{ multiChecked.join('、') }}</span>
<hr>
<!-- 下拉框
同 Checkbox 元素一样,Select 分单选和多选两种,多选的时候也需要绑定到一个数组。 -->
单选(Selected):<br>
<select v-model="selected">
<option selected="selected">A</option>
<option>B</option>
<option>C</option>
</select><br>
selected: {{ selected }}
多选(Selected)按住ctrl多选:<br>
<select v-model="multiSelected" multiple="multiple">
<option selected="selected">A</option>
<option>B</option>
<option>C</option>
</select>
multiSelected: {{ multiSelected.join('、') }}
<hr>
<!-- 绑定value
表单控件的值同样可以绑定在 Vue 实例的动态属性上,用 v-bind 实现。 -->
CheckBox:<br>
<input type="checkbox" v-model="valuechecked" v-bind:true-value="true" v-bind:false-value="false" checked><br>
当前value:{{ valuechecked }} <br>
Radio: <br>
<input type="radio" v-model="radiochecked" v-bind:value="true"><br>
当前value:{{ radiochecked }} <br>
</div>
<script type="text/javascript">
//定义数据
var data = {
message : '',
gender : '',
checked : '',
valuechecked : 'true',
radiochecked : '',
multiChecked : [],
selected : '',
multiSelected : []
}
var vm = new Vue({
el: "#app",
data: data
});
</script>
</body>
</html>
运行效果如下图:

class绑定style
在开发过程中,我们经常会遇到动态添加类名或直接修改内联样式(例如 tab 切换)。class 和 style 都是 DOM 元素的 attribute,我们当然可以直接使用 v-bind 对这两个属性进行数据绑定。
但这样未免过于繁琐而且容易出错,所以 Vue.js 为这两个属性单独做了增强处理,表达式的结果类型除了字符串之外,还可以是对象和数组。
示例:
<!DOCTYPE html>
<html>
<head>
<title>Class与Style绑定</title>
<meta charset="utf-8">
<style type="text/css">
.classA{
width: 500px;
height: 600px;
border: solid 5px;
}
.classB{
background-color: pink;
}
</style>
</head>
<!-- 引入vue.js -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<body>
<div id="app">
<!--对象语法:v-bind:class 接受参数是一个对象,而且可以与普通的 class 属性共存。-->
<div class="tab" v-bind:class="{'active': active, 'unactive':!active}"></div>
<!-- 渲染结果为: <div class="tab active"></div>
数组语法:v-bind:class 也接受数组作为参数-->
<div v-bind:class="[classA, classB]"></div>
<!-- 渲染结果为: <div class="classA classB"></div> -->
<!--2.内联样式绑定
style 属性绑定的数据即为内联样式,同样具有对象和数组两种形式:
对象语法:直接绑定符合样式格式的对象。-->
<div v-bind:style="inlineStyle"><h2>内联 对象语法</h2></div>
<!-- 除了直接绑定对象外,也可以绑定单个属性或直接使用字符串 -->
<div :style="{ width: '200px',backgroundColor:inlineStyle.backgroundColor,height:inlineStyle.height }">
<h2>绑定单个属性或直接使用字符串</h2>
</div>
<div :style="[styleA, styleB]">
<h2>数组语法:v-bind:style 允许将多个样式对象绑定到统一元素上</h2>
</div>
</div>
<script type="text/javascript">
//定义数据
var data = {
active: true,
classA: 'classA',
classB: 'classB',
inlineStyle: {
width: '100px',
height: '100px',
backgroundColor: 'red' //划重点,js中的css属性名采用驼峰命名
},
styleA:{
width:'300px',
border: 'solid 3px'
},
styleB:{
height: '150px',
backgroundColor: 'yellow'
}
}
var vm = new Vue({
el: "#app",
data: data
});
</script>
</body>
</html>
运行效果如下:
