v-bind单向绑定与v-model双向绑定
Vue.js 最显著的特点就是响应式和数据驱动,也就是将Model和View(View在下面的图示中)进行单向绑定或者双向绑定。Vue.js主要有三种数据绑定形式,并且都是基于单向绑定和双向绑定。1.插值形式 {{}}2.单向绑定(v-bind):把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。因此,我们不需要进行额外的DOM操作,只需...
Vue.js 最显著的特点就是响应式和数据驱动,也就是将Model和View(View在下面的图示中)进行单向绑定或者双向绑定。
Vue.js主要有三种数据绑定形式,并且都是基于单向绑定和双向绑定。
1.插值形式 {{}}
2.单向绑定(v-bind):把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。因此,我们不需要进行额外的DOM操作,只需要进行Model的操作就可以实现视图的联动更新。
3.双向绑定(v-model):把Model绑定到View的同时也将View绑定到Model上,这样就既可以通过更新Model来实现View的自动更新,也可以通过更新View来实现Model数据的更新。所以,当我们用JavaScript代码更新Model时,View就会自动更新,反之,如果用户更新了View,Model的数据也自动被更新了。
弄清了它的这种数据绑定的机制,我们再来看Vue.js代码就会很清晰了,
#-------------------------------------------{{}}------------------------------------------------------------------------------------
插值形式
插值形式就是{{data}}的形式,它使用的是单向绑定。
我们首先定义好一个JavaScript对象作为Model,并且把这个Model的两个属性绑定到DOM节点上:
<body>
<div id="vm">
<p>Hello, {{name}}!</p>
<p>You are {{age}} years old!</p>
</div>
</body>
<!------>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#vm',
data: {
name: 'DroidMind',
age: 18
}
});
</script>
Vue实例就是ViewModel的代理对象:
el: 指定了要把Model绑定到id为vm的DOM节点上。
data: 指定了Model,我们初始化了Model的两个属性name和age,
在View内部的<p>节点上,可以直接用{{ name }}引用Model的某个属性。
扯白了,就是New Vue下面的就是模型,页面上的<p></p>就是DOM节点,就是View.
映射关系:
Model->View
修改Model,View就更新,这种绑定是单向绑定.
浏览器按下F12,
例如,打开浏览器console,
在控制台输入vm.name = 'Bob',按下回车,可以观察到页面立刻发生了变化,原来的Hello, Robot!自动变成了Hello, Bob!。
运行前:(按下F12,选择右侧的Console)
运行后:
#-------------------------------------------------------------------------------------------------------------------------------
单向绑定(v-bind)
如果我们希望html的某些属性能够支持单向绑定,我们只需要在该属性前面加上v-bind:指令,这样Vue在解析的时候会识别出该指令,就会将该将其属性的值跟Vue实例的Model进行绑定。这样我们就可以通过Model来动态的操作该属性从而实现DOM的联动更新。
例如:
<p class="classed">
上面<p>节点的class样式指定的值为classed,它是一个静态的属性值,如果我们希望将该属性值跟Model进行一个绑定,只需要加上一个v-bind:指令,如下所示:
<p v-bind:class="classed">
绑定之后,classed不再是一个静态的字符串,而是vue实例中的data.classed变量,也就是它跟Model的classed进行了绑定,所以我们可以通过操作Model的classed来实现对View的class属性的动态更新,从而实现View的动态更新。
这里为啥不再使用{{data}},因为绑定的是样式,而不是具体的数值
<body>
<div id="vm">
<p v-bind:class=classed>Hello, {{name}}!</p>
<p class="{'blue':true}">Hello, {{name}}!</p>
<p class=red>Hello, {{name}}!</p>
<!---上面是3种等效的写法--->
<!---第1种是直接引用data里面的变量,变量再引用css中的模块--->
<!---第2种是直接引用css模块--->
<!-- 第3种是直接给样式赋值 -->
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#vm',
data: {
name: 'DroidMind',
classed: 'red'
}
});
</script>
<style>
/*<!-- 下面的是映射到上面的classed -->*/
.red {
background: red;
}
.blue {
background: blue;
}
</style>
<!-- 为什么不是{{data}}的形式,而是v-bind的形式,是因为前者不能绑定样式 -->
如上面代码所示,vm.classed的初始值为red,此时<p>的样式属性对应的是.red,此时背景就为红色.
我们可以通过在浏览器的控制台输入vm.classed='blue',此时背景就自动变成了蓝色。
可以看到通过对class属性进行绑定我们就可以动态的改变class对应的样式,这个都是通过Model的操作完成的,没有设置任何的DOM操作。
操作前:
操作后:
原理图如下:
自己总结:绑定的是"Model中的样式对应的变量"和"p节点"
#########################################################################
v-model形式
v-model主要是用在表单元素中,实现了双向绑定。
当用户填写表单时,View的状态就被更新了,
如果此时Model的数据也会随着输入的数据动态的更新,
那就相当于我们把Model和View做了双向绑定。
这个意思是:View接受的数据,传给model,model的数据再传给view.
代码如下 :
<body>
<form id="vm" action="#">
<p><input v-model="email"></p>
<p><input v-model="name"></p>
</form>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#vm',
data: {
email: '',
name: ''
}
});
</script>
修改console之前(View->Model):
修改console之后(Model->View):
我们可以在表单中输入内容,然后在浏览器console中用vm.$data查看Model的内容,也可以用vm.name查看Model的name属性,它的值和FORM表单对应的<input>是一致的。
如果在浏览器console中用JavaScript更新Model,例如,执行vm.name='Bob',表单对应的<input>内容就会立刻更新。可以看到通过v-model实现了表单数据和Model数据的双向绑定。
###################################################################################
下面是一个v-model的计算器的例子.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>蜀云泉</title>
<script type="text/javascript" src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js
"></script>
</head>
<body>
<!-- 这个div就是MVVM(Model-View-ViewModel)中的V,View -->
<!-- 输入需要View->Model绑定 -->
<!-- 输出需要Model->View绑定 -->
<div id="app">
<h3 v-text="msg"></h3>
<input type="text" style="width:100%" v-model="msg">
<!-- v-model模拟简易计算器 -->
<input type="text" v-model="num1">
<!-- 下面的对应页面上的+符号 -->
<select v-model="opt">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<!-- 双向绑定第二个数据 -->
<input type="text" v-model="num2">
<!-- 绑定=号 -->
<input type="button" value="=" @click="calc">
<!-- 输出结果 -->
<input type="text" v-model="result">
</div>
<script>
// 这个vm就是MVVM中的VM,ViewModel
var vm=new Vue({
el: '#app',
// 这个data就是MVVM中的M,Model
data: {
msg:"大家好,我是Vae",
num1:0,
num2:0,
result:0,
opt:'+'
},
//下面是加减乘除四种运算
methods: {
calc(){
switch(this.opt){//这里接收data中的opt的值
case '+':
this.result=parseInt(this.num1)+parseInt(this.num2);
break;
case '-':
this.result=parseInt(this.num1)-parseInt(this.num2);
break;
case '*':
this.result=parseInt(this.num1)*parseInt(this.num2);
break;
case '/':
if(this.num2==0) {alert('除数不能为0');break;}
this.result=parseInt(this.num1)/parseInt(this.num2);
break;
}
}
}
})
</script>
</body>
</html>
参考链接:
更多推荐
所有评论(0)