Svelte 5 中的“助手”变量

svelte 5 中的“助手”变量

再见神奇 svelte 4 $:

在我最近发布 svelte 5 迁移的经验和注意事项之后,我想重点介绍从 svelte 4 迁移到 svelte 5 时的一些技巧和心态的变化。

svelte 4 使用“神奇的”$: 并让和完成所有繁重的工作以使代码具有反应性。我们还接受了变量重新分配,例如

let arr = [1, 2, 3]let value = 4arr = [...arr, value]

而不是更新/改变变量的方法,如推送等

我很惊讶能够使用 svelte 5 重新学习好的旧 js 模式。

无需一直保持反应

而且我可能也被 svelte 4 中的 let 宠坏了,没有考虑反应性,如果需要的话它会被包含在内。 但并非所有变量都必须是反应性的。非反应性变量也可以在反应性甚至“传统变异代码”中更新。反应式变量的真正需要是当我们在 ui 中使用它时(当这个变量在 html/页面中呈现并且我们需要它稍后更新时)。

您可能会在 svelte 5 中遇到错误,例如无法分配给派生状态,在其自己的范围内引用的状态永远不会更新。您的意思是在闭包内引用它吗?或衍生_引用_selfn如果使用 svelte 4 编码风格,则派生值无法递归引用自身。

辅助变量的示例

看一下这个 svelte 4 风格的代码示例:

    let value;    let derivedarr = []    $: if (value) {        derivedarr = [...derivedarr, value]    }    function random () {        value = math.floor(1 + math.random() * 10)    }

value: {value}

SuperCms在线订餐系统
SuperCms在线订餐系统

模板采用响应式设计,自动适应手机,电脑及平板显示;满足单一店铺外卖需求。功能:1.菜单分类管理2.菜品管理:菜品增加,删除,修改3.订单管理4.友情链接管理5.数据库备份6.文章模块:如:促销活动,帮助中心7.单页模块:如:企业信息,关于我们更强大的功能在开发中……安装方法:上传到网站根目录,运行http://www.***.com/install 自动

SuperCms在线订餐系统 0
查看详情 SuperCms在线订餐系统

derivedarr: {derivedarr}

演示

我们有两个反应变量,svelte 4 自动解决更新问题。我们只需要记住正确的方法是重新分配变量。

在 svelte 5 中,我们应该思考如何实现相同的结果。我们使用的两个变量还不够,我们还需要一个,即辅助变量。

首选方法是使用 $driven() 符文。

    let value = $state();    let helperarr = [];    let derivedarr = $derived.by(() => {      if (value) {                helperarr.push(value);                return helperarr;        }    });    function random () {        value = math.floor(1 + math.random() * 10)    }

value: {value}

derivedarr: {derivedarr}

演示

如果您知道更简单的方法,请告诉我。

还有一个 $effect() 符文方法可以实现相同的效果。它可能看起来更简单,但我们应该尽可能避免效果(主要是 svetlet 5 效果不在服务器/ssr 上运行)。

    let value = $state();    let helperarr = []    let effectarr = $derived(helperarr);    $effect.pre(() => {            if (value) {              helperarr.push(value)            }        })    function random () {        value = math.floor(1 + math.random() * 10)    }

value: {value}

effectarr: {effectarr}

演示

现实生活中的例子

这是我尝试将 svelte 4 页面直接迁移到 svelte 5 的示例。我花了一段时间重新思考代码。此页面用作帖子搜索,具有“加载更多”功能(如果用户没有 js,则添加结果或分页):

