Обновить страницу с помощью nuxtjs не обновлять представление

#vue.js #nuxt.js

#vue.js #nuxt.js

Вопрос:

Я создаю одну страницу с этим кодом:

страница: session_id.vue

 <template>
  <div>
    <v-skeleton-loader v-if="isLoading" boilerplate type="article, actions"> </v-skeleton-loader>
    <v-container v-else fluid>
      <v-row>
        <v-col cols="12">
          <v-btn icon color="black" @click="voltar">
            <v-icon>mdi-undo</v-icon>
          </v-btn>
        </v-col>
      </v-row>
      <v-row align="center">
        <v-col cols="12" sm="1">
          <v-avatar tile>
            <v-img :src="'data:image/png;base64,'   sessao.usuario.avatar"></v-img>
          </v-avatar>
        </v-col>
        <v-col cols="12" xl="7" lg="7" md="7" sm="7">
          <span class="ml-2">{{ sessao.usuario.nome }}</span>
        </v-col>
        <v-col sm="4" class="d-flex justify-end">
          <v-btn icon>
            <v-icon>
              {{ iconeFotografo }}
            </v-icon>
          </v-btn>
          <v-btn icon class="ml-2">
            <v-icon>
              mdi-account-search-outline
            </v-icon>
          </v-btn>
          <v-tooltip bottom>
            <template v-slot:activator="{ on, attrs }">
              <v-btn icon color="blue" v-bind="attrs" v-on="on">
                <v-icon>mdi-share</v-icon>
              </v-btn>
            </template>
            <span>{{$t('compartilhar.fotografo')}}</span>
          </v-tooltip>
        </v-col>
      </v-row>
      <v-row align="center">
        <v-col cols="12" sm="1">
          <v-avatar tile>
            <v-icon>
              mdi-beach
            </v-icon>
          </v-avatar>
        </v-col>
        <v-col cols="12" xl="7" lg="7" md="7" sm="7">
          <span class="ml-2">
            {{ sessao.praia.nome }} - {{ sessao.praia.cidade }} / {{ sessao.praia.uf }} -
            {{
              new Date(sessao.inicio).toLocaleDateString('pt-Br', {
                weekday: 'long',
                year: '2-digit',
                month: '2-digit',
                day: '2-digit',
                hour: '2-digit',
                minute: '2-digit',
              })  
                ' ate '  
                new Date(sessao.fim).getHours()  
                ':'  
                new Date(sessao.fim).getMinutes()
            }}
          </span>
        </v-col>
        <v-col sm="4" class="d-flex justify-end">
          <v-btn icon>
            <v-icon>
              {{ iconePraia }}
            </v-icon>
          </v-btn>
          <v-btn icon class="ml-2">
            <v-icon>
              mdi-account-search-outline
            </v-icon>
          </v-btn>
        </v-col>
      </v-row>
      <Fotos :sessao="sessao" />
    </v-container>
  </div>
</template>

<script>
export default {
    data() {
        return {
            sessao: null,
            isLoading: true,
            iconeFotografo: null,
            iconePraia: null
        }
    },
    async fetch() {
        this.fetchFotos();
    },
    methods: {
        fetchFotos(){
          this.isLoading = true;
            this.$api.get(`/sessao/${this.$route.params.id}`).then(response => {
                this.sessao = response.data;
                this.isLoading = false;;
            });
        },
        voltar() {
            this.$router.go(-1);
        }
    }
};
</script>
 

Итак, если я перехожу на страницу (/ session / 1), он показывает v-skeleton-loader, затем выполняется выборка метода, и моя страница обновляется, но если я перезагружаю свою страницу (command F5 или нажимаю кнопку обновить), v-skeleton-loader показывает,выполняется метод выборки (я вижу в моем api), но там есть загрузчик v-skelecton’а, если я добавлю в свой шаблон {{isLoading}}, он сначала покажет true, затем покажет false, но страница не реагирует на это изменение, мне нужно создать резервную копию страницы и снова войти, чтобы перезагрузитьстраница.

почему это происходит? Это правильно в nuxtjs?

tks

Ответ №1:

Вероятно, вам следует просто использовать $fetchState.pending , а не ваше isLoading состояние. Поскольку это дубликат, и fetch() хук просто обрабатывает его сам по себе.

Кроме того, почему вы не записываете всю свою логику в fetch() хук? Сделайте это async/await , и это будет отлично работать ( await в вашем коде нет, вы используете then в месте)!

Вот пример того, как обрабатывать состояние загрузки при извлечении API благодаря перехвату выборки: https://codesandbox.io/s/use-nuxt-fetch-hook-on-api-5ymdz?file=/pages/index.vue