在创建Vue实例时,可以通过在data
对象中定义各种属性来存放数据,如下所示:
new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
count: 0,
list: ['Apple', 'Banana', 'Orange']
}
});
这里定义了三个属性:message
、count
和list
。这些属性在Vue实例中都是响应式的。当这些属性的值发生变化时,Vue会自动更新视图中对应的内容,从而实现数据与视图的双向绑定。
例如,当我们修改message
属性的值时,视图中也会相应地更新,如下所示:
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
// 修改message的值
app.message = 'Hello World!';
在这个例子中,当message
属性的值从'Hello Vue!'
变为'Hello World!'
时,视图中对应的内容也会更新。
Vue的data
属性有如下几个运行规则:
1. data
属性必须是一个函数,返回一个对象。这个函数会在创建Vue实例时执行,每个实例都会有自己的数据对象。
2. data
对象中的属性都是响应式的。当属性的值发生变化时,相关的视图会自动更新。
3. 在Vue实例创建后,如果尝试动态添加新的属性到data
对象上,这些属性将不会触发视图更新。因此,最好在创建Vue实例时就定义好data
中所有需要使用的属性。
4. Vue会对data
对象中的属性进行劫持,在属性被访问或修改时,Vue会通知订阅了对应属性的视图更新。
5. 对于对象或数组类型的属性,在Vue 2.x中需要使用特殊的方法来更新其内容,比如Vue.set
和Vue.splice
。在Vue 3.x中,可以直接使用原生操作符进行修改,Vue会自动进行响应式更新。
总的来说,Vue的data
属性是Vue实现数据响应式的核心。在使用Vue时,我们需要遵循data
属性的规则,只有这样才能让Vue正常工作并实现数据与视图的双向绑定。
为什么this. 可以调用data中的数据,而不是this.data.
在Vue实例中,this
指向当前实例对象。当访问this.xxx
属性时,Vue会先检查实例对象中是否有该属性,如果没有则会去data
对象中查找。这个过程是Vue框架自动进行的,我们只需要在data
对象中定义需要使用的属性即可。
值得注意的是,如果我们在data
对象中定义了一个属性,但没有在模板中使用到(即没有手动添加到Vue
实例中),那么这个属性是不会被劫持的。这意味着即使我们修改了这个属性,视图也不会进行响应式更新。因此,我们应该确保所有需要使用的属性都被添加到Vue
实例中。
另外,需要注意的是,在Vue 3.x中,可以使用data属性来访问当前实例中的data数据,比如this.data.xxx。但在Vue 2.x中,不建议直接访问
它是如何实现这一操作的呢
Vue实现this.xxx
可以访问data
中的数据的方式,是通过Object.defineProperty()
方法对Vue
实例进行劫持。
在Vue创建实例的过程中,会对data
中的每个属性都调用Object.defineProperty()
方法进行劫持,使得当该属性被修改时,Vue能够及时感知到并更新视图。
具体而言,Object.defineProperty()
方法可以为对象的属性添加get
和set
方法。当我们访问该属性时,就会调用get
方法返回该属性的值;当我们修改该属性时,就会调用set
方法,从而进行响应式更新。
在Vue中,将data
对象中的所有属性都定义了get
和set
方法,从而实现了this.xxx
可以访问data
中的数据的效果。这样,当我们在Vue实例中修改了某个属性的值时,Vue会自动检测到并更新相关的视图,从而实现了响应式更新的效果。