开发者问题收集

Vue js:this.$emit 不是一个函数

2017-03-28
52079

我创建了一个名为 imageUpload 的 Vue 组件,并将一个属性作为 v-model 传递,如下所示:

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

imageUpload 组件中我有此代码

<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])
         }
    }

我收到此错误:

Uncaught TypeError: _this.$emit is not a function

谢谢

3个回答

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

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。

Bert
2017-03-28

如果 $emit 不在 this 的当前上下文/引用中,则会出现此错误,可能是当您处于承诺的 thencatch 方法中时。在这种情况下,请在承诺之外捕获对 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);
                });
            }
        }
    });

Ryan Rodemoyer
2018-10-16

您可以简短地编写该方法,使用 upload(e) { 而不是 upload:(e)=>{ 来使 this 指向组件。

以下是完整示例

watch: {
    upload(e) {
        const files = e.target.files;
        if(files && files.length > 0) {
            console.log(files[0]);
            this.$emit('input',files[0]);
        }
    }
}
spicydog
2018-07-12