【问题标题】:Cannot read property 'getters' of undefined" vue.js无法读取未定义的“vue.js”的属性“getters”
【发布时间】:2020-07-13 22:13:53
【问题描述】:

有一个Form component.vue,它从getter中获取事件对象并在v-model中替换它:

<template>
    <form @submit.prevent="submitForm">
        <div class="form-group row">
            <div class="col-10 d-flex">
                <input type="" class="title form-control" v-model="getEvent.title" placeholder="Название">
                <input type="" class="content form-control" v-model="getEvent.content" placeholder="Содержание">
                <input type="" class="event_date form-control" v-model="getEvent.event_date" placeholder="Дата">
                <input type="" class="email form-control" v-model="getEvent.email" placeholder="Email">
            </div>
            <div class="d-flex flex-column">
                <button class="btn btn-success mt-auto" >Создать</button>
            </div>
        </div>
    </form>
</template>

<script>
import { mapGetters, mapActions } from "vuex"

export default {
    computed: mapGetters(['getEvent']),
    methods: mapActions(['submitForm'])
}

但是,vue 返回一个错误,指出 getter 未定义。存储/index.js:

import Vue from 'vue';
import Vuex from 'vuex';


Vue.use(Vuex);

Date.prototype.getWeek = function () {
    var onejan = new Date(this.getFullYear(), 0, 1);
    var today = new Date(this.getFullYear(), this.getMonth(), this.getDate());
    var dayOfYear = ((today - onejan + 86400000) / 86400000);
    return Math.ceil(dayOfYear / 7)
}

export const store = new Vuex.Store({
    actions: {
        async getEvents(context) {
            var response = await fetch('http://127.0.0.1:8000/rest/');
            var data = await response.json()
            context('getEvents', data)
        },
        async createEvent(context) {
            await this.getEvents();
            await fetch('http://127.0.0.1:8000/rest/', {
                method: 'post',
                headers: {
                    'content-type': 'application/json'
                },
                body: JSON.stringify({ event: context.state.event })
            });
            await this.getEvents();
            context.commit('createEvent', context.state.event)
        },
        async editEvent(context) {
            await this.getEvents();
            await fetch(`http://127.0.0.1:8000/rest/${context.state.event.id}/`, {
                method: 'put',
                headers: {
                    'content-type': 'application/json'
                },
                body: JSON.stringify({ event: context.state.event })
            });
            await this.getEvents();
            context.state.event = {};
        },
        async deleteEvent(context) {
            await this.getEvents();
            await fetch(`http://127.0.0.1:8000/rest/${context.state.event.id}/`, {
                method: 'delete',
                headers: {
                    'content-type': 'application/json'
                },
                body: JSON.stringify({ event: context.state.event })
            });
            await this.getEvents();
        },


        submitForm(context) {
            if (context.state.event.id === undefined) {
                this.createEvent();
            } else {
                this.editEvent();
            }
        },


        isMonthEqualNow(object) {
            var event_date = new Date(object.event_date)
            var date_now = new Date()
            return event_date.getMonth() === date_now.getMonth()
        },
        isWeekEqualNow(object) {
            var event_date = new Date(object.event_date)
            var date_now = new Date()
            return event_date.getWeek() === date_now.getWeek()
        },
        isDayEqualNow(object) {
            var event_date = new Date(object.event_date)
            var date_now = new Date()
            return event_date.getDate() === date_now.getDate()
        },
        eventsByFilters(context) {
            var events = context.state.events
            if (context.state.search === '' && context.state.selected) {
                switch (context.state.selected) {
                    case 'month':
                        return events.filter(item => this.isMonthEqualNow(item))
                    case 'week':
                        return events.filter(item => this.isMonthEqualNow(item) && this.isWeekEqualNow(item))
                    case 'day':
                        return events.filter(item => this.isMonthEqualNow(item) && this.isWeekEqualNow(item)
                            && this.isDayEqualNow(item))
                    default:
                        return events
                }
            } else {
                events.filter(item => item.title.indexOf(context.state.search) !== -1)
            }
        }

    },
    mutations: {
        setEvents(state,events){
            state.events = events
        },
        createEvent(state, event){
            state.events.push(event)
        }
    },
    state: {
        events: [],
        event: {},
        selected: '',
        search: ''
    },
    getters: {
        eventsByFilters(state) {
            return state.events
        },
        getSearch(state){
            return state.search
        },
        getSelected(state){
            return state.selected
        },
        getEvent(state) {
            return state.event
        }
    },
});

我也有警告(./src/main.js 中的警告

“在'./store'中找不到导出'default'(导入为'store'))

main.js

import Vue from 'vue'
import App from './App.vue'
import  store  from './store';

Vue.config.productionTip = false


new Vue({
  render: h => h(App),
  store
}).$mount('#app')

而且组件本身不输出

【问题讨论】:

  • 将发送/提交数据的代码添加到事件列表中。
  • 你可以试试这个吗? getters: { getEvent: (state) => { return state.event } }
  • 您需要提供更多信息。你能展示你的 main.js 吗?
  • @Nanfish,例如添加 getEvents 操作
  • @KickButtowski,这与我的代码原则上不同

标签: vue.js


【解决方案1】:

我看到的唯一问题是 您的商店没有导出任何默认值

export const store = new Vuex.Store(...

然而,你的 main.js 用于导入默认值

import store from 'src/store'

所以使用以下方法,希望您的问题得到解决

import { store } from './store';

请检查这些链接

  1. export-const-vs-export-default-in-es6

  2. named-export-vs-default-export-in-es6

一点建议

在以下几行中,我认为您不需要对 this.getEvents() 使用 await,因为它已经在其操作中使用了 await。

例如,

    await this.getEvents();
    await fetch('http://127.0.0.1:8000/rest/', {

【讨论】:

    【解决方案2】:
    1. action 用于将 commit 数据转换为 mutation 并且在突变中您必须将数据设置为状态。
    2. 您不应该在action 中获取数据,而是从组件、mounted() 或其他地方调用它。

    一个例子:

    export default {
        mounted() {
            var response = await fetch('http://127.0.0.1:8000/rest/');
            var data = await response.json()
            this.$store.dispatch("eventsList", data);
        }
    }
    

    在 store.js 中:

     actions: {
        eventsList({commit}, data) {
            commit('eventsList', data)
        }
     },
     mutations: {
        eventsList(state, data) {
            state.events= data
        },
     }
    

    dispatch 调用action -> commit 调用mutation => 在突变中将数据直接设置为状态。

    【讨论】:

    • 调用catalogId的最后一个函数(eventList)是什么意思
    • 你写了一个函数“mounted”来获取来自rest的响应。我如何调用(获取名称)函数来发布、更新和删除(也安装或如何)
    • 抱歉,我修改了答案(catalogId 来自我的代码)
    • mounted() 是 vue 组件的生命周期钩子,你可以在那里调用任何你想要的休息请求,此外你可以从任何你想要的方法中获取数据,但不是在行动中。这个想法是 store 用于保存数据,而不是用于所有其他逻辑。
    • 换句话说,你不需要在mounted中创建函数(分别用于get、post...)并将它们全部写在一个堆中?
    猜你喜欢
    • 2022-11-24
    • 2019-06-28
    • 2020-01-24
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2021-02-07
    相关资源
    最近更新 更多