【前端】Svelte:`await`模板

news2024/11/13 12:57:36

在现代前端开发中,处理异步数据是必不可少的,而 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();
  }

  // 调用异步函数返回 promise
  let 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.coloradmin.cn/o/2237621.html

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

相关文章

solo博客使用非docker方式进行https部署

solo博客使用非docker方式进行https部署 数据库配置启动命令讲解设置自定义访问端口&#xff1a;9168 配置https访问部署效果 服务器上请通过 Docker 部署。但是我服务器资源有限&#xff0c;不想安装docker&#xff0c;直接以编译包的形式运行&#xff0c;节省资源。 如果不会…

【Steam登录】protobuf协议逆向 | 续

登录接口&#xff1a; ‘https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1’ 精准定位&#xff0c;打上条件断点 this.CreateWebAPIURL(t) ‘https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1…

环形链表问题(图 + 证明 + 题)

文章目录 判断链表是否有环返回链表开始入环的第一个结点 判断链表是否有环 题目链接 思路&#xff1a; 可以明确的是&#xff1a;若一个链表带环&#xff0c;那么用指针一直顺着链表遍历&#xff0c;最终会回到某个地方。 我们可以定义两个指针&#xff08;快慢指针&#xf…

Linux Centos7 如何安装图形化界面

如果系统是以最小安装的话,一般是不带有图形化界面的,如果需要图形话界面,需要单独安装。本篇教程,主要介绍如何在CentOS7中安装图形化界面。 1、更新系统 首先,保证系统依赖版本处于最新。 sudo yum update -y2、安装 GNOME 桌面环境 sudo yum groupinstall "GNOME…

Spark的学习-02

Spark Standalone集群的安装 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利用自己…

Linux相关概念和易错知识点(20)(dentry、分区、挂载)

目录 1.dentry &#xff08;1&#xff09;路径缓存的原因 &#xff08;2&#xff09;dentry的结构 ①多叉树结构 ②file和dentry之间的联系 ③路径概念存在的意义 2.分区 &#xff08;1&#xff09;为什么要确认分区 &#xff08;2&#xff09;挂载 ①进入分区 ②被挂…

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU部署redis 6.2.14 TLS/SSL哨兵集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、简介 Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障转移,从而确保服务的连续性。哨兵模式的核心组件包括哨兵(Sentine…

vue3实现一个无缝衔接、滚动平滑的列表自动滚屏效果,支持鼠标移入停止移出滚动

文章目录 前言一、滚动元素相关属性回顾一、实现分析二、代码实现示例&#xff1a;2、继续添加功能&#xff0c;增加鼠标移入停止滚动、移出继续滚动效果2、继续完善 前言 列表自动滚屏效果常见于大屏开发场景中&#xff0c;本文将讲解用vue3实现一个无缝衔接、滚动平滑的列表自…

腾讯云nginx SSL证书配置

本章教程,记录在使用腾讯云域名nginx证书配置SSL配置过程。 一、nginx配置 域名和证书,替换成自己的即可。证书文件可以自定义路径位置。服务器安全组或者防火墙需要开放80和443端口。 server {#SSL 默认访问端口号为 443listen 443 ssl; #请填写绑定证书的域名server_name c…

RabbitMQ的DLX(Dead-Letter-Exchange 死信交换机,死信交换器,死信邮箱)(重要)

RabbitMQ的DLX 1、RabbitMQ死信队列2、代码示例2.1、队列过期2.1.1、配置类RabbitConfig&#xff08;关键代码&#xff09;2.1.2、业务类MessageService2.1.3、配置文件application.yml2.1.4、启动类2.1.5、配置文件2.1.6、测试 2.2、消息过期2.2.1、配置类RabbitConfig2.2.2、…

陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解

时下&#xff0c;开发一款功能全面、用户体验良好的陪诊问诊APP成为了医疗行业的一大热点。本文将结合互联网医院系统源码&#xff0c;详细解析陪诊问诊APP的开发过程&#xff0c;为开发者提供实用的开发方案与技术指导。 一、陪诊问诊APP的背景与功能需求 陪诊问诊APP核心目…

FreeRTOS 21:递归互斥信号量

递归信号量&#xff0c;见文知义&#xff0c;递归嘛&#xff0c;就是可以重复获取调用的&#xff0c;本来按照信号量的特性&#xff0c;每获取一次可用信号量个数就会减少一个&#xff0c;但是递归则然&#xff0c; 对于已经获取递归互斥量的 任务可以重复获取该递归互斥量&…

算法|牛客网华为机试41-52C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试21-30C 文章目录 HJ41 称砝码HJ42 学英语HJ43 迷宫问题HJ44 SudokuHJ45 名字的漂亮度HJ46 截取字符串HJ48 从单向链表中删除指定值的节点HJ50 四则运算HJ51 输出单向链表中倒数第k个结点HJ52 计算字符串的编辑距离 HJ41 称砝…

mysql5安全审计

安装插件 插件需要严格与数据库版本适配&#xff0c;不然安装过程中会出现问题 解压插件 cd 插件所在路径unzip audit-plugin-mysql-5.7-1.1.7-921-linux-x86_64.zip#查看mysql默认插件目录 mysql> SHOW GLOBAL VARIABLES LIKE plugin_dir;# 将插件移动到mysql默认插件目…

MySQL 安装与配置

MySQL 安装与配置 MySQL 安装 MySQL 一般分为社区版和商业版&#xff0c;我们使用的是社区版&#xff08;因为免费&#xff09;。MySQL 安装的教程在网上有很多&#xff0c;此处就不再进行进行赘述&#xff0c;这里推荐两篇文章&#xff1a;如何在 Windows11 中安装 MySQL 8.…

Flink安装和Flink CDC实现数据同步

一&#xff0c;Flink 和Flink CDC 1&#xff0c; Flink Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 中文文档 Apache Flink Documentation | Apache Flink 官方文档 &#xff1a;https://flink.apache.org Flink 中文社区…

车机版 Android Audio 框架笔记

车机版Android Audio 框架涉及的知识点很多&#xff0c;在工作中涉及的功能板块也及其繁杂&#xff0c;后面我会根据工作中的一些实际遇到的实例&#xff0c;逐步拆解 Android Audio的知识点&#xff0c;这里从网上整理了一些思维导图&#xff0c;可以做为未来的一个研究方向&a…

ubuntu 22.04 镜像源更换

双11抢了个云服务器&#xff0c;想要整点东西玩玩&#xff0c;没想到刚上来就不太顺利 使用sudo apt update更新软件&#xff0c;然后发生了如下报错 W: Failed to fetch http://mirrors.jdcloudcs.com/ubuntu/dists/jammy/InRelease 理所当然想到可能是镜像源连接不是很好&…

浅谈Agent

目录 什么是大模型 Agent &#xff1f; 大模型Agent 有哪些部分组成? 规划&#xff08;Planning&#xff09; Planning类型 不依赖反馈的计划 基于反馈的计划 拆解子目标和任务分解方法 COT TOT GOT LLMP 反思和完善 ReAct(融合推理与执行的能力) Reflexion(动态…

NAT网络工作原理和NAT类型

NAT基本工作流程 通常情况下&#xff0c;某个局域网中&#xff0c;只有路由器的ip是公网的&#xff0c;局域网中的设备都是内网ip&#xff0c;内网ip不具备直接与外部应用通信的能力。 处于内网的设备如何借助NAT来实现访问外网的应用&#xff1f; 对于开启了NAT功能的局域网…