vue

vue的属性名称与method的方法名称一样时会发生什么问题?

发布于 2021-01-11 17:02:56
关注者
0
被浏览
637
4 个回答
  • 面试哥
    面试哥 2021-01-12
    为面试而生,有面试问题,就找面试哥。

    报错 "Method 'xxx' has already been defined as a data property"

    键名优先级:props > data > methods

  • 面试哥
    面试哥 2021-01-12
    为面试而生,有面试问题,就找面试哥。

    报warn,项目可以运行(vue2.5.17)
    但data属性会覆盖methods定义的值,报属性已定义警告
    props不会覆盖值,但会报属性已定义警告和Prop异常警告

  • 面试哥
    面试哥 2021-01-12
    为面试而生,有面试问题,就找面试哥。

    [Vue warn]: Method "xxx" has already been defined as a data property.
    [Vue warn]: Error in mounted hook: "TypeError: this.xxx is not a function"
    TypeError: this.xxx is not a function

  • 面试哥
    面试哥 2021-01-12
    为面试而生,有面试问题,就找面试哥。

    首先看下initState(vm)方法的定义:

    export function initState(vm) {
      ...
      const opts = vm.$options
      if(opts.props) initProps(vm, opts.props)
      if(opts.methods) initMethods(vm, opts.methods)   // 主要作用是将methods内的方法挂载到this下
      if(opts.data) initData(vm)
      ...
      if(opts.computed) initComputed(vm, opts.computed)
      if(opts.watch && opts.watch !== nativeWatch) {
        initWatch(vm, opts.watch)
      }
    }
    

    再看initMethods (vm, methods):

    function initMethods(vm, methods) {
      const props = vm.$options.props
      for(const key in methods) {
        
        if(methods[key] == null) {  // methods[key] === null || methods[key] === undefined 的简写
          warn(`只定义了key而没有相应的value`)
        }
        
        if(props && hasOwn(props, key)) {
          warn(`方法名和props的key重名了`)
        }
        
        if((key in vm) && isReserved(key)) {
          warn(`方法名已经存在而且以_或$开头`)
        }
        
        vm[key] = methods[key] == null
          ? noop  // 空函数
          : bind(methods[key], vm)  //  相当于methods[key].bind(vm)
      }
    }
    
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看