在本章中,将学习如何操作或赋值给html属性,改变样式,以及借助vuejs提供的v-bind
的绑定指令来分配类。
通过下面一个例子来理解为什么需要以及何时使用v-bind
指令进行数据绑定。创建一个文件:binding.html -
<html>
<head>
<meta charset="utf-8" />
<title>vuejs绑定数据示例</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
{{title}}<hr/>
<a href = "hreflink" target = "_blank"> 点击我 </a> <br/>
<a href = "{{hreflink}}" target = "_blank"> 点击我 </a> <br/>
<a v-bind:href = "hreflink" target = "_blank">易百教程 </a> <br/>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#databinding',
data: {
title : "数据绑定",
hreflink : "http://www.h3.com"
}
});
</script>
</body>
</html>
在上面的例子中,显示了一个标题变量和三个锚链接。还从数据对象中为href
赋值。现在,如果在浏览器中查看输出并检查,将会看到前两个锚链接没有正确的href
,如下面的截图所示。
第一个链接的href
属性的值显示为hreflink
,第二个链接的href
属性的值为{{hreflink}}
,而最后一个显示正确的url:http://www.h3.com
。
因此,要为html属性赋值,需要按如下方式将其绑定到指令v-bind
。如下语句 -
<a v-bind:href = "hreflink" target = "_blank">click me </a>
vuejs还提供了v-bind
指令的简写,如下所示。
<a :href = "hreflink" target = "_blank">click me </a>
如果在浏览器中看到检查元素,那么定位标记不会显示v-bind
属性,但它会显示纯html。 当我们查看dom时,没有看到vuejs属性。
要绑定html类,需要使用v-bind:class
。 下面来看看一个例子,并在其中绑定类。创建一个文件:bind-classes.html -
<html>
<head>
<meta charset="utf-8" />
<title>vuejs绑定数据示例</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.active {
background: red;
}
</style>
<div id = "classbinding">
<div v-bind:class = "{active:isactive}"><b>{{title}}</b></div>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#classbinding',
data: {
title : "绑定html类",
isactive : true
}
});
</script>
</body>
</html>
有一个用使用v-bind: class=” {active: isactive}”
创建的div
。
在这里,isactive
是一个基于true/false
的变量。它会将活动类应用于div
。 在数据对象中,已经将isactive
变量赋值为true
。 在样式.active
中定义了一个类,背景色为红色(red
)。
如果变量isactive
是true
,则颜色将被应用,否则不会被应用。以下将是浏览器中的输出 -
在上面的显示中,可以看到背景颜色是红色的。class ="active"
应用于div
。
现在,将变量的值更改为false
并查看输出。 如下面的代码所示,将变量isactive
更改为false
-
创建一个文件:binding-example.html -
<html>
<head>
<meta charset="utf-8" />
<title>vuejs绑定数据示例</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529b;
background-color: #bde5f8;
}
div {
margin: 10px 0;
padding: 12px;
}
.active {
color: #4f8a10;
background-color: #dff2bf;
}
.displayerror{
color: #d8000c;
background-color: #ffbaba;
}
</style>
<div id = "classbinding">
<div class = "info" v-bind:class = "{ active: isactive, 'displayerror': haserror }">
{{title}}
</div>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#classbinding',
data: {
title : "这是一个类绑定示例~",
isactive : false,
haserror : false
}
});
</script>
</body>
</html>
对于上面代码中的div
,已经应用了一个普通的类,例如class ="info"
。 基于isactive
和haserror
变量,其他类将被应用于div
。显示效果如下 -
这是一个正常的类应用。这两个变量现在都是false
。让isactive
变量为true
并查看输出 -
在上面的显示中,在dom中可以看到两个类被分配给div
,info
和active
。 让haserror
变量为true
,isactive
为c
。效果如下 -
现在,在上面的显示中看到,info
和displayerror
类被应用于div。这就是如何根据条件应用多个类。
也可以将类作为数组传递。 让我们举个例子来理解这一点。
创建一个文件:binding-example2.html -
<html>
<head>
<meta charset="utf-8" />
<title>vuejs绑定数据示例</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529b;
background-color: #bde5f8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 18px;
}
.active {
color: #4f8a10;
background-color: #dff2bf;
}
.displayerror{
color: #d8000c;
background-color: #ffbaba;
}
</style>
<div id = "classbinding">
<div v-bind:class = "[infoclass, errorclass]">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#classbinding',
data: {
title : "这是一个类绑定示例2~",
infoclass : 'info',
errorclass : 'displayerror'
}
});
</script>
</body>
</html>
输出结果如下 -
正如上面看到的,这两个类都被应用到div
。使用一个变量,并根据变量的值,分配类。
修改上面文件:** 中的代码为 -
<html>
<head>
<meta charset="utf-8" />
<title>vuejs绑定数据示例</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529b;
background-color: #bde5f8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 18px;
}
.active {
color: #4f8a10;
background-color: #dff2bf;
}
.displayerror{
color: #d8000c;
background-color: #ffbaba;
}
</style>
<div id = "classbinding">
<div v-bind:class = "[isactive ? infoclass : '', haserror ? errorclass : '']">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#classbinding',
data: {
title : "this is class binding example ~",
infoclass : 'info',
errorclass : 'displayerror',
isactive : true,
haserror : false
}
});
</script>
</body>
</html>
下面使用两个变量isactive
和haserror
,div
类使用相同的类,如下面的div
标签所示。
<div v-bind:class = "[isactive ? infoclass : '', haserror ? errorclass : '']">{{title}}</div>
现在,将haserror
变量设置为true
,将isactive
变量设置为false
。效果如下 -
下面将为组件中的类添加v-bind
。 在下面的例子中,我们已经向组件模板和组件添加了一个类。
创建一个文件:binding-for-component.html -
<html>
<head>
<title>vuejs instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529b;
background-color: #bde5f8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 18px;
}
.active {
color: #4f8a10;
background-color: #dff2bf;
}
.displayerror{
color: #d8000c;
background-color: #ffbaba;
}
</style>
<div id = "classbinding">
<new_component class = "active"></new_component>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#classbinding',
data: {
title : "这是一个类绑定示例",
infoclass : 'info',
errorclass : 'displayerror',
isactive : false,
haserror : true
},
components:{
'new_component' : {
template : '<div class = "info">为组件绑定类</div>'
}
}
});
</script>
</body>
</html>
以下是浏览器中的输出,它将这两个类应用于div
上。
根据true/false
在组件部分添加一个变量来显示。
<html>
<head>
<title>vuejs instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529b;
background-color: #bde5f8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 25px;
}
.active {
color: #4f8a10;
background-color: #dff2bf;
}
.displayerror{
color: #d8000c;
background-color: #ffbaba;
}
</style>
<div id = "classbinding">
<new_component v-bind:class = "{active:isactive}"></new_component>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#classbinding',
data: {
title : "this is class binding example",
infoclass : 'info',
errorclass : 'displayerror',
isactive : false,
haserror : true
},
components:{
'new_component' : {
template : '<div class = "info">class binding for component</div>'
}
}
});
</script>
</body>
</html>
由于该变量为false
,所以不应用active
类,并按照以下屏幕截图所示应用info
类。
创建一个文件:binding-inline-styles.html -
<html>
<head>
<meta charset="utf-8" />
<title>vuejs绑定数据示例</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<div v-bind:style = "{ color: activecolor, fontsize: fontsize + 'px' }">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#databinding',
data: {
title : "inline style binding",
activecolor: 'red',
fontsize :'30'
}
});
</script>
</body>
</html>
在浏览器中输出结果如下 -
在上面的示例中,对于div
,应用样式并从数据对象中提取数据。
<div v-bind:style = "{ color: activecolor, fontsize: fontsize + 'px' }">{{title}}</div>
data: {
title : "inline style binding",
activecolor: 'red',
fontsize :'30'
}
也可以通过把所有的值赋给一个变量,然后把变量赋值给div
来做同样的事情。
创建一个文件:binding-inline-styles2.html -
<html>
<head>
<title>vuejs instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<div v-bind:style = "styleobj">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#databinding',
data: {
title : "inline style binding",
styleobj : {
color: 'red',
fontsize :'40px'
}
}
});
</script>
</body>
</html>
color
和fontsize
分配给名为styleobj
的对象,同样的分配给div
。
<div v-bind:style = "styleobj">{{title}}</div>
在浏览器中输出结果如下 -
到目前为止,在前面创建的例子中,已经看到v-model
绑定输入文本元素和绑定到指定变量的值。下面将了解表单输入绑定。
创建一个文件:form-input-bindings.html -
<html>
<head>
<title>vuejs instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<h3>textbox</h3>
<input v-model = "name" placeholder = "enter name" />
<h3>name entered is : {{name}}</h3>
<hr/>
<h3>textarea</h3>
<textarea v-model = "textmessage" placeholder = "add details"/>
<h1><p>{{textmessage}}</p></h1>
<hr/>
<h3>checkbox</h3>
<input type = "checkbox" id = "checkbox" v-model = "checked"> {{checked}}
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#databinding',
data: {
name:'',
textmessage:'',
checked : false
}
});
</script>
</body>
</html>
无论在输入框中键入的内容是什么,v-model
都会被分配值给name
,它显示在{{name}}
域中,在下面也会显示在文本框中输入的内容。
单选和下拉项
创建一个文件:form-radio-select.html -
<html>
<head>
<title>vuejs instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<h3>radio</h3>
<input type = "radio" id = "black" value = "black" v-model = "picked">black
<input type = "radio" id = "white" value = "white" v-model = "picked">white
<h3>radio element clicked : {{picked}} </h3>
<hr/>
<h3>select</h3>
<select v-model = "languages">
<option disabled value = "">please select one</option>
<option>java</option>
<option>javascript</option>
<option>php</option>
<option>c</option>
<option>c++</option>
</select>
<h3>languages selected is : {{ languages }}</h3>
<hr/>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#databinding',
data: {
picked : 'white',
languages : "java"
}
});
</script>
</body>
</html>
在浏览器中浏览如下 -
修饰符
在下面这个例子中,我们将使用三个修饰符 - trim
,number
和lazy
。
创建一个文件:** -
<html>
<head>
<title>vuejs instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<span style = "font-size:25px;">enter age:</span> <input v-model.number = "age" type = "number">
<br/>
<span style = "font-size:25px;">enter message:</span> <input v-model.lazy = "msg">
<h3>display message : {{msg}}</h3>
<br/>
<span style = "font-size:25px;">enter message : </span><input v-model.trim = "message">
<h3>display message : {{message}}</h3>
</div>
<script type = "text/javascript">
var vm = new vue({
el: '#databinding',
data: {
age : 0,
msg: '',
message : ''
}
});
</script>
</body>
</html>
在浏览器中浏览如下 -
number修饰符 只允许输入数字。 除了数字之外,不会有其他的输入。
<span style = "font-size:25px;">enter age:</span> <input v-model.number = "age" type = "number">
当完全输入并且用户离开文本框,lazy修饰符 将显示文本框中的内容。
<span style = "font-size:25px;">enter message:</span> <input v-model.lazy = "msg">
trim修饰符 将删除在开始和结束时输入的任何空格。
<span style = "font-size:25px;">enter message : </span><input v-model.trim = "message">
`