Vue 3 30天精进之旅:Day 12 - 异步操作

news2025/2/3 11:16:26

在现代前端开发中,异步操作是一个非常常见的需求,例如从后端API获取数据、进行文件上传等任务。Vue 3 结合组合式API和Vuex可以方便地处理这些异步操作。今天我们将重点学习如何在Vue应用中进行异步操作,包括以下几个主题:

  1. 异步操作概述
  2. 使用 fetch 进行API请求
  3. 结合Vuex处理异步请求
  4. 错误处理与状态管理
  5. 使用axios库进行更加高效的HTTP请求
  6. 总结与实践

1. 异步操作概述

异步操作允许程序在等待某些操作(如网络请求)完成时继续执行代码,而无需阻塞用户界面。这使得应用能够更流畅地运行,并提升用户体验。在Vue 3中,我们可以使用内置的 fetch API、axios库等来执行这些操作。在 Vuex 中,通常使用 actions 来处理异步请求,并通过 mutations 更新状态。

2. 使用 fetch 进行API请求

2.1. 示例代码

假设我们有一个应用需要从某个API获取用户信息。首先,我们可以使用原生 fetch API 来获取数据并展示。

vue

<template>
  <div>
    <h2>User Info</h2>
    <p v-if="error">{
  
  { error }}</p>
    <p v-if="loading">Loading...</p>
    <ul v-if="user">
      <li>Name: {
  
  { user.name }}</li>
      <li>Email: {
  
  { user.email }}</li>
    </ul>
    <button @click="fetchUser">Fetch User</button>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const user = ref(null);
    const error = ref(null);
    const loading = ref(false);

    const fetchUser = async () => {
      error.value = null; // 重置错误
      loading.value = true; // 开始加载
      try {
        const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
        if (!response.ok) {
          throw new Error('Network response was not ok');
        }
        user.value = await response.json();
      } catch (err) {
        error.value = err.message; // 捕获并设置错误消息
      } finally {
        loading.value = false; // 结束加载
      }
    };

    return { user, error, loading, fetchUser };
  },
};
</script>

在这个组件中,我们定义了 fetchUser 方法来发送请求,使用 async 和 await 处理异步逻辑,并捕获可能出现的错误。

3. 结合Vuex处理异步请求

在Vuex中,我们使用actions来处理异步请求。以下是如何在Vuex中结合异步操作的示例:

3.1. 创建一个包含异步操作的Vuex Store

这里我们将创建一个用于获取用户信息的Vuex模块:

javascript

// store/user.js
import { createStore } from 'vuex';

const store = createStore({
  state() {
    return {
      user: null,
      loading: false,
      error: null,
    };
  },
  mutations: {
    setUser(state, user) {
      state.user = user;
    },
    setLoading(state, loading) {
      state.loading = loading;
    },
    setError(state, error) {
      state.error = error;
    },
  },
  actions: {
    async fetchUser({ commit }) {
      commit('setLoading', true);
      commit('setError', null);
      try {
        const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
        if (!response.ok) {
          throw new Error('Failed to fetch user');
        }
        const user = await response.json();
        commit('setUser', user);
      } catch (error) {
        commit('setError', error.message);
      } finally {
        commit('setLoading', false);
      }
    },
  },
});

export default store;

3.2. 在组件中使用Vuex Store

接下来在我们的组件中调用这个Vuex action:

vue

<template>
  <div>
    <h2>User Info</h2>
    <p v-if="error">{
  
  { error }}</p>
    <p v-if="loading">Loading...</p>
    <ul v-if="user">
      <li>Name: {
  
  { user.name }}</li>
      <li>Email: {
  
  { user.email }}</li>
    </ul>
    <button @click="fetchUser">Fetch User</button>
  </div>
</template>

<script>
import { computed } from 'vue';
import { mapState, mapActions } from 'vuex';

export default {
  setup() {
    const { user, loading, error } = mapState(['user', 'loading', 'error']);

    return {
      user,
      loading,
      error,
      ...mapActions(['fetchUser']),
    };
  },
};
</script>

在这个示例中,我们使用Vuex定 义的状态来管理数据,并在点击按钮事件中调用fetchUser action。

4. 错误处理与状态管理

