Vue2/3封装按钮Loding

news2024/9/25 20:57:33

Vue2/3封装按钮Loding

1、Vue3

  • 基于如下平常代码,我们可以发现,两个按钮逻辑中,有很多重复代码(开启loding关闭loding),并且正式项目中会有很多按钮会发送请求
<template>
  <el-button @click="test" :loading="loading" type="primary">test</el-button>

  <el-button @click="test" :loading="loading22" type="primary">test2</el-button>
</template>

<script setup>
import { ref } from "vue";

const loading1 = ref(false);
const loading2 = ref(false);

function test() {
  loading1.value = true;
  try {
    fetch("http://localhost:8888/getUser?userName=''")
      .then((res) => {
        return res.json();
      })
      .then((res) => {
        console.log(res);
      });
  } finally {
    loading1.value = false;
  }
}

function test() {
  loading2.value = true;
  try {
    fetch("http://localhost:8888/getUser2?userName=")
      .then((res) => {
        return res.json();
      })
      .then((res) => {
        console.log(res);
      });
  } finally {
    loading2.value = false;
  }
}
</script>
  • 我们就可以把上面公共的部分提取出来一个组件

1.1、组件代码

<template>
  <!-- 使用v-bind=$attrs 把按钮的其他属性绑定过来 -->
  <el-button :loading="loading" v-bind="$attrs" @click="handleClick">
    <slot></slot>
  </el-button>
</template>

<script setup>
import { ref, useAttrs } from "vue";

const loading = ref(false);
const attrs = useAttrs();

// 使用defineProps定义的props的属性,不会在$attrs中存在了
const { onClick } = defineProps({
  onClick: Function,
});

async function handleClick() {
  console.log("click");
  loading.value = true;
  try {
    // 这里就必须要求onClick的返回值为Promise类型 或者是async函数
    await onClick?.();
  } finally {
    loading.value = false;
  }
}
</script>

1.2、使用组件

<template>
  <MyLoadingBtn @click="test" type="primary">test</MyLoadingBtn>
</template>

<script setup>
import { ref } from "vue";
import MyLoadingBtn from "./components/MyLoadingBtn.vue";

// 这里必须让test返回为一个promise,或者使用async/await
async function test() {
  await fetch("http://localhost:8888/getUser?userName=")
    .then((res) => {
      return res.json();
    })
    .then((res) => {
      console.log(res);
    })
    .catch((err) => {
      console.log(err);
    });
}
</script>

1.3、效果

在这里插入图片描述

2、Vue2

  • Vue2中和Vue3中逻辑基本一致,不过要稍微麻烦一点
  • 因为Vue2父组件传递的所有方法,并不会一起放到$attrs中,而是会放到$listeners,使用不了**在props中声明, a t t r s 对象中不存在的特性 ∗ ∗ ,那么我们就需要对 ‘ attrs对象中不存在的特性**,那么我们就需要对` attrs对象中不存在的特性,那么我们就需要对listeners对象单独处理一下再绑定到v-on=“xxx”`中
  • 如果不处理$listeners.click函数的话,那么父组件绑定的点击事件函数就会调用两遍!!

2.1、组件代码

<template>
  <!-- 这里使用v-on="listeners" 绑定父组件传过来的所有函数 -->
  <el-button
    :loading="loading"
    v-bind="$attrs"
    v-on="listeners"
    @click="handleClick"
  >
    <slot></slot>
  </el-button>
</template>
<script>
export default {
  name: "MyLoadingBtn",
  data() {
    return {
      loading: false,
    };
  },
  computed: {
    // 需要单独对click事件进行处理
    listeners() {
      const copy = { ...this.$listeners };
      delete copy.click;
      return copy;
    },
  },
  methods: {
    async handleClick() {
      console.log("click");
      const fun = this.$listeners;

      this.loading = true;
      try {
        // 同样,绑定的click函数也必须返回Promise或者async函数
        await fun.click?.();
      } finally {
        this.loading = false;
      }
    },
  },
};
</script>

2.2、使用组件

<template>
  <div class="test1">
    <MyLoadingBtn type="primary" @click="handleClick"> 测试 </MyLoadingBtn>
  </div>
</template>
<script>
import MyLoadingBtn from "@/components/MyLoadingBtn.vue";
export default {
  components: {
    MyLoadingBtn,
  },
  methods: {
    async handleClick() {
      await fetch("http://localhost:8888/getUser?userName=")
        .then((res) => {
          return res.json();
        })
        .then((res) => {
          console.log(res);
        });
    },
  },
};
</script>

2.3、效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漫步者开放式耳机怎么样值得买吗?南卡、漫步者、QCY热门开放式耳机实测推荐!

​开放式耳机目前已经成为蓝牙耳机中的顶流&#xff0c;网上很多人都在讨论这类耳机&#xff0c;这类耳机的优点在于高佩戴舒适度以及在听歌时可以感知环境&#xff0c;更加安全&#xff0c;因此作为一名数码博主&#xff0c;今天也回应粉丝的要求&#xff0c;买了三款开放式耳…

客户流失、裁员、增长放缓后,PayPal股价重新“起飞”的时机已到来

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;PayPal的股价已经从2023年的最低点上涨了45%以上。 &#xff08;2&#xff09;随着增长放缓&#xff0c;该公司正在制定一系列扭亏为盈的战略。 &#xff08;3&#xff09;与主要竞争对手相比&#xff0c;它的估值相对偏…

气压高度加误差的两种方法(直接添加 vs 换算到气压误差),附MATLAB程序

