大家好我是王超朋:
  想更快更有效率的结局bug,那就必须迅速的定位问题,找出和原因,但是我们在使用第三方框架时,有是有的bug让人找不到眉目.最简单的办法,就是吧他们的源码阅读一遍.

咋们看一下抛出该异常的代码块:

/**
  vue.$set 函数
 */
function set (target , key, val) {
  // 在生产模式下,isPrimitive是不是基本类型,
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
  }
  // target 如果是数组,那么替换当前key位置的值为val 并返回vale
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key);
    target.splice(key, 1, val);
    return val
  }
  //判断key是不是target 的属性, 并且该属性不能为保留字
  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val
  }
  var ob = (target).__ob__;
  // 是否为
  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
  }
  if (!ob) {
    target[key] = val;
    return val
  }
  defineReactive$$1(ob.value, key, val);
  ob.dep.notify();
  return val
}

代码告诉我出现该BUG的原因,
第一传入的target 参数是vue的实例;也就是说

    this.$set(this,name,'wcp');  这段代码会抛出异常
第二 :

传入的对象为父组件内在data 中声明的对象;
props:['obj'];
this.$set(obj,'name','wcp'); 这段代码抛出异常 

 

Logo

前往低代码交流专区

更多推荐