Недавно добавленный пост принимает количество лайков и комментариев предыдущего поста в проекте vue.js / laravel

Сейчас я изучаю vue.js. Тем не менее, мне сложно отладить ошибку в проекте, над которым я работаю в данный момент, - в приложении, похожем на блог, с Laravel в качестве серверной части. В моем домашнем файле blade.file у меня есть корневой компонент под названием <timeline>, где у меня есть текстовое поле для добавления сообщения, а затем компонент под названием <posts>. Внутри <posts> у меня есть компонент <post>, в котором отображаются детали отдельных сообщений. У меня также есть компонент <feedback> для подсчета лайков и комментариев, и все они отлично работали. Однако моя проблема заключается в том, что каждый раз, когда я добавляю новый пост, новый пост вместо количества лайков и количества комментариев, равных 0, наследует обратную связь. из предыдущего поста. (Допустим, у предыдущего поста было 10 лайков и 5 комментариев, как только я вхожу в новый пост, он сразу показывает 10 лайков и количество комментариев 5 вместо 0 с момента его нового поста, и пока их нет). В свою очередь, предыдущий пост принимает отзывы предыдущего и так далее. Как мне исправить эту ошибку? Мои компоненты показаны ниже:

//Timeline component
<template>
    <div class = "timeline">
        <div class = "form-group">
            <textarea name = "body" class = "form-control" v-model = "postText" rows = "4" placeholder = "What's on your mind"></textarea>
        </div>
        <div class = "form-group">
            <button type = "button" class = "btn btn-primary" @click.prevent = "sendPost">Post</button>
        </div>
        <hr>
        <posts :posts = "posts"></posts>
    </div>
</template>

<script>
    export default {
        data(){
            return {
                postText: '',
                posts: []
            }
        },
        methods: {
            loadPost(){
                axios.get('/post').then(response => {
                    console.info(response.data);
                    this.posts = response.data;
                })
            },
            sendPost(){
                if (!this.postText || this.postText.trim() === ''){
                return;
             }

             //send to db
             axios.post('/post', {
                body: this.postText.trim()
             }).then(response=> {
                console.info(response);
                this.loadPost();
             });
             this.postText = '';
            }
        },
        mounted(){
            this.loadPost();
        }
    }
</script>

//posts component
<template>
    <div class = "posts">
        <div v-for = "post in posts">
            <post :post = "post"></post>
        </div>
    </div>
</template>

<script>
    export default {
        props: ['posts']
    }
</script>

Вот мой пост-компонент

<template>
    <div class = "post">
        <div class = "media">
            <a class = "pull-left" href = "#">
                <img :src = "'/images/profile_pix/avatar.png'" class = "media-object center-block" alt = "#"/>
            </a>
            <div class = "media-body">
                <h5><strong> {{ post.user.username }}</strong></h5>
                <small>{{ post.created_at }}</small>
                  <p>{{ post.body }} </p>
                <feedback :post = "post"></feedback>
            </div>
        </div><hr>
      </div>
</template>

<script>
    export default {
        props: ['post']
    }
</script>

и вот мой компонент обратной связи

<template>
    <div class = "feedback">
        <span v-if = "liked"><a href = "#" @click.prevent = "unLikeApost"><i class = "fa fa-thumbs-down"></i>Unlike</a></span>
        <span v-else = "liked"><a href = "#" @click.prevent = "likeApost"><i class = "fa fa-thumbs-up"></i>Like</a></span>
        <span><small> {{likes}} </small></span>                        
        <span>
          <a href = "#"><i class = "fa fa-comment"></i></a>&nbsp <small> {{ comments }} </small>
        </span>
        <span v-if = "author">
          <a href = "#" v-if = "author" class = "pull-right"><small>Delete</small></a>
        </span> 
    </div>
</template>

<script>
    export default {
      props: ['post'],
      data(){
        return {
          author: false,
          likes: '',
          liked: false,
          comments: ''
        } 
      },
      methods: {
        getLikes(){
          axios.get('/likes/'+this.post.id+'/getlikes').then((response) => {
            if (response.data === 0){
              this.likes = 0;
            }
            this.likes = response.data;
          })
        },
        checkIfLiked(){
          axios.get('/likes/'+ this.post.id +'/checkliked').then((response) => {
            if (response.data === 1){
              this.liked = true;
            }
          })
        },
        likeApost(){
            axios.post('/likes/'+ this.post.id +'/likeapost').then((response) => {
              console.info(response.data);
              this.likes += 1;
              this.liked = true;
            })
        },
        unLikeApost(){
            axios.post('/likes/'+ this.post.id +'/unlikeapost').then((response) => {
              console.info(response.data);
              this.likes -= 1;
              this.liked = false;
            })
        },
        countComments(){
          axios.get('/post/'+ this.post.id +'/countcomments').then((response) => {
            this.comments = response.data;
          })
        }
      },
      mounted() {
        // determine author
        axios.get('/post/' +this.post.id+'/getposter').then((response) => {
          let auth_user = window.Laravel.user.id;
          let author = response.data;
          if (auth_user === author){
            this.author = true;
          }
        });

        this.getLikes();

        this.checkIfLiked();

        this.countComments();
      }
    }
</script>

Поскольку вы передаете сообщение в feedback как опору, возможно, что api возвращает неправильный пост. Это очень похоже на проблему с подсчетом массивов. Есть ли что-то в коде серверной части, возвращающее неверное сообщение, или вы уверены, что правильные данные поступают в интерфейсную часть?

tom_h 24.03.2018 13:40

Спасибо @tom_h. Мне кажется, что из бэкэнда были возвращены правильные сообщения. Когда я добавляю новый пост, он сохраняется в базе данных, и сообщения извлекаются из базы данных и отображаются. Однако ожидается, что у нового поста будет ноль лайков и комментариев, здесь их нет. Вместо этого под новым постом отображается количество лайков и комментариев к предыдущему посту. Однако, когда я обновляю страницу, она показывает ноль лайков и комментариев, как и должно.

Flexi 24.03.2018 15:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
205
1

Ответы 1

Мне немного странно, что вы отправляете GET / post после отправки нового сообщения вместо GET / post /: id. Или просто добавьте созданный ответ в существующий массив.

/ edit Не обращайте внимания на вышесказанное, я вижу, вы просто повторно запускаете метод, который получает все сообщения. Единственное сообщение там сбивает с толку, может быть, это должно быть / posts :)

Проблема может быть связана с ключ на v-for, попробуйте использовать там id ваших сообщений.

Спасибо @Justin. Я просто заменил: post = "post" в моем компоненте на: key = post.id, но поведение осталось прежним. Обратите внимание, что как только я обновляю страницу, правильные счетчики выбираются и отображаются как 0. Эта ошибка появляется сразу же, когда я отправляю запись, и она отображается. Что я делаю не так?

Flexi 24.03.2018 15:20

Другие вопросы по теме