【前端】Svelte:`await`模板

在现代前端开发中,处理异步数据是必不可少的,而 Svelte 提供了强大的 await 模板来简化异步操作的逻辑。与传统的 JavaScript async/await 不同,Svelte 的 await 模板允许我们直接在模板中处理异步数据,显著提升了代码的可读性和维护性。本文将从基础用法到实际场景应用深入讲解 Svelte 的 await 模板。

为什么选择 await 模板

通常,异步数据在组件中处理需要使用 async/await 或 Promise 回调,这些逻辑往往使模板复杂,尤其是在组件渲染之前需要完成的异步数据较多时。Svelte 的 await 模板使得在模板中直接处理异步数据成为可能,让开发者可以更清晰地构建动态应用程序。

await 模板语法结构

Svelte 的 await 模板允许我们使用以下三种状态来处理异步操作的不同阶段:

{#await promise}<!-- 等待 promise 结果时显示的内容 -->
{:then result}<!-- 当 promise 成功时显示的内容 -->
{:catch error}<!-- 当 promise 失败时显示的内容 -->
{/await}

在此结构中:

  • {#await promise}:用于开始一个 await 块。可以用来显示加载中的内容,等待 promise 的结果。
  • {:then result}:当 promise 成功解析时会执行此块的内容,并将结果赋值给 result 变量。
  • {:catch error}:当 promise 被拒绝时执行的内容,错误信息会存储在 error 变量中。

基本用法示例

首先,来看一个简单的例子来展示如何在 Svelte 中使用 await 模板。

示例:加载用户数据

假设我们要从 API 获取用户数据,在数据加载完成之前显示“Loading…”文本,如果成功则显示用户名,失败时显示错误信息。

<script>async function fetchUserData() {const response = await fetch('https://jsonplaceholder.typicode.com/users/1');if (!response.ok) throw new Error('Failed to fetch user data');return await response.json();}// 调用异步函数返回 promiselet userPromise = fetchUserData();
</script>{#await userPromise}<p>Loading...</p>
{:then user}<p>User Name: {user.name}</p>
{:catch error}<p style="color: red;">Error: {error.message}</p>
{/await}

代码解析

  • userPromise 是调用 fetchUserData() 返回的 Promise。
  • {#await userPromise} 块在等待 userPromise 的状态时显示“Loading…”;如果成功,显示用户名;如果失败,显示错误信息。

解释模板的执行流程

  1. 在加载时,{#await userPromise} 会显示“Loading…”的占位符。
  2. 一旦 userPromise 解析成功,控制权会转到 {:then user} 块,user 被赋予返回的数据,显示用户名。
  3. 如果 userPromise 被拒绝,{:catch error} 会执行,并将错误信息赋值给 error 变量。

await 模板的动态加载

await 模板可以用于动态数据请求,且可以随着数据变化而更新。例如,当我们实现搜索功能时,await 模板可以响应用户输入的关键词并根据新关键词加载数据。

示例:动态搜索用户

<script>import { debounce } from 'lodash';let query = '';let userPromise;async function searchUser(keyword) {const response = await fetch(`https://jsonplaceholder.typicode.com/users?name_like=${keyword}`);if (!response.ok) throw new Error('Failed to fetch user');return await response.json();}const onSearch = debounce(() => {userPromise = searchUser(query);}, 300);
</script><input type="text" bind:value={query} placeholder="Search user" on:input={onSearch} />{#await userPromise}<p>Searching...</p>
{:then users}<ul>{#each users as user}<li>{user.name}</li>{/each}</ul>
{:catch error}<p style="color: red;">Error: {error.message}</p>
{/await}

代码解释

  • 使用 debounce 来避免频繁的 API 调用,仅在输入间隔超过 300 毫秒时触发请求。
  • 根据 query 更新 userPromise,触发 await 模板更新显示结果。
  • 若请求失败,则在 {:catch error} 中展示错误。

await 模板的嵌套与多级异步

在一些场景下,我们可能会遇到多级异步任务。例如,先加载用户数据,再根据用户数据加载更多相关信息。在这种情况下,await 模板的嵌套可以帮我们简化逻辑。

示例:加载用户及其详细信息

假设需要首先加载用户,然后根据用户 ID 加载其详细信息。

<script>async function fetchUser() {const response = await fetch('https://jsonplaceholder.typicode.com/users/1');if (!response.ok) throw new Error('Failed to fetch user');return await response.json();}async function fetchUserDetails(userId) {const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}/details`);if (!response.ok) throw new Error('Failed to fetch user details');return await response.json();}let userPromise = fetchUser();
</script>{#await userPromise}<p>Loading user...</p>
{:then user}<p>User: {user.name}</p>{#await fetchUserDetails(user.id)}<p>Loading details...</p>{:then details}<p>Email: {details.email}</p><p>Phone: {details.phone}</p>{:catch detailsError}<p style="color: red;">Error loading details: {detailsError.message}</p>{/await}
{:catch error}<p style="color: red;">Error: {error.message}</p>
{/await}

代码解释

  • userPromise 加载用户基本信息。
  • 内部的 await 块用来加载用户的详细信息。
  • 如果加载用户信息失败则显示用户加载错误,如果加载用户详细信息失败则显示详细信息加载错误。

使用 await 模板实现分页加载

await 模板还可以用于实现分页加载的功能,这在加载大量数据时非常实用。

示例:分页加载文章

<script>let page = 1;let postsPromise = fetchPosts(page);async function fetchPosts(page) {const response = await fetch(`https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=5`);if (!response.ok) throw new Error('Failed to fetch posts');return await response.json();}function loadMore() {page += 1;postsPromise = fetchPosts(page);}
</script>{#await postsPromise}<p>Loading posts...</p>
{:then posts}<ul>{#each posts as post}<li>{post.title}</li>{/each}</ul><button on:click={loadMore}>Load more</button>
{:catch error}<p style="color: red;">Error: {error.message}</p>
{/await}

代码解析

  • 每次点击“Load more”按钮时,page 增加,postsPromise 会更新为新的 Promise,从而重新加载新的数据。
  • 利用 await 模板中的 {:then posts} 块动态渲染加载的内容。

总结

Svelte 的 await 模板通过让异步操作在模板中直接呈现,将异步操作处理简化为声明式写法。通过 {#await promise}{:then result}{:catch error} 三个块结构,能够优雅地展示异步任务的不同状态。不论是处理简单的数据加载、错误处理,还是多级嵌套异步任务,await 模板都能大大提升开发体验。

  • 使用 await 模板可以在组件中直接展示异步数据的加载、成功和失败状态。
  • 多级嵌套的 await 模板可以应对复杂的异步任务依赖场景。
  • 在分页、动态请求等场景中,await 模板也提供了极大的便利。

希望通过本教程的示例,你能深入理解并灵活应用 Svelte 的 await 模板,在项目中更加轻松地处理异步数据!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习(一)——基本概念、模型的评估与选择

目录 1 关于2 概念2.1 基础概念2.2 学习过程2.3 预测与评估2.4 标记与分类2.4.1 标记2.4.2 分类 2.5 回归分析2.6 聚类分析2.7 学习类型2.8 泛化能力2.9 统计学概念 3 模型评估与选择3.1 经验误差与过拟合3.2 评估方法3.2.1 留出法3.2.2 交叉验证法3.2.3 自助法3.2.4 调参与最终…

小白docker入门简介

Dockerfile入门使用分享 一、docker是啥二、镜像仓库三、自定义镜像四、动手做机甲玩偶五、帮我做数学题六、计算功能的写法七、咒语翻译器八、放屁九、解决问题 一、docker是啥 最开始我和你一样&#xff0c;围着镜像、容器、docker的名词团团转&#xff0c;其实没那么复杂。…

gitlab无法创建合并请求是所有分支都不显示

点击Merge Requests ------> New merge request 创建新的合并请求时&#xff0c;在Source branch和Target branch中一个分支都不显示 排查思路&#xff1a; 1.怀疑是权限问题。 发现只有我的一个账号出现&#xff0c;检查了账号的权限&#xff0c;尝试了master、develop角色…

macOS15.1及以上系统bug:开发者证书无法打开,钥匙串访问无法打开一直出现图标后立马闪退

团队紧跟苹果最新系统发现bug:今日设备信息如下,希望能带给遇到这个问题的开发者一点帮助。 错误图如下: 点击证书文件后,先出现钥匙串访问图标,后立马闪退消失 中间试过很多方法,都是一样的表现,最后好在解决了,看网上也没有相关的帖子,这里直接写解决办法和导致原因…

python实战案例——爬取A站视频,m3u8格式视频抓取(内含完整代码!)

1、任务目标 目标网站&#xff1a;A站视频&#xff08;https://www.acfun.cn/v/ac40795151&#xff09; 要求&#xff1a;抓取该网址下的视频&#xff0c;将其存入本地&#xff0c;视频如下&#xff1a; 2、网页分析 进入目标网站&#xff0c;打开开发者模式&#xff0c;我们发…

【基于轻量型架构的WEB开发】课程 12.4 页面跳转 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.4 页面跳转 12.4.1 返回值为void类型的页面跳转 返回值为void类型的页面跳转到默认页面 当Spring MVC方法的返回值为void类型&#xff0c;方法执行后会跳转到默认的页面。默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成&#xff0c;拼接格式为“前缀方法…

濮良贵《机械设计》第十版课后习题答案全解PDF电子版

《机械设计》(第十版)是“十二五”普通高等教育本科国家级规划教材&#xff0c; 是在《机械设计》(第九版)的基础上修订而成的。本次修订主要做了以下几项工作&#xff1a; 1. 内容的适当更新——自本书第九版出版以来&#xff0c; 机械工程及相关领域的新理论、新技术和新标准…

【Unity基础】Unity中如何导入字体?

在Unity中&#xff0c;不能像其他软件一样直接使用字体文件&#xff0c;需要通过FontAssetCreator将其转换成Texture的Asset文件&#xff0c;然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程&#xff0c;并对其参数设置进行了说明。 Font Asset Creator 是 Uni…

2024年11月8日上海帆软用户大会

2024年11月8日上海帆软用户大会 2024年11月8日&#xff0c;上海成功举办了帆软用户大会&#xff0c;主题为“数字聚力&#xff0c;绽放新机”。大会汇聚了众多行业专家和企业代表&#xff0c;共同探讨数字化转型和商业智能领域的最新趋势和实践。 大会亮点&#xff1a; 专家…

注意力机制的目的:理解语义;编码器嵌入高纬空间计算;注意力得分“得到S*V”;解码器掩码和交叉注意力层用于训练;最终的编码器和输出实现大模型

目录 注意力机制的目的:理解语义中的它是小白兔 词编码器嵌入高纬空间 计算注意力得分“得到S*V” 权重QKV:连接权重 训练阶段使用解码器:翻译后的语句 解码器掩码和交叉注意力层用于训练 最终的编码器和输出实现大模型 Transformer模型中,QKV QKV的作用 举例说明…

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中&#xff0c;遇到需要在线预览各种文件的需求&#xff0c;最近遇到在线预览excel文件的需求&#xff0c;在此记录一下&#xff01;本文主要功能实现&#xff0c;用于插件 LuckyExcel &#xff0c;Luckysheet&#xff01;废话不多说&#xff0c;上代码&#xf…

WPF自定义翻页控件

XAML文件如下&#xff1a; <UserControlx:Class"CTMVVMDemo.View.UserControls.DataPager"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://s…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

使用Python实现音频降噪

在音频处理领域&#xff0c;背景噪声是一个常见的问题。为了提高音频的质量&#xff0c;我们需要对音频进行降噪处理。本文将介绍如何使用 Python 实现音频降噪。 依赖库安装 在开始之前&#xff0c;我们需要安装以下依赖库&#xff1a; pydub&#xff1a;用于音频文件的读取…

【WRF模拟】全过程总结:WPS预处理及WRF运行

【WRF模拟】全过程总结:WPS预处理及WRF运行 1 数据准备1.1 嵌套域设置(Customize domain)-基于QGis中gis4wrf插件1.2 静态地理数据1.2.1 叶面积指数LAI和植被覆盖度Fpar(月尺度)1.2.2 地面反照率(月尺度)1.2.3 土地利用类型+不透水面积1.2.4 数据处理:geotiff→tiff(W…

【react】Redux基础用法

1. Redux基础用法 Redux 是一个用于 JavaScript 应用的状态管理库&#xff0c;它不依赖于任何 UI库&#xff0c;但常用于与 React 框架配合使用。它提供了一种集中式的状态管理方式&#xff0c;将应用的所有状态保存在一个单一的全局 Store&#xff08;存储&#xff09;中&…

DevCheck Pro手机硬件检测工具v5.33

前言 DevCheck Pro是一款手机硬件和操作系统信息检测查看工具&#xff0c;该软件的功能非常强大&#xff0c;为用户提供了系统、硬件、应用程序、相机、网络、电池等一系列信息查看功能 安装环境 [名称]&#xff1a;DevCheckPro [版本]&#xff1a;5.33 [大小]&a…

Docker的轻量级可视化工具Portainer

docker目录 1 Portainer官方链接2 是什么&#xff1f;3 下载安装4 跑通一次5 后记 1 Portainer官方链接 这里给出portainer的官方链接&#xff1a;https://www.portainer.io/ portainer安装的官方链接&#xff1a;https://docs.portainer.io/start/install-ce/server/docker/l…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…