【问题标题】:Is it possible to trigger a function upon a Vue data element change?是否可以在 Vue 数据元素更改时触发函数?
【发布时间】:2017-01-06 08:43:31
【问题描述】:

我的 API 为我提供了一个哈希值,我在 AJAX 调用中收到了该哈希值。 AJAX 响应的内容(包括哈希)正在更新我的 Vue 实例中的 data 组件(以便按照通常的 Vue 用法修改 DOM)。

我想知道是否可以在更改特定 data 元素时触发(运行)一个函数。 Reactivity in Depth 没有提到这一点,对我来说(如果这是错误的,请纠正我)computedmethods 是一种为 DOM 间接提供新计算元素的方法(换句话说,它们不会启动,因为特定的element 已被修改,而是data 和提供给 DOM 的其他变量之间的同步方法)。

我希望得到类似的东西(这是无效的、不正确的伪代码,我只是将其添加到 Vue 实例的上下文中):

var vm = new Vue({
    el: '#root',
    data: {
      hash: null
    },
    functions_to_trigger_upon_an_element_change: {
      hash: function () {
        location.reload()
      }
    }
  })

上面的想法是让location.reload()hash 的值发生变化时运行。

Vue中有这样的机制吗?

如果没有,我将保持状态独立于 Vue,并根据其变化采取相应措施,但最好重用 Vue 监视属性来做到这一点。

【问题讨论】:

标签: javascript vue.js


【解决方案1】:

您可以使用手表,例如以下示例:

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})

关于你的情况,这里是关于如何实施的例子。

var vm = new Vue({
  el: '#demo',
  data: {
    hash: 'Foo' 
  },
  watch: {
    hash: function (val) {
      // when the hash prop changes, this function will be fired.
      location.reload()
    } 
  }
})

希望我正确理解了您的问题。

【讨论】:

  • 在您的示例中更改为firstName 后,我将如何解雇location.reload()
  • 您在示例中的hashwatchdata 下的data 无关(据我所知)。它是一个新变量(在创建后可通过data.hash 获得)并且可能会覆盖您默认设置的data.hash(到'Foo')。并不是说hash 被“监视”并且function 一旦发生变化就会被触发——这正是我正在寻找的功能(但watch 没有提供它)
  • 你是对的,我错了。我刚刚在 JSFiddle 中做了一个测试,它确实像你提到的那样工作。非常感谢你。我会问一个单独的问题来准确理解 getter() 的机制。
【解决方案2】:

我认为这应该可行

var vm = new Vue({
    el: '#root',
    data: {
      hash: null
    },
    watch: {
        hash: function (val) {
          functions_to_trigger_upon_an_element_change()
        }
    },
    methods: {
        functions_to_trigger_upon_an_element_change() {
            // You code
        }
    }
 })

【讨论】:

    【解决方案3】:

    你应该使用这个。在上面的例子中

    var vm = new Vue({
        el: '#root',
        data: {
          hash: null
        },
        watch: {
            hash: function (val) {
              this.functions_to_trigger_upon_an_element_change()
            }
        },
        methods: {
            functions_to_trigger_upon_an_element_change() {
                // You code
            }
        }
     })
    

    【讨论】:

    • 请稍微解释一下;仅代码的答案,即使是正确的,也不能帮助 OP 找出他们做错了什么。
    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多