【问题标题】:vue computed cannot get the the attributes in the objectvue 计算无法获取对象中的属性
【发布时间】:2018-03-14 07:37:17
【问题描述】:

帐号defind of vuex

// inside mutations
mutations: {
  updateMessage (state, message) {
    state.obj.message = message
  }
}
// html
<input v-model="message">
// ...
computed: {
  message: {
    get () {
      return this.$store.state.obj.message
    },
    set (value) {
      this.$store.commit('updateMessage', value)
    }
  }
}

我编码这个

<input type="text" v-model="data.reference">
data () {
    return {
      data:{
          ...
          reference: '',
      }
    }
  },
computed: {
    'data.reference':{
        get () {
            return this.$store.state.currentKbdata.reference
        },
        set (value) {
            console.log(222)
            this.$store.commit('updateReference', value)
        }
    }
  }

当我输入输入时,222 不显示

.................................................. …………

【问题讨论】:

  • 对不起。目前尚不清楚您在做什么。为什么'data.reference': 周围有单引号?
  • 因为当我初始化数据时,它是表单的数组。而输入是数据之一
  • 我相当肯定'data.reference' 只会被识别为字符串。您在浏览器控制台中没有错误吗?除此之外,您还定义了两次属性。也就是说,在 data() 对象和计算属性中。
  • 但是data.reference 工作在手表上。
  • 好的。但我敢打赌,您在控制台中仍然有您尚未在此处发布的错误消息。

标签: vue.js vuex


【解决方案1】:

你不能像观察者那样用点符号定义计算的 getter。这是一个不起作用的fiddle,您可以在控制台中看到错误:

无法读取未定义的属性“引用”。

此外,您似乎正在尝试将已存在的计算属性定义为data 方法中定义的属性。在这个fiddle 中,您可以看到这也行不通。 data 方法中定义的值优先于计算的属性定义。


无论如何,从您的示例中,我根本不明白为什么需要在嵌套对象属性上创建计算属性。

只需对计算属性使用普通定义:

const store = new Vuex.Store({
  state: {
    reference: '',
  },
  mutations: {
    updateReference(state, reference) {
      state.reference = reference;
    }
  }
});

new Vue({
  el: '#app',
  store,
  computed: {
    reference: {
      get() {
        return this.$store.state.reference;
      },
      set(val) {
      	this.$store.commit('updateReference', val);
      }
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.15/vue.min.js"></script>

<div id="app">
  <input type="text" v-model="reference">
  {{ $store.state.reference }}
</div>

如果您确实需要设置data.reference 的值,那么您可以通过多种方式实现这一目标。一种是将其也转换为计算属性:

const store = new Vuex.Store({
  state: {
    reference: '',
  },
  mutations: {
    updateReference(state, reference) {
      state.reference = reference;
    }
  }
});

new Vue({
  el: '#app',
  store,
  computed: {
    reference: {
      get() {
        return this.$store.state.reference;
      },
      set(val) {
      	this.$store.commit('updateReference', val);
      }
    },
    data() {
      return { reference: this.reference };
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.15/vue.min.js"></script>

<div id="app">
  <input type="text" v-model="reference">
  <div>data.reference: {{ data.reference }}</div>
  <div>$store.state.reference: {{ $store.state.reference }}</div>
</div>

【讨论】:

  • https://jsfiddle.net/q0oahL3q/74/我添加数据,控制台没有退出...
  • 您没有遵循我的任何建议...您在data 方法中仍然有一个data 属性,因此它优先于data.reference 计算,正如我解释的那样,无论如何都行不通。删除data 属性,您将看到错误。
猜你喜欢
  • 2019-08-12
  • 1970-01-01
  • 2021-07-05
  • 2019-12-05
  • 2018-01-22
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多