【问题标题】:Form handeling with an array of object Vuex使用 Vuex 对象数组处理表单
【发布时间】:2021-06-28 14:52:39
【问题描述】:

我必须更新一个包含对象数组的 vuex 存储,例如:

我的用户有一个组合框可供选择,当它选择一个组合框时,它会更新数据库中该对象的属性

但每次我在自动完成(此处的组合框)中选择一个项目时,我都会收到 [vuex] do not mutate vuex store state outside mutation handlers. 错误。所以我想知道 vuex 是否允许它,或者我是否必须改变我这样做的方式。

我正在使用 Nuxt,API 使用 express 和 mongodb 数据库

我的 vuex :

状态:

export default () => ({
  kivaferkoi: {
    picked: [],
    notYetPicked: []
  }
})

变异:

export default {
  fillKivaferkoi (state, data) {
    state.kivaferkoi = data
  },

  editPicked (state, data) {
    state.kivaferkoi.picked = data
  }
}

行动:

import axios from 'axios'

export default {
  fetch (context, token) {
    return new Promise((resolve, reject) => {
      axios.get(process.env.api_url + '/kivaferkoi', {
        headers: {
          authorization: token
        }
      })
        .then((response) => {
          context.commit('fillKivaferkoi', response.data)
          resolve(response)
        }).catch((e) => {
        // eslint-disable-next-line no-console
          console.error(e)
          reject(e)
        })
    })
  },

  update (context, data) {
    const token = data.token
    delete data.token

    return new Promise((resolve, reject) => {
      axios.put(process.env.api_url + '/kivaferkoi/', data.value, {
        headers: {
          authorization: token
        }
      })
        .then((response) => {
          context.commit('editPicked', response.data)
          resolve(response)
        }).catch((e) => {
        // eslint-disable-next-line no-console
          console.error(e)
          reject(e)
        })
    })
  }
}

还有我的 vue 组件:

<template>
  <v-container>
    <v-row class="d-flex justify-center ">
      <v-col cols="3">
        <v-card
          color="secondary"
          rounded="lg"
          flat
        >
          <v-card-title>
            Picked one
          </v-card-title>
          <v-card-text>
            <v-list color="secondary">
              <template v-for="(item, i) in picked">
                <v-list-item :key="i">
                  <v-list-item-avatar>
                    <v-img class="avatar" :src="item.avatar ? item.avatar : avatar" />
                  </v-list-item-avatar>
                  <v-list-item-content>
                    <v-list-item-title>
                      {{ item.name }}
                    </v-list-item-title>
                    <v-list-item-subtitle>
                      {{ item.surname }}
                    </v-list-item-subtitle>
                  </v-list-item-content>
                </v-list-item>
                <v-autocomplete
                  :key="'combobox' + i"
                  v-model="item.pickedSummary"
                  :items="prositSummary"
                  flat
                  solo
                  background-color="background"
                />
              </template>
            </v-list>
          </v-card-text>
        </v-card>
      </v-col>
    </v-row>
  </v-container>
</template>

<script>
export default {
  name: 'Kivaferoi',
  computed: {
    picked: {
      get () {
        return this.$store.state.kivaferkoi.kivaferkoi.picked
      },

      set (value) {
        this.$store.dispatch('kivaferkoi/update', { token: this.$auth.getToken('local', value) })
      }
    }
  }
}
</script>

【问题讨论】:

    标签: javascript vue.js vuex


    【解决方案1】:

    尝试用副本替换分配中的数据(例如,传播,如下所示)。对象(以及数组)在 JS 中被分配为链接,因此当您在任何地方更改选取的数组时,您也会在存储中对其进行变异。

    fillKivaferkoi (state, data) {
        state.kivaferkoi = {...data}
      },
    
      editPicked (state, data) {
        state.kivaferkoi.picked = [...data]
      }
    

    【讨论】:

    • 我没有到达 Set() 部分,所以我无法测试你的解决方案伙伴
    • “item”是“picked”数组的一部分,它与store中的picked数组链接。 v-autocomplete 的模型是 item.pickedSummary(我在商店中看不到任何“pickedSummary”,您可能想在那里创建它吗?它还存储突变)/您在组件中所做的任何更改都将被存储。为避免这种情况,只需尝试将存储中的对象分配为副本,而不是如上图所示的链接
    • 不幸的是它不起作用,我开始认为我可能会改变我做这件事的方式,因为我找不到任何好的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2017-10-21
    • 2019-05-30
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多