Vue js:_this。$ emit不是函数

时间:2017-03-28 15:32:06

标签: vuejs2 vue-component

我创建了一个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])
     }
}    

我收到了

  

未捕获的TypeError:_this。$ emit不是函数

由于

3 个答案:

答案 0 :(得分:26)

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

irb(main):002:0> { :'Value Name' => 'Value to be inserted' }                                                                                    
=> {:"Value Name"=>"Value to be inserted"}  

使用胖箭头定义方法时,捕获词法范围,这意味着upload: function(e){ const files = e.target.files; if(files && files.length > 0){ console.log(files[0]) this.$emit('input',files[0]) } } 将指向包含范围(通常为thiswindow),并且不是Vue。

答案 1 :(得分:0)

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

这是完整的示例

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

答案 2 :(得分:0)

如果$ emit不在this的当前上下文/引用中,则可能出现此错误,也许是在您使用promise的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);
                });
            }
        }
    });