Vue.js(二) 双向数据绑定(数据驱动)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vbirdbest/article/details/85012162

一:双向数据绑定简介

Vue最核心的功能时双向数据绑定和组件模块化。

双向绑定:

  • 当视图(View)的值发生改变时会自动更新model的值;
  • 当model的值发生改变时会自动更新视图(View);

这里的视图View是指html中的标签元素,也就是DOM元素;这里的model就是指JavaScript中的对象,也就是用object{foo: bar}

二:双向数据绑定JS实现

下面示例写了一个基本双向数据绑定的实现,打开控制台Console我们可以看到,当在input中输入值时也就是input的值发生改变时,input中的value值会自动赋值给user对象的username属性;当对象user的username属性的值发生改变时也会改变input标签的value值,即View也会跟着改变。

<html>
<head>
	<title>双向数据绑定</title>
	<script type="text/javascript">
		// model
		var user = {username: ''};


		// 当view(DOM元素)发生了改变也会更改model的值
		function viewChangeModel() {
			// 更改model的值
			var newValue = document.getElementById("view").value;
			user.username = newValue;
			console.log(newValue);
		}

		// 改变model的值会被监听监听到,然后更改view(DOM元素)
		function modelChangeView() {
			user.username = 'mengday';
		}

		// 监听器:监听属性的改变
		// 当model发生改变时也会更新view
		Object.defineProperty(user, 'username', {
    		set:function(value){
          		//此处拦截了设置请求
          		console.log('newValue=' + value);
          		document.getElementById("view").value = value;
     		}
		});
	</script>
</head>
<body>
	Username <input id="view" type="text" name="username" oninput="viewChangeModel()"><br/> 
	<button onclick="modelChangeView()">user.username='mengday'</button>
</body>
</html>

在这里插入图片描述

三:双向数据绑定Vue实现

上面示例实现双向数据绑定需要额外写代码来实现,但是在Vue中这些功能就能轻易实现。Vue实现双向数据绑定是通过以下两个功能来实现的:

在这里插入图片描述

Vue.js主要负责的是上图绿色正方体ViewModel的部分,其在View层(即DOM层)与Model层(即JS逻辑层)之间通过ViewModel绑定了DOM Listeners与Data Bingings两个相当于监听器的东西。当View层的视图发生改变时,Vue会通过DOM Listeners来监听并改变Model层的数据。相反,当Model层的数据发生改变时,其也会通过Data Bingings来监听并改变View层的展示。这样便实现了一个双向数据绑定的功能,也是Vue.js数据驱动的原理所在。

  • DOM Listeners(DOM 监听器):监听DOM元素(也就是html标签)的改变,当DOM发生改变时会自动更新model的值;
  • Data Bindings(数据绑定):当model的值发生改变时会自动更新DOM元素的展示;

Vue.js是一款轻量级的以数据驱动的前端JS框架,通过数据的改变来实现页面的更新与展示。与jQuery最大的不同点在于jQuery通过操作DOM来改变页面的显示,而Vue通过操作数据来。相比而言改变数据操作更加简单。

使用Vue演示双向数据绑定

关于使用Vue-cli来搭建项目请看Vue.js + element-ui 扫盲

HelloWorld.vue

<template>
  <div>
     Usernanme <input v-model="username"/> {{username}} <br/>
     <button @click="changeModel">this.username='mengday'</button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      username: ''
    }
  },
  methods: {
    changeModel() {
      this.username = 'mengday'
    }
  }
}
</script>

在input中每输入一个字符username的值都会发生改变,通过点击按钮来触发username改变,可以看到input中展示也会跟着同步改变。

注意:示例代码中的template标签、@click、v-model、以及export default要导出的对象都是Vue中的内容。后面会介绍。
在这里插入图片描述

文本插值表达式 {{ key }}

上面示例中使用{{ key }}这种语法称之为文本插值表达式,key为data函数返回的对象属性名,文本插值表达式的作用是获取该属性对应的值作为普通文本。就是一种快捷获取data函数返回的对象的属性的值。

插值表达式内也可以做一些简单的计算,如 {{ count + 1}}、{{str.split(" ")}} 等等。

猜你喜欢

转载自blog.csdn.net/vbirdbest/article/details/85012162