无论是使用 fetch 还是 Vuex 中的异步操作,有效的错误处理非常重要。在上面的示例中,我们使用了 Vuex 的 mutations 来设置错误,而组件则根据状态展示相应的错误信息。

保持良好的用户体验,包括错误状态的展示,可以使用户更好地理解发生了什么。

5. 使用axios库进行更加高效的HTTP请求

虽然 fetch 是一种原生解决方案,但 axios 库为发送 HTTP 请求提供了许多便利的特性,以支持请求/响应拦截、取消请求、请求和响应的转化等。现在让我们使用 axios 来代替 fetch

5.1. 安装axios

首先,我们需要安装 axios

npm install axios

5.2. 使用axios发送请求

修改我们的Vuex Store,使用 axios 发起请求:

javascript

import axios from 'axios';

const store = createStore({
  state() {
    return {
      user: null,
      loading: false,
      error: null,
    };
  },
  mutations: {
    setUser(state, user) {
      state.user = user;
    },
    setLoading(state, loading) {
      state.loading = loading;
    },
    setError(state, error) {
      state.error = error;
    },
  },
  actions: {
    async fetchUser({ commit }) {
      commit('setLoading', true);
      commit('setError', null);
      try {
        const response = await axios.get('https://jsonplaceholder.typicode.com/users/1');
        commit('setUser', response.data);
      } catch (error) {
        commit('setError', error.response?.data?.message || error.message);
      } finally {
        commit('setLoading', false);
      }
    },
  },
});

在这个版本中,axios.get 方法发起请求,响应数据则从 response.data 中获取。错误处理也变得更加方便,因为 axios 对错误信息提供了更结构化的响应。

6. 总结与实践

今天我们学习了异步操作的基本知识,并探讨了如何使用原生 fetch 和 axios 在 Vue 3 中处理异步请求。通过结合 Vuex,我们可以实现集中化的状态管理,使得复杂的应用变得更加可维护。

练习

  1. 使用 axios 创建一个简单的天气信息应用,从一个开放的天气API获取天气数据,并用Vuex管理状态。
  2. 实现一个带有搜索功能的用户列表,当用户输入关键词时,从API获取相应用户列表并展示。
  3. 处理接收到的数据中出现的错误,例如 API 未响应、网络问题等,并用友好的提示展示给用户。

通过完成这些练习,你将能够深入理解Vue 3中的异步操作,并在实际应用中有效地进行状态管理。明天我们将探索更高级的主题,如Vue组件的样式和动画,敬请期待!

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

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

相关文章

VSCode插件Live Server

简介&#xff1a;插件Live Server能够实现当我们在VSCode编辑器里修改 HTML、CSS 或者 JavaScript 文件时&#xff0c;它都能自动实时地刷新浏览器页面&#xff0c;让我们实时看到代码变化的效果。再也不用手动刷新浏览器了&#xff0c;节省了大量的开发过程耗时&#xff01; 1…

50. 正点原子官方系统镜像烧写实验

一、Windows下使用OTG烧写系统 1、在Windos使用NXP提供的mfgtool来向开发烧写系统。需要用先将开发板的USB_OTG接口连接到电脑上。 Mfgtool工具是向板子先下载一个Linux系统&#xff0c;然后通过这个系统来完成烧写工作。 切记&#xff01;使用OTG烧写的时候要先把SD卡拔出来&…

扩散模型(三)

相关阅读&#xff1a; 扩散模型&#xff08;一&#xff09; 扩散模型&#xff08;二&#xff09; Latent Variable Space 潜在扩散模型&#xff08;LDM&#xff1b;龙巴赫、布拉特曼等人&#xff0c;2022 年&#xff09;在潜在空间而非像素空间中运行扩散过程&#xff0c;这…

it基础使用--5---git远程仓库

it基础使用–5—git远程仓库 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念 -git基础使用–3—安装和基本使用 -git基础使用–4—git分支和使用 2. 什么是远程仓库 在第一篇文章中&#xff0c;我们已经讲过了远程仓库&#xff0c;每个本…

Baklib如何改变内容管理平台的未来推动创新与效率提升

