找不到对象Cannot set property ‘test’ of undefined,匿名函数闭包问题&箭头函数,Vue生命周期执行顺序

  • Post author:
  • Post category:vue


话说回头来看,前面写的太不清楚了,我一直在vue的执行顺序上去寻求解决之道,是走错了路,也不记得之前别的部分的代码是怎样的了。

———————–我是一道门,门外是柳暗花明————————————————–


隔了好长时间来解决这个问题,我调整了文章顺序,因为回忆部分不重要了…

来贴一下我今天的代码:

export default {
    name: "blankFill",
    mounted: function () {
      **this.getEditor();**
    },
    data() {
      return {
        editor:'',
        answerItems: [{}],
        test:‘’,
      }
    },
    watch:{
    },
    props:{
      index:{
        type: Number,
        required:true
      }
    },
    components: {
      answerGroup,
    },
    methods: {
      AddAnswer: function () {
        this.answerItems.push({'': ''});
      },
      getEditor:function () {
        //var Editor = window.wangEditor
        //var E = window.wangEditor;
        this.editor = new E('#toolbar', '#editor');

        // 或者 var editor = new E( document.getElementById('editor') )
        this.editor.customConfig.onchange =function (text){
        this.test=text;
          // html 即编辑器中的内容
          this.$emit('GetcurrentC',text)
        }
        this.editor.create()
      }
    }

  }
</script>

执行结果报错,找不到test:

在这里插入图片描述

其实跟我当日的问题一样,就是在mounted中调用时,找不到data中的数据。


解决方案

<script>
  import E from 'wangeditor'
  import answerGroup from './answerGroup'

  export default {
    name: "blankFill",
    mounted: function () {
      this.getEditor();
    },
    data() {
      return {
        editor:'',
        answerItems: [{}],
        test:''
      }
    },
    watch:{
    },
    props:{
      index:{
        type: Number,
        required:true
      }
    },
    components: {
      answerGroup,
    },
    methods: {
      AddAnswer: function () {
        this.answerItems.push({'': ''});
      },
      getEditor:function () {
        //var Editor = window.wangEditor
        //var E = window.wangEditor;
        this.editor = new E('#toolbar', '#editor');

        // 或者 var editor = new E( document.getElementById('editor') )
        this.editor.customConfig.onchange =(text)=>{
          // html 即编辑器中的内容
          this.test=text;
          this.$emit('GetcurrentC',text)
        }
        this.editor.create()
      }
    }

  }
</script>


其实是将其中的匿名函数改为=>箭头函数


原因是:


1.使用匿名函数后,就使用了闭包,其作用范围就相当于其调用(父)的函数,这样的话,如果使用this,this指向的是window对象;因此,取不到data中的数据是很正常的。

2.现在说=>为什么与众不同呢?因为它可以改变this的指向,用了它,this将指向定义时的上下文,也就是VueComponent。


下面来附上相关的资料,都是各个大牛的链接:

了解闭包,很清晰:

https://www.cnblogs.com/duanlianjiang/p/5036671.html


深入了解闭包:

https://www.cnblogs.com/ruixiazhixia/p/6024758.html

————————————–我是一道门,门外是回忆—————————————–

代码:其中定义data:pageSize,我试图在不同阶段取到这个值。

在这里插入图片描述

1.mounted、created时调用外部函数,外部函数f()调用data时报错,但我的外部函数f()确实执行了,你可以看到我打印出了js function load。

在这里插入图片描述

在这里插入图片描述

2.但在window.onload,document ready时调用不报错。

在这里插入图片描述

猜测vue的data可能是在mounted之后才实例化的,答案是错的,因为我在created和mounted时都可以取到data中的值pageSize:2 ,说明data一定是在created之前实例化了!!但是我的外部
在这里插入图片描述

但如果我这个函数不在mounted或者created中调用,我的外部函数f()并不会报错。

在这里插入图片描述

未完待续。。。。



版权声明:本文为Angie0418原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。