vue监听数组变化的源码inserted = args.slice(2),为什么要slice(2)?

发布于 2022-09-13 00:44:10 字数 1075 浏览 8 评论 0

/*

  • not type checking this file because flow doesn't play well with
  • dynamically accessing methods on Array prototype
    */

import { def } from '../util/index'

const arrayProto = Array.prototype
export const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
]

/**

  • Intercept mutating methods and emit events
    */

methodsToPatch.forEach(function (method) {
// cache original method
const original = arrayProto[method]
def(arrayMethods, method, function mutator (...args) {

const result = original.apply(this, args)
const ob = this.__ob__
let inserted
switch (method) {
  case 'push':
  case 'unshift':
    inserted = args
    break
  case 'splice':
    inserted = args.slice(2)
    break
}
if (inserted) ob.observeArray(inserted)
// notify change
ob.dep.notify()
return result

})
})

这里的inserted = args.slice(2),为什么要slice(2)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧梦荧光笔 2022-09-20 00:44:10

image.png

splice 前俩个参数是被替换的位置和长度,第三个参数开始是新增的被插入的值。
做响应式监听的时候,主要是为了对新增加的值做监听,所以拿到slice(2) 就拿到了新增加的数据项,执行ob.observeArray(inserted)就可以了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文