以官方文档给出说明和案例为基础,进行自我学习和理解的扩充。
在官方文档中,针对数据的响应式渲染,有这么一段描述:
当一个
Vue
实例被创建
时,它将data 对象
中的所有的property
加入到 Vue 的响应式系统中。
当这些
property
的值发生改变
时,视图将会产生“响应”
,即匹配更新为新的值。
这句话从字面意思上说的很绕,但是如果换一种思维方式来看这段描述内容就会豁然开朗。
以JAVA
的开发思维来看这个问题。
在使用VUE时,必须先构建VUE的实例对象,也就是需要采取new Vue()
的方式。
既然是对象,那么这个对象中可能存在某些属性,恰好目前我们所能熟知的有两大属性:el
和data
。
el就是指让哪个容器进行响应。
data就是指响应时,需要显示的内容信息。
那么,此时的Vue对象,根据Java类的结构,可以大致理解为下面的类结构:
public class Vue{
// 需要响应数据的容器对象
private Object el;
// 响应的数据信息
private Object data;
}
有了上面的理解,接下来按照官方文档中给出的案例,进行数据的响应式理解。
官方文档中说到:当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。
按照官方的栗子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
{{message}}
</div>
</body>
<script src="../js/vues.js"></script>
<script type="text/javascript">
// 外围命名数据对象结构信息
var datas = {message:"xiangjiao"};
var vues = new Vue({
el:"#app",
data:datas
});
</script>
</html>
使用方式一:datas.message
进行值的修改:
datas.message = "99999";
使用方式二:vues.message
进行值的修改:
vues.message = "666666";
使用方式三:vues.$data.message
进行值的修改:
vues.$data.message = "bunana";
$
的出现,是因为在开发中可能出现开发者定义的属性名和vue本身的属性名一样的情况。为了避免使用和理解上的混淆,vue团队推出$
用来区分Vue本身和用户定义 实例的 property 、方法。
针对下面代码进行说明:
vues.$data.message = "bunana";
vues.$data
是vue本身的data属性信息
,使用vues.$data.message
实际上就是指下图的对应信息:
vues.$data 就是 new Vue对象中的 data属性,这个属性的值为 {message:“xiangjiao”}
vue官方文档中提出了一个很好玩的技术:$watch
,用来监听某个变量的数据值的前后变化
。如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
{{message}}
</div>
</body>
<script src="../js/vues.js"></script>
<script type="text/javascript">
var datas = {message:"xiangjiao"};
var vues = new Vue({
el:"#app",
data:datas
});
//datas.message = "99999";
//vues.message = "666666";
//alert(JSON.stringify(vues.$data));
// 针对指定变量,进行设定“观察”
vues.$watch('message',function(newVal,oldVal){
console.log("newVal:"+newVal);
console.log("oldVal:"+oldVal);
})
// vues.$data 就是 new Vue对象中的 data属性,这个属性的值为 {message:"xiangjiao"}
vues.$data.message = "bunana";
</script>
</html>
允许代码后,控制台打印数据信息如下所示:
只有当实例
被创建时
就已经存在
于data
中的property
才是响应式
的。
这句话可以理解为:
需要显示的区域如下所示
<div id="app">{{message}}</div>
此时,如果需要message
变量的值能够支持响应式
显示,那么必须在new Vue
时,其属性必须具备初始值,如下所示:
new Vue({
el:"#app",
data:{
message:"xiangjiao"
}
});
如果从一开始就未在new Vue
构建实例时将message
进行初始化,那么后面不管如何进行数据的变更,都不会让该属性能够响应式显示(数据随之变化)
。