【问题标题】:VueJS make instance property reactiveVueJS 使实例属性具有反应性
【发布时间】:2018-07-20 03:06:41
【问题描述】:

我正在使用 instance properties 构建一个 VueJS 插件,我需要将一些反应值带回 VueJS。

我的搜索:

我不明白Object.defineProperty()背后的东西,我搜索了vuex getters initialisation,因为我的逻辑相似,但我不明白如何正确操作。

简单示例:

在附加到他的原型的 VueJS sn-p 下方,main.js

Vue.prototype.$ajax = {
  loading: false,
  isLoading () {
    return this.loading
  }
}

现在,从组件component.vue 访问它:

export default {
    computed: {
      loading () {
        return this.$ajax.isLoading()
      }
    },
    created () {
      let self = this

      setInterval(() => {
        console.log(this.loading, this.$ajax.isLoading())
      }, 100)

      setTimeout(() => {
        this.$ajax.loading = true
      }, 1000)
    }
  }
}

示例结果:

setTimeout 之前我们有false false(这是预期的输出),但在setTimeout 之后我们有false true(getter 没有收到修改,但直接访问者有值)。

有什么想法可以将一些反应性的东西带入我的$ajax.isLoading() 吗?

【问题讨论】:

    标签: javascript vue.js vuex vue-reactivity


    【解决方案1】:

    好的,通过挖掘vuex 代码,我找到了一个解决方案:在插件中使用 Vue 实例,将数据放入其中,以便将反应性带到外部。

    来自问题:

    Vue.prototype.$ajax = {
      _vm: new Vue({data: {
        loading: false
      }}),
      setLoading (loading) {
        this._vm.$data.loading = loading
      },
      isLoading () {
        return this._vm.$data.loading
      }
    }
    

    我刚刚通过这个 setter 在我的组件上更改了直接访问器:

    this.$ajax.setLoading(true)
    

    【讨论】:

    • 谢谢,我也在寻找这个确切的解决方案,虽然它看起来很丑......
    • 不,这是有道理的。如果我们的数据在 VueJs 之外,我们需要一个“反应式数据持有者”。而且 VueJs 的实例化非常轻量,因此我们可以为这种用法创建任意数量的 VueJs 实例。
    • 不错,尽管Vue.observable 是一种更简洁的方式
    猜你喜欢
    • 2019-06-22
    • 2019-04-10
    • 2019-07-21
    • 2020-01-31
    • 2019-12-24
    • 2020-11-21
    • 1970-01-01
    • 2021-06-05
    • 2021-06-04
    相关资源
    最近更新 更多