Skip to content

Commit e9ea565

Browse files
ismailarilikyyx990803
authored andcommitted
polish: raise warning when Vue.set/delete is called on invalid values (#7452)
close #7381
1 parent dc2171a commit e9ea565

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

src/core/observer/index.js

+12
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,12 @@ export function defineReactive (
194194
* already exist.
195195
*/
196196
export function set (target: Array<any> | Object, key: any, val: any): any {
197+
if (process.env.NODE_ENV !== 'production' &&
198+
!Array.isArray(target) &&
199+
!isObject(target)
200+
) {
201+
warn(`Cannot set reactive property on non-object/array value: ${target}`)
202+
}
197203
if (Array.isArray(target) && isValidArrayIndex(key)) {
198204
target.length = Math.max(target.length, key)
199205
target.splice(key, 1, val)
@@ -224,6 +230,12 @@ export function set (target: Array<any> | Object, key: any, val: any): any {
224230
* Delete a property and trigger change if necessary.
225231
*/
226232
export function del (target: Array<any> | Object, key: any) {
233+
if (process.env.NODE_ENV !== 'production' &&
234+
!Array.isArray(target) &&
235+
!isObject(target)
236+
) {
237+
warn(`Cannot delete reactive property on non-object/array value: ${target}`)
238+
}
227239
if (Array.isArray(target) && isValidArrayIndex(key)) {
228240
target.splice(key, 1)
229241
return

test/unit/modules/observer/observer.spec.js

+12
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,18 @@ describe('Observer', () => {
356356
})
357357
})
358358

359+
it('warn set/delete on non valid values', () => {
360+
try {
361+
setProp(null, 'foo', 1)
362+
} catch (e) {}
363+
expect(`Cannot set reactive property on non-object/array value`).toHaveBeenWarned()
364+
365+
try {
366+
delProp(null, 'foo')
367+
} catch (e) {}
368+
expect(`Cannot delete reactive property on non-object/array value`).toHaveBeenWarned()
369+
})
370+
359371
it('should lazy invoke existing getters', () => {
360372
const obj = {}
361373
let called = false

0 commit comments

Comments
 (0)