Vuex - 已分配计算属性“名称”,但它没有设置器

问题描述 投票:0回答:6

我有一个带有一些表单验证的组件。这是一个多步骤结账表格。下面的代码是第一步。我想验证用户是否输入了一些文本,将他们的名字存储在全局状态中,然后发送到下一步。我正在使用 vee-validate 和 vuex

<template>
<div>
    <div class='field'>
        <label class='label' for='name'>Name</label>
        <div class="control has-icons-right">

            <input name="name" v-model="name" v-validate="'required|alpha'" :class="{'input': true, 'is-danger': errors.has('name') }" type="text" placeholder="First and Last">
            <span class="icon is-small is-right" v-if="errors.has('name')">
                <i class="fa fa-warning"></i>
            </span>
        </div>
        <p class="help is-danger" v-show="errors.has('name')">{{ errors.first('name') }}</p>

    </div>
    <div class="field pull-right">
        <button class="button is-medium is-primary" type="submit" @click.prevent="nextStep">Next Step</button>
    </div>
</div>
</template>

<script>
export default {
    methods: {
        nextStep(){
            var self = this;

            // from baianat/vee-validate
            this.$validator.validateAll().then((result) => {
                if (result) {
                    this.$store.dispatch('addContactInfoForOrder', self);
                    this.$store.dispatch('goToNextStep');
                    return;
                }
            });
        }
    },
    computed: {
        name: function(){
            return this.$store.state.name;
        }
    }
}
</script>

我有一个商店用于处理订单状态并记录名称。最终我想将所有信息从多步骤表单发送到服务器。

export default {
  state: {
    name: '',
  },

  mutations: {
    UPDATE_ORDER_CONTACT(state, payload){
      state.name = payload.name;

    }
  },

  actions: {
    addContactInfoForOrder({commit}, payload) {
      commit('UPDATE_ORDER_CONTACT', payload);
    }
  }
}

当我运行此代码时,出现错误

Computed property "name" was assigned to but it has no setter.

如何将名称字段中的值绑定到全局状态?我希望这是持久的,这样即使用户后退一步(单击“下一步”后),他们也会看到他们在此步骤中输入的名称

vue.js vuejs2 vue-component vuex computed-properties
6个回答
264
投票

如果你要

v-model
计算,它需要一个setter。无论您希望它对更新后的值做什么(可能将其写入
$store
,考虑到您的 getter 从中提取它),您都可以在 setter 中执行。

如果通过表单提交将其写回商店,您不需要

v-model

,您只想设置 
:value

如果您想要有一个中间状态,将其保存在某处但在提交表单之前不会覆盖

$store

中的源,您将需要创建这样的数据项。


67
投票
应该是这样的。

在您的

组件

computed: { ...mapGetters({ nameFromStore: 'name' }), name: { get(){ return this.nameFromStore }, set(newName){ return newName } } }

在您的

商店

export const store = new Vuex.Store({ state:{ name : "Stackoverflow" }, getters: { name: (state) => { return state.name; } } }
    

9
投票
对我来说,情况正在改变。

this.name = response.data;

计算得出的回报如此;

this.$store.state.name = response.data;
    

2
投票
我在从

store

、在
computed
、通过
...mapState(['sampleVariable'])
获取价值时遇到了这样的错误,就像你一样。然后我在
this.sampleVariable
中使用了
<script>
,在
sampleVariable
中使用了
<template>

解决问题的方法是将

return

 中的 
data()
 分配给一个单独的变量,然后在 
component
 中重用新创建的变量,如下所示:

data() { return { newVariable: this.$store.state.sampleVariable, } }
然后,我将组件中的引用从 

sampleVariable

 更改为 
newVariable
,错误就消失了。


0
投票
我面临着完全相同的错误

已分配计算属性“callRingtatus”,但它没有设置器

这是根据我的场景的示例代码

computed: { callRingtatus(){ return this.$store.getters['chat/callState']===2 } }
我将上面的代码改成下面的方式

computed: { callRingtatus(){ return this.$store.state.chat.callState===2 } }

从 vuex 存储状态获取值,而不是计算钩子内的 getter


0
投票
这是因为当你尝试为其属性设置新值时,你的计算属性尚未使用 setter 方法

© www.soinside.com 2019 - 2024. All rights reserved.