Объект Vue не обновляется с помощью запроса axios POST

Объект Vue не обновляется с помощью запроса axios POST

12.01.2020 05:07:38 Просмотров 25 Источник
<template>
<div>

<div class="dropdown d-inline-block ml-2">
    <button type="button" class="btn btn-sm btn-dual" id="page-header-notifications-dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-on:click="MarkAllAsRead($event)">
        <i class="si si-bell"></i>
        <span class="badge badge-danger badge-pill" v-if="CountUnread(notifications)">{{ CountUnread(notifications) }}</span>
    </button>
    <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right p-0 border-1 font-size-sm" aria-labelledby="page-header-notifications-dropdown">
        <div class="p-2 bg-primary text-center">
            <h5 class="dropdown-header text-uppercase text-white">Notifications</h5>
        </div>
        <ul class="nav-items mb-0"  style="overflow-y:scroll; height:500px;">
            <!-- notifications should have been updated by axios but they never appear -->
            <li v-for="notification of notifications">
               <div v-if="notification.length">
                    <notification v-bind:notification="notification[0]"></notification>
                </div>
                <div v-else>
                    <notification v-bind:notification="notification"></notification>
                </div>
            </li>
            <div class="p-2 border-top" v-if="hasMore">
                <a class="btn btn-sm btn-light btn-block text-center" href="javascript:void(0)" v-on:click="loadMoreNotifications($event)">
                    <i class="fa fa-fw fa-arrow-down mr-1"></i> Load More..
                </a>
            </div>
        </ul>
    </div>
</div>



</div>

</template>

<script>
    export default {
        props:[
        'user'
        ],
        data: function() {
            return{
                notificationsIndex:0,
                notifications:[],
                hasMore:1
            }
        },
        methods: {
            loadNotifications: function(){
                var data = {
                        index: this.notificationsIndex
                    };
                axios.post('/notifications/getAll',data).then( response => {
                    if(response.data){
                        if(this.notifications.length==0){
                            this.notifications=response.data;
                            console.log(this.notifications);//data fetched here successfully
                        }
                        else{
                            this.notifications.push.apply(this.notifications,response.data);
                        }
                    }
                    else{
                        this.hasMore = 0;
                    }
                });
                console.log(this.notifications);//couldn't find data, just observer object
            },
            loadMoreNotifications: function(event){
                event.preventDefault();
                this.notificationsIndex++;
                this.loadNotifications();
            },
            CountUnread: function(notifications){
                var count=0;
                for(var i=0;i<notifications.length;i++){
                    if(notifications[i].read_at == null){
                        count++;
                    }
                }
                return count;
            },
            HasNotification: function(notification){
                list = this.notifications.filter(item => {
                    return item.id == notification.id;
                });
                return list.length

            }
        },

        created: function(){
            this.loadNotifications();
            window.Echo.private('App.User.' + this.user.id)
                .notification((notification) => {
                    if(this.HasNotification){
                        this.notifications.unshift(notification);
                    }
                });
        }
    }
</script>

И объект уведомлений также ничего не имеет в шаблоне html.

Примечание: этот же код прекрасно работает на всех страницах, где у меня есть этот единственный экземпляр vue. На другой странице (localhost / horizon) (используя пакет laravel horizon и обновляя его макет.лезвие.php ) там, где есть два экземпляра vue, один для уведомлений, а другой для Laravel/Horizon, этот запрос ничего не возвращает.

У вопроса есть решение - Посмотреть?

Ответы - Объект Vue не обновляется с помощью запроса axios POST / Vue Object not updating with axios POST request

Fahd Yousri

12.01.2020 06:07:35

Проблема здесь, как упоминал @cbaconnier, заключается в том, что вы используете асинхронную функцию и не ждете результата.

console.log()связана с тем, что она выполняется до получения запроса post (именно поэтому вы получаете наблюдателя).

То же самое происходит и в createdвами методе.

попробуйте взять весь код, который зависит от полученных уведомлений в систему .then()обратный вызов вызова axios.

https://stackoverflow.com/questions/59704622/vue-object-not-updating-with-axios-post-request/59705118#comment105562989_59705118
Это не проблема здесь, проблема в том, что я не могу обновить свои уведомления в шаблоне html, позвольте мне обновить код и любезно просмотреть его. Спасибо за помощь
Закрыть X