首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue js:_this.$emit不是一个函数

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

Stack Overflow用户
提问于 2017-03-28 15:32:05
回答 3查看 42.1K关注 0票数 22

我已经创建了一个Vue组件调用imageUpload,并将属性作为v-模型传递。

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

imgeUpload组件中,我有以下代码

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

代码语言:javascript
复制
upload:(e)=>{

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

我收到了

Uncaught:_this.$emit不是函数

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-28 15:37:47

不要使用fat箭头来定义方法。使用:

代码语言:javascript
复制
upload: function(e){
    const files = e.target.files;
    if(files && files.length > 0){
        console.log(files[0])
        this.$emit('input',files[0])

    }
} 

当使用fat箭头定义方法时,可以捕获词法作用域,这意味着this将指向包含作用域(通常是windowundefined),而不是Vue。

票数 40
EN

Stack Overflow用户

发布于 2018-10-16 03:46:49

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

代码语言:javascript
复制
<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);
                });
            }
        }
    });

票数 6
EN

Stack Overflow用户

发布于 2018-07-12 16:59:43

简单地说,您可以使用upload(e) {而不是upload:(e)=>{来编写该方法,以便将这一点指向组件。

以下是完整的示例

代码语言:javascript
复制
watch: {
    upload(e) {
        const files = e.target.files;
        if(files && files.length > 0) {
            console.log(files[0]);
            this.$emit('input',files[0]);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43073797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档