苗条4

    import icon from '../components/icon.svelte';    import { enhance } from '$app/forms';    import { tick } from 'svelte';    export let form;    export let searchinglang;    export let l;    let results = [];    let previoussearch = '';    let searchterm;    let skip;    $: if (!!form && form?.thereismore) {        searchterm = form.searchterm;        skip = number(form?.skip) + 20;    }    $: if (!!form?.searchresultfromaction) {        if (previoussearch == form.searchterm && form.therewasmore) {            results = [...results, ...form.searchresultfromaction];        } else {            results = [...form.searchresultfromaction];            previoussearch = form.searchterm;        }    }    async function intoview(el) {        await tick();        if (el.attributes.index.nodevalue == skip - 20 && skip != undefined) {            el.scrollintoview({ behavior: 'smooth' });        }    }{#if results.length}    
    {#each results as item, index}
  1. {number(index) + 1 + number(form?.skip)}. {item.title}
  2. {/each}
{#if form?.thereismore} {/if}{:else if form?.searchresultfromaction.length == 0} {l.noresultsfound}{/if} @media (scripting: none) { /* users without javascript have calculated order of results within paggination and css disables standard ol ul numberingusers with javascript have standard ol ul numbering and loading more feature */ ol { list-style-type: none; } }

苗条5

    import Icon from '../components/Icon.svelte';    import { enhance } from '$app/forms';    import { tick } from 'svelte';    let { form, searchingLang, l } = $props();    let previousSearch = '';    let skip = $derived.by(() => {        if (!!form && form?.thereIsMore) {            return Number(form?.skip) + 20;        }    });    let helperResultsArr = [];    let results = $derived.by(() => {        if (!!form?.searchResultFromAction) {            if (previousSearch == form.searchTerm && form.thereWasMore) {                helperResultsArr.push(...form.searchResultFromAction);                return helperResultsArr;            } else {                helperResultsArr = [];                helperResultsArr.push(...form.searchResultFromAction);                previousSearch = form.searchTerm;                return helperResultsArr;            }        } else return [];    });    async function intoView(el) {        await tick();        if (el.attributes.index.nodeValue == skip - 20 && skip != undefined) {            el.scrollIntoView({ behavior: 'smooth' });        }    }{#if results.length}    
    {#each results as item, index}
  1. {Number(index) + 1 + Number(form?.skip)}. {item.title}
  2. {/each}
{#if form?.thereIsMore} {/if}{:else if form?.searchResultFromAction.length == 0} {l.noResultsFound}{/if} @media (scripting: none) { /* users without javascript have calculated order of results within paggination and css disables standard ol ul numberingusers with javascript have standard ol ul numbering and loading more feature */ ol { list-style-type: none; } }

现在就这些了。

ps:如果您愿意以不同的方式进行迁移,请随时告诉我。

以上就是Svelte 5 中的“助手”变量的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1496691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 18:49:32
下一篇 2025年12月19日 18:49:51

相关推荐

  • 使用 Nextra 生成文档站点

    在本文中,您将了解如何使用 nextra 生成静态文档站点,我们还提供了一个示例。 使用 nextra,您可以使用 next.js 和 mdx 制作精美的网站。 nextra docs 提供了两种选项,一种用于文档,另一种用于博客。 使用 nextra 手动配置 nextra 很简单。您安装软件包,…

    2025年12月19日
    000
  • 如何解决下拉列表刷新导致数据丢失的问题?

    下拉列表刷新问题解决方案 在提交数据时,下拉列表需要刷新,以免影响数据准确性。但如果您希望在进行操作后保留下拉列表绑定的数据,同时在刷新页面时重新刷新下拉列表,可以使用以下三种方法: 通过页面重定向实现:在进行下拉列表操作后,将其值存储在会话变量中。在刷新页面时,从会话变量中检索该值并重新绑定到下拉…

    2025年12月19日
    000
  • 如何让你的博客像 [https://www.cnblogs.com/two-feb](https://www.cnblogs.com/two-feb) 一样美观?

    如何让博客美观大放送 许多博主都希望自己的博客外观赏心悦目,本篇文章将提供具体方法,指导你像 [https://www.cnblogs.com/two-feb](https://www.cnblogs.com/two-feb) 这类博客一样优化外观。 更改标题样式 添加 css 代码,例如: h1 …

    2025年12月19日
    000
  • JavaScript 的工作原理

    JavaScript 是一种多功能的高级编程语言,主要用于增强网页、创建交互式内容和构建 Web 应用程序。它可以在浏览器环境(客户端)中运行,也可以在服务器端使用,特别是与 Node.js 一起使用。以下是 JavaScript 工作原理的概述: JavaScript 引擎 每个浏览器(如 Chr…

    2025年12月19日
    000
  • 前端测试驱动开发 (TDD)

    测试驱动开发(tdd)因提高代码质量和减少软件开发中的错误而被广泛认可。虽然 tdd 在后端和 api 开发中很常见,但它在前端开发中同样强大。通过在实现功能之前编写测试,前端开发人员可以尽早发现问题,确保一致的用户体验并自信地进行重构。在本文中,我们将在前端开发的背景下探索 tdd,讨论它的好处,…

    2025年12月19日
    000
  • 测试数据生成器:提高软件测试效率

    在软件测试中,测试数据的准确性和一致性对于可靠的结果至关重要。然而,手动创建和管理测试数据非常耗时且经常容易出错,尤其是对于大型应用程序。这就是测试数据生成器派上用场的地方。测试数据生成器自动创建测试所需的数据,节省时间,减少手动错误,并确保测试过程尽可能无缝。这篇文章探讨了什么是测试数据生成器、为…

    2025年12月19日
    000
  • 为什么需要类型保护?探索不同类型及其用例

    为什么需要类型保护?探索不同类型及其用例 在 typescript 中,类型保护 在使代码库更加可靠、对开发人员更友好方面发挥着重要作用。它们通过允许开发人员缩小类型来帮助确保类型安全,这有助于减少运行时错误并使代码更易于理解和维护。 什么是类型保护? 类型保护是对类型执行运行时检查的函数表达式,确…

    2025年12月19日
    000
  • 了解 JavaScript 中的作用域和作用域链

    javascript 开发人员经常会遇到作用域、作用域链、词法环境和不同类型的作用域(全局作用域、函数作用域和局部作用域)等术语。这些概念对于理解变量和函数的行为方式、它们的可访问性以及 javascript 在执行代码时如何找到它们至关重要。在本博客中,我们将分解这些主题,以帮助您掌握 javas…

    2025年12月19日
    000
  • 京东网页的聚光灯和翻页效果是如何实现的?

    揭秘网页聚光灯和翻页效果背后的实现机制 想知道京东网页上的聚光灯和翻页效果是如何实现的吗?今天,让我们来深入剖析它们背后的技术。 聚光灯:css3动画的摇摆魔法 与传统使用js动画不同,京东聚光灯采用的是css3动画实现。通过animation属性,它为聚光灯添加了摇摆效果。具体来说,代码中动画的设…

    2025年12月19日
    000
  • Detailed explanation of Javascript event loop rules

    众所周知,Javacript是单线程语言,但是为什么我们可以使用异步操作呢?因为异步操作是由具有多线程、多进程能力的浏览器执行的。 Javascript始终运行在单线程上,当异步代码被发现时,就会交给浏览器执行,然后浏览器调用相应的线程或进程,包括http请求、GUI、事件触发等来处理这些异步操作.…

    2025年12月19日
    000
  • 在 React 中构建一款可靠的 Pokémon 游戏:开发者的冒险!

    s:单一职责 – 一只神奇宝贝,一份工作 问题:pokemoncomponent 处理捕捉、战斗和显示分数,违反了 srp。 function pokemoncomponent({ pokemon, oncatch, onbattle, score }) { return ( {poke…

    2025年12月19日
    000
  • 页面组件失灵:当 realtyProcessAccount.customer.nature 为空时如何解决?

    页面组件无反应难题解析 网友提出了一个问题,表示页面组件在 certain 条件下才会产生响应。具体来说,当 realtyprocessaccount.customer.nature 不为空时,组件会出现反应;否则,则不会。 潜在解决方案 根据提供的答案,该问题可能是由于在控制器中声明的 realt…

    2025年12月19日
    000
  • 从基础到高级:逐步掌握角度信号

    为什么角度信号很重要:更好应用的初学者指南 angular signals 代表了 angular 应用程序中状态管理和反应性的革命性方法。这份综合指南将引导您了解有关信号所需了解的所有内容,从基本概念到高级实现。 什么是角度信号? 信号是 angular 16+ 中引入的新原语,它提供了一种处理反…

    2025年12月19日 好文分享
    000
  • 如何用 ag-grid 优雅地实现嵌套行表格?

    如何优雅地处理嵌套行的表格 对于需要显示嵌套数据的表格,前端开发者常常会面临处理嵌套行的挑战。本文旨在探讨一个极佳的解决方案——ag-grid。 ag-grid 简介 ag-grid 是一个强大的 javascript 表格库,它提供了广泛的功能,包括支持嵌套行。使用 ag-grid,您可以轻松地创…

    2025年12月19日
    000
  • 将 Jest 添加到Explainerjs

    本周我们应该向我们的 cli 工具添加测试。迄今为止最令人沮丧的事情。 为什么我选择杰斯特 我是 TDD(测试驱动开发)的坚定支持者。几乎每一段代码都应该被测试。在我的合作期间,我一半以上的时间都花在为我的 PR 编写测试上。我相信这段经历确实帮助我理解了测试的必要性。我很惊讶地发现 JS 和 Ru…

    2025年12月19日
    000
  • 您应该随 Web 组件一起发送清单

    除了组件之外,自定义元素清单是您可以在库中提供的最重要的东西。 什么是自定义元素清单 (CEM)? 自定义元素清单是一个架构,旨在记录有关自定义元素/web 组件的元数据,包括属性、属性、方法、事件、槽、css 部分和 css 变量。它获取有关组件的所有信息并将其序列化到项目中的单个 json 文件…

    2025年12月19日
    000
  • 如何打造一个优雅的博客外观?

    博客外观优化指南:实现优雅博客效果 提升博客美观度和用户体验至关重要。为了帮助您优化博客外观,以下是一些步骤: 标题样式: 使用自定义 CSS 更改标题颜色、大小和字体。添加阴影或边框,突出显示标题。使用 Google Fonts 加载非标准字体,为您的标题增添个性。 透明度: 调整背景图片的透明度…

    2025年12月19日
    000
  • 如何轻松创建可扩展的、基于模块的应用程序

    现代应用程序在模块化架构上蓬勃发展,无缝适应不断变化的业务需求。然而,要实现真正的模块化,您需要的不仅仅是独立的组件 – 您需要一种高效方式将它们组合在一起。这意味着控制模块如何加载、以什么顺序加载以及使用哪些依赖项。当您想要关闭系统的某些部分代码中没有任何痕迹(例如 if/else 语…

    2025年12月19日
    000
  • 如何打造更具吸引力的博客外观?

    优化博客外观进阶指南 如何改善博客外观,让它更具吸引力?本文将为你提供具体的指导,从更改标题样式到优化代码字体,打造每个人心中的理想博客外观。 自定义标题样式 自定义标题样式可以提升博客的整体风格。你可以通过 CSS 更改字体大小、颜色和样式。 增加透明度 适当的透明度可以凸显重要元素,同时保持博客…

    2025年12月19日
    000
  • 了解 Angular 组件的基本指南

    angular 组件是 angular 应用程序的基础,提供了一种构建用户界面的模块化、可重用部分的方法。在本指南中,我们将介绍 angular 组件的基础知识,从结构到最佳实践。无论您是 angular 新手还是想复习一下,本文都将使您对 angular 中的组件有一个基本的了解。 什么是角度分量…

    2025年12月19日 好文分享
    000

发表回复

登录后才能评论
关注微信