当前位置:首页 > 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 效果。

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

相关文章

css 制作按钮

css 制作按钮

基础按钮样式 使用CSS创建一个基础按钮需要定义padding、background-color、border和border-radius等属性。以下是一个简单示例: .button { pa…

css制作按钮

css制作按钮

基础按钮样式 创建一个基础的CSS按钮样式,可以通过以下代码实现。这个例子包含了按钮的基本属性,如背景色、边框、内边距和文字样式。 .button { background-color: #4…

vue实现按钮改变文本

vue实现按钮改变文本

Vue 实现按钮改变文本的方法 在 Vue 中实现按钮点击改变文本的功能,可以通过数据绑定和事件处理来实现。以下是几种常见的方法: 方法 1:使用 v-on 和 v-bind 指令 通过 v-on…

vue实现按钮实现点击功能

vue实现按钮实现点击功能

实现按钮点击功能 在Vue中实现按钮点击功能可以通过v-on指令或@缩写来绑定事件。以下是几种常见的实现方式: 使用v-on指令 通过v-on:click绑定点击事件,触发定义在methods中的方…

vue实现按钮位置

vue实现按钮位置

Vue 实现按钮位置的几种方法 在 Vue 中实现按钮位置的控制可以通过多种方式实现,包括 CSS 样式、Flexbox 布局、Grid 布局以及 Vue 的动态绑定等。以下是几种常见的实现方法:…

vue实现单选按钮

vue实现单选按钮

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