vue中一些方法的原理

Posted znlam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue中一些方法的原理相关的知识,希望对你有一定的参考价值。

1.$set

 用法:this.$set(Object, key, value)或 Vue.$set(Object, key, value)

   原理:当data数据中存在某个属性时,我们对他进行更改,页面会更新;但是如果data数据中没有某个属性值,我们对其更改,页面不会显示此属性;那是因为再vue初始化的时候,已经将data中定义的数据处理成响应式的了,所以数据的改变会触发页面的更新;但是新增的属性却不是响应式的,虽然打印可以看到对象确实多了此属性,但是由于不是响应式的,所以不会体现在页面上

##源码
位置:src/core/observer/index.js

 //set接收三个参数,target/key/val  target的类型为对象或者数组
export function set (target: Array<any> | Object, key: any, val: any): any {
  //当前环境为生产环境并且 target为null/undefined 或者 || target为string/number/symbol/boolean的一种时  抛出警告
  if (process.env.NODE_ENV !== ‘production‘ &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
  }
  //数组
  //判断是数组并且key为有效的数组索引
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    //将target数组的长度设置为target.length和key中的最大值
    target.length = Math.max(target.length, key)
    //做替换操作
    target.splice(key, 1, val)
    return val
  }
  //对象
  //key为数据中的一个属性并且不是Object原型上的属性
  if (key in target && !(key in Object.prototype)) {
    //已经存在说明是响应式的,直接更新
    target[key] = val
    return val
  }
  //之前不存在的情况
  //定义ob的值为target._ob_ 
  const ob = (target: any).__ob__
  //target对象是vue实例对象或者根数据对象,就会抛出错误
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== ‘production‘ && warn(
      ‘Avoid adding reactive properties to a Vue instance or its root $data ‘ +
      ‘at runtime - declare it upfront in the data option.‘
    )
    return val
  }
  //ob不存在,target不是响应式的
  if (!ob) {
    target[key] = val
    return val
  }
  //对新添加的key或者val做响应式
  defineReactive(ob.value, key, val)
  //通知更新
  ob.dep.notify()
  return val
}

参考链接:https://www.cnblogs.com/heavenYJJ/p/9559439.html

 

以上是关于vue中一些方法的原理的主要内容,如果未能解决你的问题,请参考以下文章

vue中一些方法的原理

vue —— VSCode代码片段

vue —— VSCode代码片段

VSCode自定义代码片段——.vue文件的模板

Vue报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object 的解决方法(代码片段

VSCode自定义代码片段1——vue主模板