在 Svelte 中与符文类共享符文

在 svelte 中与符文类共享符文

我通常避免在 TypeScript 代码中使用类,倾向于使用函数以简化代码,并利用 tree shaking 的优势避免引入不必要的类方法。

然而,Rich Harris 建议在某些情况下使用符文类可以提高性能,因为它们无需使用 get 和 set 方法或中间 $state 变量来管理状态,从而直接操作状态。

可共享符文

我们需要一个可共享的符文类,这需要用到 Svelte 的上下文机制。

// rune.svelte.tsimport { get, has, set } from 'svelte';type RCurrent = { current: TValue };export class Rune {    readonly #key: symbol;    constructor(name: string) {        this.#key = Symbol(name);    }    exists(): boolean {        return has(this.#key);    }    get(): RCurrent {        return get(this.#key);    }    init(value: TRune): RCurrent {        const _value = { current: value };        return set(this.#key, _value);    }    update(getter: () => TRune): void {        const context = this.get();        // 使用 $effect 或类似的响应式机制        // ...  (此处需要根据实际的响应式机制进行调整) ...    }}

登录后复制

我们可以导出自定义符文到其他组件中使用。

// counter.svelte.tsimport { Rune } from './rune.svelte';export const counter = new Rune('counter');

登录后复制

这是共享状态的一种方法,它与服务器端渲染兼容(详见之前的讨论)。 需要注意的是,我们需要为每个共享状态变量赋予一个唯一的名称。

初始化

状态的初始化,如同其他上下文一样,应该在父组件中进行,并且只初始化一次。

    import { counter } from '$lib/counter.svelte';    const count = counter.init(0);

登录后复制

在子组件中读取

子组件可以安全地读取状态:

    import { counter } from '$lib/counter.svelte';    const count = counter.get();

子组件:{count.current}

登录后复制

响应式更新

更新共享状态需要通过一个函数来实现响应式更新:

    import { counter } from '$lib/counter.svelte';    let value = 0; // 或者其他响应式变量    counter.update(() => value);

登录后复制

这使得更新具有响应性。我们可以传入任何响应式变量,它会像 $derived 一样更新。

直接更新

当然,也可以直接更新:

    import { counter } from '$lib/counter.svelte';    const count = counter.get();    count.current = 9;

登录后复制代码仓库演示

希望这些信息对您有所帮助。

以上就是在 Svelte 中与符文类共享符文的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2642628.html

(0)
上一篇 2025年3月7日 06:51:51
下一篇 2025年2月23日 19:20:13

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 从挑战到创造:使用 AWS 和 React 构建博客文章生成器

    免责声明: 本文基于一个项目生成。我仔细检查了所有生成内容,确保其逻辑清晰,与人工撰写方式无显著差异。出于项目目的,我未对 AI 生成内容进行编辑。如有补充说明,会在相应部分标注。 作为一名不断挑战自我的软件工程师,我最近完成了一个融合多项…

    2025年3月7日
    200
  • 开发人员如何使电动汽车充电器能够与移动应用程序通信

    在电动汽车 (ev) 世界中,电动汽车驾驶员最神奇的体验之一就是在移动应用程序上点击“开始”并看到充电器开始工作。 但是这个魔法是如何发生的呢? 让我们深入了解电动汽车充电器和移动应用程序如何通信的幕后旅程。 游戏中的玩家 移动应用程序:这…

    2025年3月7日 编程技术
    200
  • 优化动态网站的移动性能和媒体加载

    提升动态网站的移动端性能和用户体验,尤其是在处理大量媒体内容(图片、视频、交互元素)方面,是一个持续的挑战。虽然在桌面浏览器上表现良好,但移动设备和低速网络环境下的加载速度仍有显著提升空间。高分辨率图像和视频的加载时间过长,以及页面中大量交…

    2025年3月7日
    200
  • 了解软件测试中的语句覆盖率

    软件测试中的语句覆盖率:确保代码完整性 语句覆盖率是衡量软件测试完整性的基础指标,它表示已执行代码语句占总可执行语句的比例。 理解并有效利用语句覆盖率对于开发人员和测试人员至关重要,它能帮助识别未测试代码,降低缺陷风险,最终提升软件质量。 …

    2025年3月7日
    200
  • Diff JSON:简化 JSON 比较

    在 Web 开发中,JSON (JavaScript 对象表示法) 随处可见,但比对 JSON 对象却常常让人头疼,特别是面对嵌套复杂或数据量庞大的情况。本文将深入探讨 JSON 差异比对的意义、重要性,并讲解如何借助工具、库和最佳实践高效…

    2025年3月7日
    200
  • 值得关注的 CMS 趋势

    内容管理系统 (cms) 诞生至今已有二十余年,其发展始终紧跟互联网的步伐,不断满足人们对便捷建站和高效更新内容日益增长的需求。20世纪90年代中期,interwelt和filenet等专有系统曾引领风潮,但进入21世纪初,wordpres…

    2025年3月7日
    200
  • React 项目和状态管理

    每个应用的核心功能在于管理、存储和操作其内部创建或从外部来源获取的数据。 这些数据可以是变量、对象、布尔值等多种形式,涵盖目标编程语言支持的任何数据类型。应用必须能够以任何所需方式存储、修改和使用这些数据。 React是一个基于组件结构的知…

    2025年3月7日
    200
  • Java 脚本中的运算符 ?=

    JavaScript 的安全赋值运算符 ?= 简化了代码中的错误处理,提升了代码的可读性和可维护性,尤其在处理 try-catch 块时非常有效。 ?= 运算符的功能 ?= 运算符检查操作或函数的执行结果。成功则返回结果;失败则返回错误信息…

    2025年3月7日
    200
  • 快速反应选框

    使用React Fast Marquee构建流畅的滚动选框 本文介绍一个高效创建平滑滚动选框的react组件库——react fast marquee。该库易于集成,并与next.js兼容。 安装 安装过程非常简单: npm install…

    2025年3月7日
    200
  • 使用 App Router 和路由组管理 Nextjs 中的多个布局

    Next.js 13 的 App Router 引入了诸多令人兴奋的新特性,例如布局、错误边界和加载指示器。然而,管理同一路由级别上的多个布局可能会带来挑战。本文将介绍一种构建和维护整洁、高效布局的最佳实践。 步骤一:创建根布局(可选) 根…

    2025年3月7日
    200

发表回复

登录后才能评论