Vuex - 已分配计算属性"name",但它没有setter

Con*_*ech 69 vue.js vue-component vuex vuejs2

我有一个组件与一些表单验证.这是一个多步骤结帐表格.下面的代码是第一步.我想验证用户输入了一些文本,将其名称存储在全局状态,然后发送到下一步.我正在使用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>
Run Code Online (Sandbox Code Playgroud)

我有一个处理订单状态和记录名称的商店.最后,我想将所有信息从多步骤表单发送到服务器.

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

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

    }
  },

  actions: {
    addContactInfoForOrder({commit}, payload) {
      commit('UPDATE_ORDER_CONTACT', payload);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我收到一个错误 Computed property "name" was assigned to but it has no setter.

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

Roy*_*y J 127

如果你要v-model计算,它需要一个setter.无论你想要它做什么更新的值(可能写入它$store,考虑到你的getter从中得到它),你在setter中做.

如果通过表单提交将其写回商店,您不想v-model,您只想设置:value.

如果你想要一个中间状态,它保存在某个地方,但不会覆盖在$store表单提交中的源,你需要创建这样一个数据项.

  • `:value` over`v-model`.谢谢! (24认同)
  • 谢谢......修复我的[vue警告].我有一个导航抽屉,需要(只读)真/假值,但我已经把一个V模型. (2认同)
  • 您能提供如何正确创建 setter 的示例吗? (2认同)
  • 我的帖子中的链接中有一个示例,[另一个答案](/sf/answers/4097739341/) 上还有另一个示例 (2认同)

Var*_*Raj 46

应该是这样的。

在您的组件中

computed: {
        ...mapGetters({
                nameFromStore: 'name'
            }),
        name: {
           get(){
             return this.nameFromStore
           },
           set(newName){
             return newName
           } 
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的商店

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

  • @Jake 对于这个给定的例子,你说的是对的。但是,当您想要操作存储中保存的数据时,您可以在 getter 中执行此操作,但如果直接使用 `this.nameFromStore` 则无法操作数据。 (2认同)

Ibn*_*shd 7

对我来说,它正在改变。

this.name = response.data;
Run Code Online (Sandbox Code Playgroud)

对什么计算返回如此;

this.$store.state.name = response.data;
Run Code Online (Sandbox Code Playgroud)