当前位置:首页 > VUE

vue复杂按钮loading实现

2026-02-24 00:47:15VUE

实现复杂按钮 Loading 效果

在 Vue 中实现复杂按钮的 Loading 效果,可以通过结合状态管理、CSS 动画和图标库来实现。以下是几种常见方法:

使用 Element UI 或 Ant Design Vue 的 Loading 按钮

如果项目中使用了 Element UI 或 Ant Design Vue,可以直接使用它们提供的 Loading 按钮组件:

vue复杂按钮loading实现

<template>
  <el-button type="primary" :loading="isLoading" @click="handleClick">
    提交
  </el-button>
</template>

<script>
export default {
  data() {
    return {
      isLoading: false
    }
  },
  methods: {
    handleClick() {
      this.isLoading = true
      setTimeout(() => {
        this.isLoading = false
      }, 2000)
    }
  }
}
</script>

自定义 Loading 按钮

对于更复杂的自定义需求,可以创建一个可复用的 Loading 按钮组件:

<template>
  <button 
    class="custom-button"
    :disabled="loading"
    @click="$emit('click')"
  >
    <span v-if="!loading">{{ text }}</span>
    <div v-else class="loading-content">
      <svg class="spinner" viewBox="0 0 50 50">
        <circle class="path" cx="25" cy="25" r="20" fill="none" stroke-width="5"></circle>
      </svg>
      <span>{{ loadingText }}</span>
    </div>
  </button>
</template>

<script>
export default {
  props: {
    text: {
      type: String,
      default: 'Submit'
    },
    loadingText: {
      type: String,
      default: 'Processing...'
    },
    loading: {
      type: Boolean,
      default: false
    }
  }
}
</script>

<style scoped>
.custom-button {
  position: relative;
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
  background-color: #409eff;
  color: white;
  cursor: pointer;
  transition: all 0.3s;
}

.custom-button:disabled {
  opacity: 0.7;
  cursor: not-allowed;
}

.loading-content {
  display: flex;
  align-items: center;
  justify-content: center;
}

.spinner {
  animation: rotate 2s linear infinite;
  width: 20px;
  height: 20px;
  margin-right: 8px;
}

.spinner .path {
  stroke: white;
  stroke-linecap: round;
  animation: dash 1.5s ease-in-out infinite;
}

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

@keyframes dash {
  0% {
    stroke-dasharray: 1, 150;
    stroke-dashoffset: 0;
  }
  50% {
    stroke-dasharray: 90, 150;
    stroke-dashoffset: -35;
  }
  100% {
    stroke-dasharray: 90, 150;
    stroke-dashoffset: -124;
  }
}
</style>

结合 Vuex 管理全局 Loading 状态

对于需要跨组件共享的 Loading 状态,可以使用 Vuex:

vue复杂按钮loading实现

// store.js
export default new Vuex.Store({
  state: {
    isLoading: false
  },
  mutations: {
    setLoading(state, payload) {
      state.isLoading = payload
    }
  },
  actions: {
    async submitForm({ commit }) {
      commit('setLoading', true)
      try {
        await api.submit()
      } finally {
        commit('setLoading', false)
      }
    }
  }
})

在组件中使用:

<template>
  <button :disabled="$store.state.isLoading">
    <span v-if="!$store.state.isLoading">Submit</span>
    <span v-else>Loading...</span>
  </button>
</template>

使用 CSS 实现进度条式 Loading

对于需要显示进度的按钮,可以添加进度条效果:

<template>
  <div class="progress-button" @click="startProgress">
    <div class="progress-bar" :style="{ width: progress + '%' }"></div>
    <span class="button-text">
      {{ progress === 100 ? 'Complete' : progress > 0 ? 'Uploading...' : 'Upload' }}
    </span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      progress: 0
    }
  },
  methods: {
    startProgress() {
      if (this.progress > 0) return

      const interval = setInterval(() => {
        this.progress += 5
        if (this.progress >= 100) {
          clearInterval(interval)
          setTimeout(() => {
            this.progress = 0
          }, 1000)
        }
      }, 200)
    }
  }
}
</script>

<style scoped>
.progress-button {
  position: relative;
  display: inline-block;
  padding: 10px 20px;
  background-color: #f0f0f0;
  color: #333;
  border: none;
  border-radius: 4px;
  overflow: hidden;
  cursor: pointer;
}

.progress-bar {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  background-color: #4CAF50;
  transition: width 0.3s ease;
}

.button-text {
  position: relative;
  z-index: 1;
}
</style>

这些方法可以根据项目需求进行组合和扩展,实现各种复杂的按钮 Loading 效果。

标签: 按钮复杂
分享给朋友:

相关文章

vue实现点击按钮

vue实现点击按钮

实现点击按钮的基本方法 在Vue中实现点击按钮功能可以通过v-on指令或@语法糖绑定事件。以下是一个基础示例: <template> <button @click="handl…

vue 实现删除按钮

vue 实现删除按钮

Vue 实现删除按钮的方法 在 Vue 中实现删除按钮通常涉及以下几个关键步骤:绑定点击事件、处理删除逻辑以及更新数据。以下是几种常见的实现方式: 使用 v-on 或 @click 绑定事件 通过…

vue实现轮播按钮

vue实现轮播按钮

实现轮播按钮的基本思路 在Vue中实现轮播按钮通常需要结合组件化思想和动态数据绑定。轮播按钮的核心功能包括自动轮播、手动切换、指示器导航等。 使用Vue实现轮播按钮 创建基础轮播组件 <tem…

vue按钮权限实现

vue按钮权限实现

实现按钮权限的常见方法 在Vue项目中实现按钮权限控制,通常有以下几种方案: 基于v-directive的自定义指令 创建自定义指令v-permission,在指令中判断用户权限并控制DOM显示隐藏…

vue实现复杂表格合并

vue实现复杂表格合并

Vue 实现复杂表格合并的方法 使用 rowspan 和 colspan 属性 通过动态计算 rowspan 和 colspan 属性实现单元格合并。在 Vue 的模板中,可以使用 v-for 循环生…

vue怎么实现全选按钮

vue怎么实现全选按钮

实现全选按钮的基本逻辑 在Vue中实现全选按钮通常需要结合v-model和计算属性来管理选中状态。全选按钮的状态与子选项的选中状态相互关联,当全选按钮被点击时,所有子选项的选中状态应同步更新;反之,当…