2
2
3
3
import Watcher from '../observer/watcher'
4
4
import Dep from '../observer/dep'
5
+
5
6
import {
6
7
observe ,
7
8
defineReactive ,
8
- observerState ,
9
- proxy ,
10
- unproxy
9
+ observerState
11
10
} from '../observer/index'
11
+
12
12
import {
13
13
warn ,
14
14
hasOwn ,
15
+ isReserved ,
15
16
isPlainObject ,
16
17
bind ,
17
18
validateProp ,
@@ -180,9 +181,13 @@ export function stateMixin (Vue: Class<Component>) {
180
181
dataDef . get = function ( ) {
181
182
return this . _data
182
183
}
183
- dataDef . set = function ( newData : Object ) {
184
- if ( newData !== this . _data ) {
185
- setData ( this , newData )
184
+ if ( process . env . NODE_ENV !== 'production' ) {
185
+ dataDef . set = function ( newData : Object ) {
186
+ warn (
187
+ 'Avoid replacing instance root $data. ' +
188
+ 'Use nested data properties instead.' ,
189
+ this
190
+ )
186
191
}
187
192
}
188
193
Object . defineProperty ( Vue . prototype , '$data' , dataDef )
@@ -205,33 +210,17 @@ export function stateMixin (Vue: Class<Component>) {
205
210
}
206
211
}
207
212
208
- function setData ( vm : Component , newData : Object ) {
209
- newData = newData || { }
210
- const oldData = vm . _data
211
- vm . _data = newData
212
- let keys , key , i
213
- // unproxy keys not present in new data
214
- keys = Object . keys ( oldData )
215
- i = keys . length
216
- while ( i -- ) {
217
- key = keys [ i ]
218
- if ( ! ( key in newData ) ) {
219
- unproxy ( vm , key )
220
- }
221
- }
222
- // proxy keys not already proxied,
223
- // and trigger change for changed values
224
- keys = Object . keys ( newData )
225
- i = keys . length
226
- while ( i -- ) {
227
- key = keys [ i ]
228
- if ( ! hasOwn ( vm , key ) ) {
229
- // new property
230
- proxy ( vm , key )
231
- }
213
+ function proxy ( vm : Component , key : string ) {
214
+ if ( ! isReserved ( key ) ) {
215
+ Object . defineProperty ( vm , key , {
216
+ configurable : true ,
217
+ enumerable : true ,
218
+ get : function proxyGetter ( ) {
219
+ return vm . _data [ key ]
220
+ } ,
221
+ set : function proxySetter ( val ) {
222
+ vm . _data [ key ] = val
223
+ }
224
+ } )
232
225
}
233
- oldData . __ob__ && oldData . __ob__ . vmCount --
234
- observe ( newData )
235
- newData . __ob__ && newData . __ob__ . vmCount ++
236
- vm . $forceUpdate ( )
237
226
}
0 commit comments