【问题标题】:How can I add new values to an array object of state using Vuex?如何使用 Vuex 向状态数组对象添加新值?
【发布时间】:2020-04-07 22:51:47
【问题描述】:

我的代码是这样的:

<template>
    ...

    ...
</template>

<script>
export default {
    ...
    methods: {
        ...mapActions([
            'getDataDoctor',
            'getDataSchedule'
        ]),
        async visibilityChanged(isVisible, entry, item) {
            let param = {
                hospitalId: item.hospital_id,
                doctorId: item.doctor_id
            }
            await this.getDataSchedule(param)
            let data = this.dataDoctor
            for (let key in data) {
                this.$set(data[key].find(e => e.doctor_id === item.doctor_id && e.hospital_id === item.hospital_id), 'schedule', this.dataSchedule.schedule)
            }
        }
    },
    computed: { 
        ...mapState({
            dataDoctor: state => state.dataStore.dataDoctor,
            dataSchedule: state => state.dataStore.dataSchedule
        }),
    },
}
</script>

如果我 console.log(this.dataDoctor),结果是这样的:

或者你可以查看 this.dataDoctor 这个:https://pastebin.com/yGjsTBjX

this.dataDoctor 是来自 vuex 存储的状态。我想在那里增加新的价值。名字叫schedule

我喜欢这样。但是存在这样的错误:

无法在未定义、null 或原始值上设置反应属性:未定义

Uncaught (in promise) TypeError: Cannot use 'in' operator to search 'schedule' in undefined

我该如何解决这个问题?

【问题讨论】:

    标签: vue.js multidimensional-array vuejs2 vue-component vuex


    【解决方案1】:

    这点看起来不对:

    for (let key in data) {
        this.$set(data[key].find(e => e.doctor_id === item.doctor_id && e.hospital_id === item.hospital_id), 'schedule', this.dataSchedule.schedule)
    }
    

    从您发布的示例数据中,这只能找到(最多)key 的一个值。对于 key 的其他值,find 将返回 undefined,而 $set 将失败。

    试试这个:

    for (const key in data) {
      const entry = data[key].find(e => e.doctor_id === item.doctor_id && e.hospital_id === item.hospital_id)
    
      console.log(`key is ${key}:`, entry)
    
      if (entry) {
        this.$set(entry, 'schedule', this.dataSchedule.schedule)
      }
    }
    

    当然,也有可能没有条目匹配。我包含的控制台日志记录也应该可以帮助您识别这种情况。

    我应该补充一点,通常认为最好的做法是在商店mutation 内而不是直接在组件内改变商店状态。

    【讨论】:

    • 它有效。但在控制台上存在错误:[Vue warn]: Error in callback for watcher "function () { return this._data.$$state }": "Error: [vuex] do not mutate vuex store state outside mutation handlers."Error: [vuex] do not mutate vuex store state outside mutation handlers.
    • 除此之外,似乎发生了很多异步。当我向下滚动时,控制台上有异步
    • @SuccessMan 我假设您正在为商店使用严格模式?正如我在回答末尾提到的那样,您应该真正将这些更新移动到存储区mutations,而不是直接在组件中更改它们。这应该可以解决您看到的严格模式警告。
    • 我已经这样做了,现在没有错误了。但问题是太多的异步。我有一个搜索表格。当我在输入文本中输入内容时,似乎存在异步。当我在控制台日志中进行更改时出现异步
    • @SuccessMan 这开始感觉像是一个变色龙问题。您提出的原始问题是否已得到解答?如果您有新问题,我建议您单独发布。
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 2020-12-28
    • 2021-01-07
    • 2021-02-12
    • 1970-01-01
    • 2013-09-28
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多