内容概要 在信息爆炸的时代&#xff0c;内容管理平台成为了企业和个人不可或缺的工具。它通过高效组织、存储和发布内容&#xff0c;帮助用户有效地管理信息流。随着技术的发展&#xff0c;传统的内容管理平台逐渐暴露出灵活性不足、易用性差等局限性&#xff0c;这促使市场需…

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

ARM嵌入式学习--第十天(UART)

--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器&#xff0c;是一种通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输和接收。在嵌入式设计中&#xff0c;UART用来与PC进行通信&#xff0c;包括与监控…

Unity游戏(Assault空对地打击)开发(3) 摄像机的控制

详细步骤 打开My Assets或者Package Manager。 选择Unity Registry。 搜索Cinemachine&#xff0c;找到 Cinemachine包&#xff0c;点击 Install按钮进行安装。 关闭窗口&#xff0c;新建一个FreeLook Camera&#xff0c;如下。 接着新建一个对象Pos&#xff0c;拖到Player下面…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

小程序-基础加强-自定义组件

前言 这次讲自定义组件 1. 准备今天要用到的项目 2. 初步创建并使用自定义组件 这样就成功在home中引入了test组件 在json中引用了这个组件才能用这个组件 现在我们来实现全局引用组件 在app.json这样使用就可以了 3. 自定义组件的样式 发现页面里面的文本和组件里面的文…

尝试ai生成figma设计

当听到用ai 自动生成figma设计时&#xff0c;不免好奇这个是如何实现的。在查阅了不少资料后&#xff0c;有了一些想法。参考了&#xff1a;在figma上使用脚本自动生成色谱 这篇文章提供的主要思路是&#xff1a;可以通过脚本的方式构建figma设计。如果我们使用ai 生成figma脚本…

【周易哲学】生辰八字入门讲解(八)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【周易哲学】生辰八字入门讲解&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、六亲女命六亲星六亲宫位相互关系 男命六亲星…

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型&#xff0c;使用的是nivdia RTX4070 显卡&#xff0c;结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具02

工具运行前的环境准备 1、登录用户管理员权限确认 工具使用的登录用户(-u后面的用户)&#xff0c;必须具有管理员的权限&#xff0c;因为需要读取系统表 例&#xff1a;Export.bat -s 10.48.111.12 -d db1 -u test -p test -schema dbo      2、Powershell的安全策略确认…

java异常处理——try catch finally

单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后&#xff0c;才会执行catch里的代码&#xff0c;程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常&#xff0c;则会强制停止程序&#xff0c;报错 3.finally修饰的代码一定会执行&#xff0c;除…

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;而是通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;展现出卓越的推理能力。通过强…

低成本、高附加值,具有较强的可扩展性和流通便利性的行业

目录 虚拟资源类 1. 网课教程 2. 设计素材 3. 软件工具 服务类 1. 写作服务 2. 咨询顾问 3. 在线教育 4. 社交媒体管理 虚拟资源类 1. 网课教程 特点&#xff1a;高附加值&#xff0c;可复制性强&#xff0c;市场需求大。 执行流程&#xff1a; 选择领域&#xff1a…

vue入门到实战 二

目录 2.1 计算属性computed 2.1.1什么是计算属性 2.1.2 只有getter方法的计算属性 2.1.3 定义有getter和setter方法的计算属性 2.1.4 计算属性和methods的对比 2.2 监听器属性watch 2.2.1 watch属性的用法 2.2.2 computed属性和watch属性的对比 2.1 计算属性computed…

二叉树-堆(补充)

二叉树-堆 1.二叉树的基本特性2.堆2.1.堆的基本概念2.2.堆的实现2.2.1.基本结构2.2.2.堆的初始化2.2.3.堆的销毁2.2.4.堆的插入2.2.5.取出堆顶的数据2.2.6.堆的删除2.2.7.堆的判空2.2.8.堆的数据个数2.2.9.交换2.2.10.打印堆数据2.2.11.堆的创建2.2.12.堆排序2.2.13.完整代码 3…

基于springboot私房菜定制上门服务系统设计与实现(源码+数据库+文档)

私房菜定制上门服务系统目录 目录 基于springbootvue私房菜定制上门服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;菜品管理 &#xff08;2&#xff09;公告管理 &#xff08;3&#xff09; 厨师管理 2、用…