当前位置:首页 > VUE

vue 怎么实现loading

2026-03-30 10:54:09VUE

实现全局 Loading 的方法

在 Vue 中可以通过封装一个全局组件配合 Vuex 或 Pinia 状态管理实现。创建一个 Loading.vue 组件,通过 v-if 控制显示隐藏:

<template>
  <div v-if="isLoading" class="loading-overlay">
    <div class="spinner"></div>
  </div>
</template>

<script>
export default {
  computed: {
    isLoading() {
      return this.$store.state.isLoading
    }
  }
}
</script>

在 Vuex 中定义状态并提交 mutation 控制:

const store = new Vuex.Store({
  state: {
    isLoading: false
  },
  mutations: {
    setLoading(state, status) {
      state.isLoading = status
    }
  }
})

指令式 Loading 的实现

通过 Vue 指令可以在任意元素上触发 Loading 状态。注册一个 v-loading 指令:

Vue.directive('loading', {
  bind(el, binding) {
    const loadingDiv = document.createElement('div')
    loadingDiv.className = 'loading-mask'
    el.loadingElement = loadingDiv

    if (binding.value) {
      el.appendChild(loadingDiv)
    }
  },
  update(el, binding) {
    if (binding.value !== binding.oldValue) {
      if (binding.value) {
        el.appendChild(el.loadingElement)
      } else {
        el.removeChild(el.loadingElement)
      }
    }
  }
})

请求拦截器集成

在 axios 拦截器中自动管理 Loading 状态:

axios.interceptors.request.use(config => {
  store.commit('setLoading', true)
  return config
})

axios.interceptors.response.use(
  response => {
    store.commit('setLoading', false)
    return response
  },
  error => {
    store.commit('setLoading', false)
    return Promise.reject(error)
  }
)

组件级 Loading 控制

在单个组件内部管理 Loading 状态:

<template>
  <button @click="fetchData" :disabled="isLoading">
    {{ isLoading ? 'Loading...' : 'Submit' }}
  </button>
</template>

<script>
export default {
  data() {
    return {
      isLoading: false
    }
  },
  methods: {
    async fetchData() {
      this.isLoading = true
      try {
        await axios.get('/api/data')
      } finally {
        this.isLoading = false
      }
    }
  }
}
</script>

第三方库的使用

常用 Loading 库如 element-ui 提供现成方案:

import { Loading } from 'element-ui'

let loadingInstance = Loading.service({
  fullscreen: true,
  text: '加载中'
})

// 关闭加载
loadingInstance.close()

对于 Vue 3 项目,可以使用 vue-loading-overlay

import Loading from 'vue-loading-overlay'
import 'vue-loading-overlay/dist/vue-loading.css'

app.component('Loading', Loading)

动画效果优化

为 Loading 添加 CSS 动画提升用户体验:

.loading-spinner {
  animation: spin 1s linear infinite;
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

按需加载配置

通过动态导入实现 Loading 组件的按需加载:

vue 怎么实现loading

const LoadingComponent = defineAsyncComponent({
  loader: () => import('./Loading.vue'),
  loadingComponent: SimpleLoading,
  delay: 200
})

标签: vueloading
分享给朋友:

相关文章

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue实现加减

vue实现加减

Vue 实现加减功能 在 Vue 中实现加减功能可以通过数据绑定和事件监听来完成。以下是一个简单的实现方法: 模板部分 <template> <div> <…

vue实现兼容

vue实现兼容

Vue 兼容性实现方案 Vue.js 的兼容性主要涉及对不同浏览器、Vue 版本以及第三方库的支持。以下是常见的兼容性解决方案: 浏览器兼容性 使用 Babel 转换 ES6+ 代码为 ES5 语…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

vue 实现 confirm

vue 实现 confirm

实现确认对话框的方法 在Vue中实现确认对话框可以通过多种方式完成,包括使用内置组件、第三方库或自定义组件。 使用浏览器原生confirm 最简单的实现方式是直接调用浏览器原生的confirm方法。…