показывать экран загрузки пользователю при отложенной загрузке vue

#javascript #vue.js #lazy-loading

#javascript #vue.js #отложенная загрузка

Вопрос:

я создаю функции отложенной загрузки для своего spa vue js, используя laravel mix 5

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

я попытался добавить это

 <template>
<div>
    <!-- header -->
    <transition 
        enter-active-class="animated fadeInDown"
        leave-active-class="animated fadeOutUp"
        mode="out-in"
    >
        <router-view name="header"></router-view>
    </transition>
    
    <!-- body -->
    <transition 
        enter-active-class="animated fadeIn"
        leave-active-class="animated fadeOut"
        mode="out-in"
    >
        <router-view></router-view>
    </transition>
    
</div>
</template>
  

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

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

Ответ №1:

хорошо, выполнив еще несколько углубленных поисков, я, наконец, нашел решение

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

 router.beforeEach((to, from, next)=>{
  store.commit('setLoading', true)
  next()
})
router.afterEach((to, from)=>{
  store.commit('setLoading', false)
})
  

а затем в мои app.vue файлы я просто добавляю это

 <template>
<div>
    <!-- header -->
    <transition 
        enter-active-class="animated fadeInDown"
        leave-active-class="animated fadeOutUp"
        mode="out-in"
    >
        <router-view name="header"></router-view>
    </transition>
    
    <!-- body -->
    <transition 
        enter-active-class="animated fadeIn"
        leave-active-class=""
        mode="out-in"
    >
        <loading-page v-if="isLoading"></loading-page>
        <router-view v-else></router-view>
    </transition>
    
</div>
</template>

<script>
    import { mapGetters } from 'vuex';
    import loadingPage from "./views/loading.vue";

    export default {
        components: {
            loadingPage
        },
        computed:{
            ...mapGetters('global',{
                isLoading: 'isLoading'
            }),
        },
    }
</script>
  

и вот мой экран загрузки, просто простая страница с панелью загрузки

 <template>
    <div>
        <!-- page container -->
        <div class="page-content">
            <div class="content-wrapper">
                <div class="content">

                    <div class="card card-body">
                        <div class="progress">
                            <div class="progress-bar progress-bar-info progress-bar-striped progress-bar-animated" style="width: 100%">
                                <span class="sr-only">100% Complete</span>
                            </div>
                        </div>
                    </div>

                </div>
            </div>
        </div>
        
    </div>
</template>
  

и для моего vuex

 
export const global = {
  namespaced: true,
  
  // state
  state: {
    isLoading: '',
  },

  // getters
  getters: {
    isLoading: state => state.isLoading,
  },

  // actions
  actions: {

    // change data
    setLoading({commit}, type){
      commit('setLoading', type);
    },
  },

  // mutations
  mutations: {

    setLoading ( state, type ){
      state.isLoading = type;
    },
  }
}
  

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