valexeich
@valexeich

При переходе на другой url конент не обновляется. Как решить?

У меня на главной странице делается вывод постов и снизу пагинация, при переходе на другую страницу контент не обновляется хотя ссылка изменилась, только после того как я нажму f5 появляются данные которые относятся к этой странице.

Нажимаю на вторую страницу:
629dfdf268e9c394722711.png

Ссылка изменилась но данные не обновились:
629dfe68e5490843563448.png

Только после того как перезагружу страницу они обновляются:
629dfe91b4cfd984534005.png

Вот код:

App.vue:

<template>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
  <my-header></my-header>
  <slider></slider>
  <router-view></router-view>
  <my-footer></my-footer>
</template>


<script>
import MyHeader from "@/components/Header";
import MyFooter from "@/components/Footer";
import Slider from "@/components/Slider";
export default {
  components: {
    MyFooter,
    MyHeader,
    Slider,
  }
}
</script>


Index.vue:

template>
  <cards :posts="posts"></cards>
  <pagination
      :previous="previous"
      :total="total"
      :current_page="current_page"
      :next="next"
  />
  <br>
</template>

<script>
import Cards from "@/components/Cards";
import Pagination from "@/components/Pagination";
import axios from 'axios'
export default {
components: {
    Cards,
    Pagination
  },
  data() {
    return {
      posts: [],
      total: [],
      next: [],
      previous: [],
      current_page: 0,
    }
  },
  methods: {
    async fetchPosts() {
        let page = this.$route.query.page !== undefined ? `?page=${this.$route.query.page}` : '';
        const response = await axios.get(`http://127.0.0.1:8000/api/post/list/${page}`);
        let next = response.data.next !== null ? response.data.next.split('/')[6] : null;
        let previous = response.data.previous !== null ? response.data.previous.split('/')[6] : null;
        let current_page = this.$route.query.page
        this.posts = response.data.results;
        this.total = Math.ceil(response.data.count / 6);
        this.next = next
        this.previous = previous
        this.current_page = Number(current_page)
    }
  },
  mounted() {
    this.fetchPosts()
  },
}
</script>


Pagination.vue:

<template>
<nav aria-label="Paginate me">
  <ul class="pagination justify-content-center">
    <router-link v-if="previous != null" class="page-link" :to="previous" tabindex="-1">Предыдущая</router-link>
    <li v-else class="page-item disabled">
      <a class="page-link disabled" href="#" tabindex="-1">Предыдущая</a>
    </li>
    <span v-for="i in total">
      <li  v-if="current_page === i || ($route.query.page === '/' && i === 1)" class="page-item active">
        <router-link class="page-link" :to="`?page=${i}`">{{i}}</router-link></li>
      <li v-else class="page-item">
        <router-link class="page-link" :to="`?page=${i}`">{{i}}</router-link></li>
    </span>
    <router-link v-if="next != null" class="page-link" :to="next">Следующая</router-link>
    <li v-else class="page-item disabled">
      <a class="page-link" href="#">Следующая</a>
    </li>
  </ul>
</nav>
<br>
</template>

<script>
export default {
  name: "pagination",
  props: ['previous', 'total', 'current_page', 'next']
}
</script>
  • Вопрос задан
  • 404 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега Vue.js
Вместо

mounted() {
  this.fetchPosts()
},

пусть будет

watch: {
  '$route.query.page': {
    immediate: true,
    handler: 'fetchPosts',
  },
},
Ответ написан
@7rows
Frontend Разработчик / Vue / JS / TS / CSS
У вас fetchPosts запускается только при монтировании компонента, но далее у вас не работает обновление,
Вам надо получить emit об изменении страницы и заново запустить запрос с переданной новой страницей,
Когда вы нажимаете f5, у вас полностью перезапускается приложение и берется номер страницы из роутера
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы