Vue js:this.$emit 不是函数

Posted

技术标签:

【中文标题】Vue js:this.$emit 不是函数【英文标题】:Vue js : _this.$emit is not a function 【发布时间】:2017-08-21 18:39:33 【问题描述】:

我创建了一个 Vue 组件调用 imageUpload 并将属性作为 v-model 传递

<image-upload v-model="form.image"></image-upload>

imgeUpload 组件内 我有这个代码

<input type="file" accept="images/*" class="file-input" @change="upload">

upload:(e)=>

    const files = e.target.files;
    if(files && files.length > 0)
        console.log(files[0])
        this.$emit('input',files[0])
     
    

我收到了

未捕获的类型错误:_this.$emit 不是函数

谢谢

【问题讨论】:

【参考方案1】:

不要用粗箭头定义你的方法。使用:

upload: function(e)
    const files = e.target.files;
    if(files && files.length > 0)
        console.log(files[0])
        this.$emit('input',files[0])

    
 

当您使用粗箭头定义方法时,您将捕获词法范围,这意味着 this 将指向包含范围(通常是 windowundefined),而不是 Vue。

【讨论】:

【参考方案2】:

如果 $emit 不在 this 的当前上下文/引用中,则此错误会出现,可能是在您使用 promise 的 thencatch 方法时。在这种情况下,在 Promise 之外捕获对 this 的引用,然后使用,这样对 $emit 的调用就成功了。

<script type="text/javascript">
var Actions = Vue.component('action-history-component', 
        template: '#action-history-component',
        props: ['accrual'],
        methods: 
            deleteAction: function(accrualActionId) 
                var self = this;
                axios.post('/graphql',
                    
                        query:
                            "mutation($accrualId: ID!, $accrualActionId: String!)  deleteAccrualAction(accrualId: $accrualId, accrualActionId: $accrualActionId)  accrualId accrualRate name startingDate lastModified hourlyRate isHeart isArchived minHours maxHours rows  rowId currentAccrual accrualDate hoursUsed actions  actionDate amount note dateCreated   actions accrualActionId accrualAction actionDate amount note dateCreated  ",
                        variables: 
                            accrualId: this.accrual.accrualId,
                            accrualActionId: accrualActionId
                        
                    ).then(function(res) 
                    if (res.data.errors) 
                        console.log(res);
                        alert('errors');
                     else 
                        self.$emit('accrualUpdated', res.data.data.deleteAccrualAction);
                    
                ).catch(function(err) 
                    console.log(err);
                );
            
        
    );

【讨论】:

【参考方案3】:

您可以使用upload(e) 而不是upload:(e)=&gt; 来编写简短的方法,以使这一点指向组件。

这是完整的例子

watch: 
    upload(e) 
        const files = e.target.files;
        if(files && files.length > 0) 
            console.log(files[0]);
            this.$emit('input',files[0]);
        
    

【讨论】:

以上是关于Vue js:this.$emit 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

VUE学习笔记

vue3之setup 函数基本使用

Vue2 $emit传函数类型回调获取父组件参数

vue.js中$emit的理解

Vue中匿名函数和箭头函数的this

Vue的$发出异步操作吗?