当在vue项目中请求后台接口时,常常会使用 loding 过渡数据的加载时间。
如果 loading 作为一个全局的加载状态,应该写在项目中的App.vue中

<template>
    <div id="app">
        <router-view></router-view>
        <loading v-if='LOADING'/> //自己封装的loading 组件
    </div>
</template>

<script>
    export default {
        name: 'App'
    }
</script>

这个Loading 组件通过 LOADING 的状态显示隐藏。我们希望在请求某个接口的时候,将 LOADING 改为true,当接口请求后改为false,这样就能实现loading的过渡效果了。

但是这里有一个问题,loading组件的显示和隐藏是通过 LOADING 来控制的, 如果将 LOADING 直接定义在 App.vue 中,每次请求中直接修改 LOADING 是很麻烦的,所以推荐使用 vuex

第一步:按照官网的例子,在App.vue的同层目录下新建一个 store.js 文件.
// store.js
const store = new Vuex.Store({
    state: {
        LOADING: false
    },
    mutations: {
        showLoading(state){
            state.LOADING = true    
        },
        hideLoading (state) {
            state.LOADING = false
        }
    }
})
第二步: 在 main.js 中引入 store.js,并挂载到 Vue 实列上
import store from './store'

new Vue({
    el: '#app',
    store,
    template: '<App/>',
    components: { App }
})
第三步,在请求中改变 LOADING 的状态

Vue 项目中 API 的请求方法有很多,如果项目比较简单,数据量比较小,可以在在页面中直接使用像 axiosajaxrequest等的 post/get 请求。以 axios 为例:

methods:{
    //通常请求都希望以异步的方式,方便数据操作
    async test(){
        this.$store.commit('showLoading')
        //这里需要将 axios 提前挂载到 Vue的属性上。
        await this.$axios.get('xxx/xxxx/xxx')
        this.$store.commit('hideLoading')
    }
}
第四步: 监听 LOADING 状态

Vuex 中 state 是动态更新的,也就是不管在任何地方对某一个 state的值做了修改,那么依赖该数据的 DOM 也将会发生改变。修改 App.vue 文件,监听 LOADING 的值的变化。

<template>
    <div id="app">
        <router-view></router-view>
        <loading v-if='LOADING'/> //自己封装的loading 组件
    </div>
</template>

<script>
    import {mapState} from 'vuex'

    export default {
        computed:{
            ...mapState([
                'LOADING'
            ])
        },
        name: 'App'
    }
</script>

总结:
loading的过渡效果最根本的就是通过 state 来控制 loading 组件的显示和隐藏。在请求接口前使该状态为 为 true,接口完成后改为 false

简单的 loading 组件。

一个简单的 loading 组件,应该会有一个遮罩层,一个过度动画,或者一个loading 说明。

<template>
    <section>
        <div class='mock'>
            <div class='main'>
                loading...
            </div>
        </div>
    </section>
</template>    
<style>
    section{
        width:100vh;
        height:100vh;
        position:relative;
    }
    .mock{
        tion{
        width:100vh;
        height:100vh;
        position:absolute;
         z-index:100;
        background-color:#abb2bf;
    }
    .main{
       margin:200px auto;
       text-align:center:
    }
</style>
Logo

前往低代码交流专区

更多推荐