当前位置:首页 > VUE

vue复杂按钮loading实现

2026-01-23 10:09:17VUE

Vue 复杂按钮 Loading 实现

使用自定义指令实现 Loading 状态

创建一个自定义指令 v-loading,用于控制按钮的加载状态。在按钮上添加该指令,并通过指令的值来控制是否显示加载状态。

Vue.directive('loading', {
  bind(el, binding) {
    const loadingText = el.getAttribute('loading-text') || 'Loading...';
    const originalText = el.textContent;

    el.addEventListener('click', () => {
      if (binding.value) {
        el.disabled = true;
        el.innerHTML = `<span class="loading-spinner"></span>${loadingText}`;
      } else {
        el.disabled = false;
        el.textContent = originalText;
      }
    });
  }
});

使用动态组件切换按钮状态

通过动态组件的方式,在按钮的加载状态和正常状态之间切换。定义一个 LoadingButton 组件,内部包含两个状态。

vue复杂按钮loading实现

<template>
  <button @click="handleClick" :disabled="isLoading">
    <template v-if="isLoading">
      <span class="spinner"></span>
      {{ loadingText }}
    </template>
    <template v-else>
      {{ buttonText }}
    </template>
  </button>
</template>

<script>
export default {
  props: {
    buttonText: String,
    loadingText: {
      type: String,
      default: 'Loading...'
    }
  },
  data() {
    return {
      isLoading: false
    };
  },
  methods: {
    handleClick() {
      this.isLoading = true;
      this.$emit('click', () => {
        this.isLoading = false;
      });
    }
  }
};
</script>

结合 Promise 控制 Loading 状态

在按钮点击事件中返回一个 Promise,通过 Promise 的状态来控制 Loading 的显示和隐藏。

vue复杂按钮loading实现

<template>
  <button @click="handleClick" :disabled="loading">
    <span v-if="loading" class="spinner"></span>
    {{ loading ? loadingText : buttonText }}
  </button>
</template>

<script>
export default {
  props: {
    buttonText: String,
    loadingText: {
      type: String,
      default: 'Loading...'
    },
    asyncAction: {
      type: Function,
      required: true
    }
  },
  data() {
    return {
      loading: false
    };
  },
  methods: {
    async handleClick() {
      this.loading = true;
      try {
        await this.asyncAction();
      } finally {
        this.loading = false;
      }
    }
  }
};
</script>

使用 CSS 动画增强视觉效果

通过 CSS 动画为加载状态添加旋转效果,提升用户体验。

.spinner {
  display: inline-block;
  width: 16px;
  height: 16px;
  border: 2px solid rgba(255, 255, 255, 0.3);
  border-radius: 50%;
  border-top-color: #fff;
  animation: spin 1s ease-in-out infinite;
}

@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

全局状态管理集成

如果需要跨组件共享按钮的 Loading 状态,可以使用 Vuex 或其他状态管理工具。

// store.js
export default new Vuex.Store({
  state: {
    isLoading: false
  },
  mutations: {
    setLoading(state, isLoading) {
      state.isLoading = isLoading;
    }
  }
});

// Component
<template>
  <button @click="handleClick" :disabled="$store.state.isLoading">
    <span v-if="$store.state.isLoading" class="spinner"></span>
    {{ $store.state.isLoading ? 'Loading...' : 'Submit' }}
  </button>
</template>

<script>
export default {
  methods: {
    handleClick() {
      this.$store.commit('setLoading', true);
      someAsyncAction().finally(() => {
        this.$store.commit('setLoading', false);
      });
    }
  }
};
</script>

以上方法可以根据实际需求选择或组合使用,以实现复杂的按钮 Loading 效果。

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

相关文章

vue实现文字按钮

vue实现文字按钮

实现文字按钮的基本方法 在Vue中创建文字按钮可以通过多种方式实现,核心思路是利用按钮或可点击元素,通过CSS去除默认样式,使其呈现为纯文字形式。 模板部分 <template>…

vue实现交换按钮

vue实现交换按钮

Vue实现交换按钮的方法 在Vue中实现交换按钮功能,可以通过多种方式完成。以下是几种常见的实现方法: 方法一:使用v-model双向绑定 通过v-model绑定数据,点击按钮时交换数据值。 &…

vue实现复杂表格

vue实现复杂表格

Vue 实现复杂表格的方法 在 Vue 中实现复杂表格通常需要结合组件化、动态渲染和数据处理的能力。以下是几种常见的方法和实现技巧: 使用 Element UI 或 Ant Design Vue 的…

Vue实现按钮权限

Vue实现按钮权限

Vue 按钮权限实现方案 在Vue中实现按钮权限控制通常需要结合后端返回的权限数据,前端根据权限动态渲染或禁用按钮。以下是几种常见实现方式: 基于 v-if 或 v-show 的权限控制 通过自定义…

vue实现按钮切换

vue实现按钮切换

Vue 实现按钮切换的方法 在 Vue 中实现按钮切换功能可以通过多种方式实现,以下介绍几种常见的实现方法: 使用 v-model 绑定数据 通过 v-model 绑定一个变量,点击按钮时切换变量的…

vue实现按钮倒转字符

vue实现按钮倒转字符

实现按钮倒转字符的Vue方案 在Vue中实现按钮点击倒转字符功能,可以通过数据绑定和方法调用来完成。以下是两种常见实现方式: 数据驱动实现 <template> <d…