Как получить событие по id из vuex и открыть страницу с подробностями - PullRequest
1 голос
/ 03 апреля 2020

я продолжаю это приложение Чтение данных из базы данных в vuex . Я застрял, когда хочу открыть страницу с информацией о событии. До сих пор я мог это сделать, когда в первый раз, когда я щелкаю по событию, он открывает страницу сведений о событии, в котором произошла ошибка с консолью, но когда я перезагружаю страницу сведений, он не перезагружает данные.

Это мой магазин. js

 state:{
        events:[],
    },

    mutations:{
        setEvent(state,payload){
            state.events = payload
        },

        setEventDetails(state,payload){
          state.events = payload
        },
    },

    actions:{
        addEvent(context,payload){
            firebase.database().ref('eventos/').push(payload)
                .then((event)=>{
                    context.commit('setEvent',event)
                }).catch(err =>{
                console.log(err)
            })
        },

        getEvents({commit}){
            let events = [];

            firebase.database().ref('eventos')
                .on('value',event =>{
                    event.forEach(data =>{
                        events.push({ "id": data.key, ...data.val() })

                    });

                    commit('setEvent',events)
                });
        },

        getEventDetails(context,payload){
            let event = context.getters.eventDetails(payload.id);
            context.commit('setEventDetails',event)
        }

    },
     getters:{

         eventDetails: (state) => (id) => {
             return state.events.find((event) => event.id === id);
         },

         eventList: state => {
             return state.events
         },


     }

Это мои ReadEvents. vue, откуда я нажимаю, чтобы открыть страницу с подробной информацией о событии.

<template>
    <div>
        <div v-for="(event,id) in eventList" :key="id">
            {{event}}
            <button v-on:click="openEventDetails(event.id)">Details</button>
        </div>
    </div>

</template>

<script>

    export default {
        name: "ReadEvents",

        computed:{
            eventList(){
                return  this.$store.getters.eventList;
            }
        },

        mounted() {
            this.$store.dispatch('getEvents')

        },

        methods:{
            openEventDetails(id){

                this.$router.push({
                    name: 'Detalles',
                    params:{id:id}
                })
            }
        }

И это EventDetails. vue, где отображаются детали события.

<template>
    <div>
        {{search}}
    </div>
</template>

<script>


    export default {
        props:['id'],
        name: "EventDetails",

        computed:{
            search() {
                return this.$store.getters.eventDetails(this.id)
            },
        },


        created() {
            console.log(this.search)
        },

        mounted() {
            this.$store.dispatch('getEventDetails')
        },
    }

Вот результат, когда я открываю из ReadEvents. vue enter image description here

И это если после перезагрузки страницы

enter image description here

2 :

1 Ответ

0 голосов
/ 03 апреля 2020

Вы звоните this.$store.dispatch('getEvents') из mounted в ReadEvents. vue.

Но вы не делаете то же самое в EventDetails.vue. Это означает, что при переходе непосредственно к маршруту, использующему EventDetails.vue, хранилище vuex не заполняется событиями.

Одним из решений будет создание действия, которое получает сведения о событии и вызывает его из EventDetails.vue смонтированный метод.

...