vue中$emit事件无法触发。

1、我用$emit方法去实现子组件调用父组件方法的功能,开始的时候都能正常使用,但是后来我在下面的代码中就无法触发了,网上说是方法大小写的原因,但是改了之后还是不行~
代码如下:

  editCreditApi(params).then((res) => {
    let rowId = this.$store.state.rowId;
    let status = this.$store.state.productStatus;
    let productType = this.$store.state.dialogType;
    let params = {
      id: rowId
    }
    if (status == '草稿') {
      creditreferAPI(params).then((res) => {
        **this.$emit('getFundList','edit');**
      })
    }
  })
      

但是,把这段代码放到外面就能正常调用:

editCreditApi(params).then((res) => {
    let rowId = this.$store.state.rowId;
    let status = this.$store.state.productStatus;
    let productType = this.$store.state.dialogType;
    let params = {
      id: rowId
    }
    
    //可以正常调用
    this.$emit('getFundList','edit');
    
    if (status == '草稿') {
      creditreferAPI(params).then((res) => {
        //正常弹出
        alert(1)
         
        try{
          //无法触发
          this.$emit('getFundList','edit');
        }catch(e){
          //无输出
          console.log(e)
        }
        
        //正常弹出
        alert(2)
      })
    }
  })

不知道大家有没有遇到这种情况,或者是知道是这种情况是什么原因导致的,如能解惑,万分感激!

ps:大家都觉得是this的指向问题导致的,但是我在外面用that把this存起来,再去调用还是不行~

阅读 14.5k
9 个回答

emit里的事件名不要用大写字母试试

clipboard.png
源码里检测到用大写会报警告

原因是var cbs = vm._events[event];
这边vm._events里面的事件名(也就是你模板里监听的事件名)都是会转成小写的
而触发传入的是大写字母的方法 找不到 就不会走到下面的if事件 也就不会触发事件效果

楼主调用完这个方法是不是就关闭子模块了 ,子模块是否是一个弹框?那你的关闭方法 要在调用结束之后再调用,否则还没调用完$emit 你就关闭弹框了,调用方法到返回结果是有时间的,我也遇到你这个问题,刚看了下 是这个问题

你换下that试试,第二个回调里面的that.$emit('...', '...')

把let that = this; 去掉

1.this指向 用的箭头函数应该没问题
2.if是否进入
3.creditreferAPI是否请求成功

代码贴的不太够,初步看可能是this作用域问题,试试在最外层申明 that=this 将里面的this替换成that

箭头函数this不对,把外部this缓存下来

新手上路,请多包涵

$on和$emit的执行顺序,需要先执行$on监听一个事件,然后再执行$emit来触发所监听的这个事件

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题