【问题标题】:Can I call a method from a watch and mounted?我可以从手表调用方法并安装吗?
【发布时间】:2018-01-14 12:24:48
【问题描述】:

我有一个功能(getAllData 执行外部数据查询),我需要在两种情况下调用它:安装组件时和 prop 更改时。

然而,在watchmounted 中使用它时,我得到了TypeError: this.getAllData is not a function

由于methods can be called from methods,我想知道从watchmounted 等组件调用的方法是否如此。

我的(简化的)实例如下:

export default {
    props: ['triggerReload'],
    data: function () {
        return {
            // some variables
        }
    },
    watch: {
        triggerReload: this.getAllData()
    },
    methods: {
        getAllData: function () {
            // this function correctly fetches external data
        }
    },
    mounted: this.getAllData()
}

我的解决方法是复制函数的代码(不是 DRY)或调用外部函数(在 Vue 实例之外定义 - 这可能也是一种反模式)编辑:这是一个组件,所以我不知道如何调用外部函数并引用实例(它不是由var vm = new Vue(...) 实例化的)

【问题讨论】:

  • 你检查过this是什么吗?

标签: javascript vue.js


【解决方案1】:

是的,你可以,只是语法错误,你需要(注意额外的括号):

...
mounted () {
    this.getAllData()
}

这只是 ES6 的糖

mounted: function mounted () {
    this.getAllData()
}

在您的版本中,当创建对象组件时,您将mounted 绑定到this.getAllData,因此this 将引用当前对象,该对象没有getAllData 方法.您需要在函数中执行此操作,以便 Vue 发挥其魔力并将 this 绑定到正确的 Vue 组件。

【讨论】:

  • 这个答案将从一个如何真正做到正确的例子中受益匪浅。
  • 也许我误解了一些东西,但你的第二个例子是有效的吗?如果是这样,那么“which is just ES6 sugar for”这句话就极具误导性; “糖”表明两者在语义上是等价的,因此,由于第一个是错误的,第二个也必须是。
  • 两者是正确的(并且确实是完全等价的!)。第一个是不是来自 OP 的代码,它是正确的版本,我会澄清缺少的内容(父代)
  • 啊,这就解释了。非常感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多