在已知高度真实值时,如果需要计算此高度下的气压计误差,可考虑本文所述的两种方法 气压高度 气压与高度之间的关系可以用大气压的垂直变化来描述。随着高度的增加,气压通常会下降。这是因为空气的密度在高度增加时减少,导致上方空气柱对下方空气施加的压力减小。 主要关系…

物理学基础精解【20】

文章目录 简化二次方程轴平移轴平移是一种简化二次方程图形表示的有用技巧一元二次方程的轴平移二元二次方程的轴平移轴平移简化二次方程定义性质计算例子一元二次方程的例子二元二次方程的例子&#xff08;圆&#xff09; 例题 轴旋转简化二次方程轴旋转的定义轴旋转的性质例题…

应用层 I(C/S模型、P2P模型、域名系统DNS)【★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、网络应用模型 在网络边缘的端系统之间的通信方式通常可划分为两大类&#xff1a;客户 - 服务器方式&#xff08;C/S 方式 [Client/Server] &#xff09;和对等…

Prometheus篇之利用promtool工具校验配置正确性

promtool工具 promtool是Prometheus的一个命令行工具&#xff0c;它提供了一些功能来帮助用户进行Prometheus配置文件&#xff08;如prometheus.yml&#xff09;的检查、规则检查和调试。 解释 promtool check config: 验证Prometheus配置文件的语法和设置。 promtool命令&…

Python酷库之旅-第三方库Pandas(104)

目录 一、用法精讲 451、pandas.DataFrame.pow方法 451-1、语法 451-2、参数 451-3、功能 451-4、返回值 451-5、说明 451-6、用法 451-6-1、数据准备 451-6-2、代码示例 451-6-3、结果输出 452、pandas.DataFrame.dot方法 452-1、语法 452-2、参数 452-3、功能…

如何应对海外Instagram直播中的常见问题

Instagram已成为继Facebook之后的另一个热门海外直播平台&#xff0c;对于出海电商卖家来说&#xff0c;使用适当的工具和行之有效的营销策略&#xff0c;能够充分发挥Instagram直播的潜力。本文将深入探讨商家在进行Instagram海外直播时遇到的一些常见的技术和运营问题并提供相…

Python如何保存py文件

第一步&#xff0c;点击“开始菜单”&#xff0c;在搜索栏里输入“idle”&#xff0c;选择“IDLE &#xff08;Python 3.7 64-bit&#xff09;”。 第二步&#xff0c;进入“shell交互模式”&#xff0c;然后点击“File”&#xff0c;选择“New File”。 第三步&#xff0c;输入…

大数据新视界 --大数据大厂之HBase 在大数据存储中的应用与表结构设计

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

app自动化前置准备环境搭建

编写脚本之前的一些前置准备工作。 1&#xff0c;安装appium server&#xff1a;官网地址&#xff1a;http://appium.io/ 安装教程&#xff1a;https://www.cnblogs.com/gancuimian/p/16536322.html 2&#xff0c;安装appium客户端&#xff1a; appium客户端安装相对较简单…

「漏洞复现」某徳知识产权管理系统 UploadFileWordTemplate 文件上传漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

collections.defaultdict(list)和一般的dict()有什么区别

文章目录 collections.defaultdict()dict() collections.defaultdict() mp collections.defaultdict(list) 是在Python中创建一个特殊类型的字典&#xff0c;称为默认字典&#xff08;defaultdict&#xff09;。这行代码的含义和作用如下&#xff1a; collections 是Python的…

基于python+spark的外卖餐饮数据分析系统设计与实现(含论文)-Spark毕业设计选题推荐

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

vue props 接收函数 function

父组件&#xff1a; 子组件&#xff1a; props:{afterLoad: {type: Function},}

C++(9.25)

stack: #include <iostream> using namespace std; class my_stack { private:int* data; // 动态数组&#xff0c;用于存储栈的元素int len; // 当前栈中元素的个数int size; // 栈的最大容量public:// 默认构造函数&#xff0c;初始化容量为 10my_st…

mini-lsm通关笔记Week2Day3

项目地址&#xff1a;https://github.com/skyzh/mini-lsm 个人实现地址&#xff1a;https://gitee.com/cnyuyang/mini-lsm Summary 在本章中&#xff0c;您将&#xff1a; 实现tiered合并策略并在压缩模拟器上对其进行模拟。将tiered合并策略纳入系统。 我们在本章所讲的tier…

车载网络测试实操源码_使用CAPL脚本实现安全访问解锁,并模拟各种测试场景

系列文章目录 使用CAPL脚本解析hex、S19、vbf文件 使用CAPL脚本对CAN报文的Counter、CRC、周期、错误帧进行实时监控 使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文 使用CAPL脚本控制继电器实现CAN线、电源线的通断 使用CAPL脚本实现安全访问解锁 使用CAPL脚本实现…

IDEA忽略node_modules减少内存消耗,提升索引速度

IDEA忽略node_modules减少内存消耗&#xff0c;提升索引速度 简介 在后端开发中&#xff0c;IDEA 在运行前端代码时&#xff0c;频繁扫描 node_modules 文件夹会导致高内存消耗和慢索引速度&#xff0c;甚至可能会导致软件卡死。为了改善这一问题&#xff0c;可以按照以下步骤…

STM32基础学习笔记-USART外设面试基础题3

第三章、USART 常见问题 通讯定义 &#xff1f;通讯分类 &#xff08;有无时钟源、通讯方式、传输方向&#xff09;&#xff1f; 波特率的本质&#xff1a;隐形的时钟 电平转换 &#xff1f;TTL、COMS、RS232、RS485、USB电平标准 &#xff1f; STM32串口与RS-232通讯 &…