响应式del方法

10/25/2021 vue

delset方法一样,都是响应式方法,只不过del方法是删除数组或对象中的某一项,该方法在全局方法Vue.delete和实例方法vm.$delete内被调用,可分别在src/core/global-api/index.jssrc/core/instance/state.js文件中可查看相关定义

这个方法应该很少会用到

// src/core/global-api/index.js
Vue.delete = del

// src/core/instance/state.js
export function stateMixin (Vue: Class<Component>) {
  
  // ......
  Vue.prototype.$delete = del
  // ......
	
}
1
2
3
4
5
6
7
8
9
10
11

del方法和set方法定义在同一文件src/core/observer/index.js

export function del (target: Array<any> | Object, key: any) {
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(`Cannot delete reactive property on undefined, null, or primitive value: ${(target: any)}`)
  }
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.splice(key, 1)
    return
  }
  const ob = (target: any).__ob__
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== 'production' && warn(
      'Avoid deleting properties on a Vue instance or its root $data ' +
      '- just set it to null.'
    )
    return
  }
  if (!hasOwn(target, key)) {
    return
  }
  delete target[key]
  if (!ob) {
    return
  }
  ob.dep.notify()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

从该方法的参数target的类型就可以看出来,该参数只接受数组和对象,在方法内部首先对target做了层处理,如果为undefined或为简单类型的值,则会给出warn提示,接着会判断target是否为数组并且key是一个有效的索引,isValidArrayIndex方法在响应式set方法 (opens new window)小节已经分析过,这里就不多做说明

# 数组

如果target为数组,则会直接使用splice方法删除然后return,由于数组的部分原型方法被重写,所以会在被重写的splice方法内部直接进行触发更新

# 对象

接着del方法的逻辑进行分析,如果targetVue的实例化对象,或者为根data对象,则会报warn提示并return,如果需要删除的属性key不存在target自身中,会直接return,否则会使用delete方法删除对象的属性,如果target对象不是响应式对象则只是做单纯的删除属性操作,否则会进一步的做触发更新操作

最后更新时间: 12/4/2022, 1:44:46 PM