当前位置:首页 > 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中实现按钮点击触发弹窗功能,可以通过多种方式完成。以下是几种常见实现方法: 使用原生HTML和Vue指令 通过v-if或v-show控制弹窗显示状态,结合点击事件切换…

vue实现单选按钮

vue实现单选按钮

实现单选按钮的基本方法 在Vue中实现单选按钮通常使用v-model指令绑定数据,结合input元素的type="radio"属性。以下是一个基础示例: <template> <…

vue实现按钮按压

vue实现按钮按压

Vue 实现按钮按压效果 在 Vue 中实现按钮按压效果可以通过 CSS 和 Vue 的事件绑定结合完成。以下是一个完整的实现方法: 添加按压样式 通过 CSS 定义按钮的默认和按压状态样式: .…

vue 实现多选按钮

vue 实现多选按钮

实现多选按钮的基本方法 在Vue中实现多选按钮可以通过v-model绑定数组来管理选中状态。以下是一个基础示例: <template> <div> <lab…

vue实现点击按钮弹出

vue实现点击按钮弹出

实现点击按钮弹出对话框 在Vue中实现点击按钮弹出对话框的功能,可以通过以下几种方式实现: 使用v-show或v-if控制显示 <template> <butto…

vue实现按钮倒转字符

vue实现按钮倒转字符

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