Svelte状态管理——svelte/store模块的使用

news2024/12/23 0:39:22

目录

前言

一、项目中使用示例

1. 创建全局状态

2. 在组件中使用全局状态

3. 便捷使用技巧$

二、api介绍

1. writable

2. readable

3. derived


前言

在 Svelte 中,可以使用其自带的svelte/store模块来管理全局的应用程序状态,该模块导出用于创建可读、可写和派生存储的函数。该库提供了如 writablereadable 等函数,用于创建可写和只读的全局状态。

一、项目中使用示例

先举一个例子对store的使用有个整体感觉,下面再具体讲解各api函数。

1. 创建全局状态

比如创建一个count.js

import { writable } from 'svelte/store';

export const count = writable(0);

2. 在组件中使用全局状态

比如在Counter.svelte组件里使用

<script lang="ts">
  import { count } from '$lib/stores/count';

  let currentCount: number;

  count.subscribe(value => {
    currentCount = value;
  });

  function increment() {
    count.update(n => n + 1);
  }

  function decrement() {
    count.update(n => n - 1);
  }
</script>

<h1>Count: {currentCount}</h1>
<button on:click={increment}>Increment</button>
<button on:click={decrement}>Decrement</button>

页面:

总结:

可以看到svelte/store模块的使用非常简单:在调用方法waritable储存数据后,在需要使用的组件去订阅它

3. 便捷使用技巧$

刚才例子可以顺利运行,但是有个问题:数据已订阅(subscribe),但从未取消订阅。如果组件被多次实例化和销毁,就会导致内存泄漏。

所以应该取消订阅:

<script lang="ts">
  // 新增
  import { onDestroy } from 'svelte';
  import { count } from '$lib/stores/count';

  let currentCount: number;

  // 修改
  const unsubscribe = count.subscribe(value => {
    currentCount = value;
  });

  function increment() {
    count.update(n => n + 1);
  }

  function decrement() {
    count.update(n => n - 1);
  }

  // 新增
  onDestroy(unsubscribe);
</script>

<h1>Count: {currentCount}</h1>
<button on:click={increment}>Increment</button>
<button on:click={decrement}>Decrement</button>

不过如果每次使用都去取消订阅(通过unsubscribe)就很麻烦,于是Svelte有一个技巧——可以通过在store名称前加上 $ 来引用store的值:

<script lang="ts">
  import { count } from '$lib/stores/count';

  function increment() {
    $count + 1
  }

  function decrement() {
    $count - 1
  }
</script>

<h1>Count: {$count}</h1>
<button on:click={increment}>Increment</button>
<button on:click={decrement}>Decrement</button>

是不是非常清爽了!项目开发时推荐这种写法!

二、api介绍

1. writable

writable(initialValue, start = () => {}, { subscribe, set, update })

作用:

创建一个存储的函数,该存储具有可以从“外部”组件设置的值(不是必须要在store.js里面修改值,可以对比VueX必须在文件里面进行修改,组件不能修改理解)。因为它被创建就具有附加 set 和 update 方法的对象。

参数:

  • initialValue:状态的初始值。
  • start:一个可选的回调函数,在订阅状态时立即执行。

返回的对象具有以下方法:

  • subscribe:订阅状态的变化。
  • set(value):设置状态的值为指定值。
  • update(updater):根据当前状态的值进行更新操作。
import { writable } from 'svelte/store';

// 创建一个可写状态
export const count = writable(0);

// 在组件中使用可写状态
count.set(10); // 设置状态的值为 10

count.update(n => n + 1); // 根据当前状态的值进行更新操作

注意:实际开发中,可以使用set或者update函数去修改状态,也可以通过$符像上面的例子一样直接修改。

2. readable

readable(initialValue, start = () => {}, options = {})

作用:

创建一个只读状态,其值不能从“外部”设置

参数:

  • initialValue:状态的初始值。
  • start:一个可选的回调函数,在订阅状态时立即执行。
  • options:可选的配置对象。

返回的对象具有以下方法:

  • subscribe:订阅状态的变化。
import { readable } from 'svelte/store';

// 创建一个只读状态
export const currentTime = readable(new Date(), function start(set) {
  const interval = setInterval(() => {
    set(new Date());
  }, 1000);

  return function stop() {
    clearInterval(interval);
  };
});

// 在组件中使用只读状态
const unsubscribe = currentTime.subscribe(value => {
  console.log(value); // 订阅状态的变化并打印新值
});

unsubscribe(); // 停止订阅

3. derived

derived(dependencies, callback, initial_value = undefined)

作用:

基于其他状态派生出新的状态,然后在存储依赖项发生更改时运行。

参数:

  • dependencies:一个或多个状态或派生状态的数组,作为回调函数的依赖。
  • callback:一个回调函数,根据依赖的状态计算派生状态的值。
  • initial_value:可选的初始值,在无法立即计算派生状态时使用。

返回的对象具有以下方法:

  • subscribe:订阅派生状态的变化。
import { writable, derived } from 'svelte/store';

// 创建一个可写状态
export const count = writable(0);

// 创建一个派生状态
export const isEven = derived(count, $count => $count % 2 === 0);

// 在组件中使用派生状态
const unsubscribe = isEven.subscribe(value => {
  console.log(value); // 订阅派生状态的变化并打印新值
});

unsubscribe(); // 停止订阅

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

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

相关文章

大出所料,9月1号前上线的小游戏却收到了补充备案材料的通知

引言 前阵子工信部发布了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;为此&#xff0c;微信公众平台ICP代备案管理系统提供新增备案、变更备案、注销备案等服务&#xff0c;协助开发者更好更方便地完成微信小程序备案&#xff0c;届时所有9月1号后…

HTML 标签讲解

HTML 标签讲解 HTML 语言结构根元素元数据元素主体根元素大纲元素文本内容语义化内联文本图像与多媒体编辑标识table表格内容表单内容table表单 HTML 语言结构 Markup &#xff08;标记、标签&#xff09;用来容纳和描述内容 严格意义上&#xff0c;标签是指开始标签&#xf…

PMC在制造企业中发挥哪些价值?

导 读 ( 文/ 2127 ) PMC(生产计划与物料控制)是制造企业运行的核心&#xff0c;PMC的好坏可以直接影响客户的需求交付、生产进行的顺利与否、库存资金的占用、企业效率的提升等&#xff0c;在制造企业中起着关键的作用。它负责将生产计划转化为实际的生产活动&#xff0c;并确保…

Mavan进阶之多模块(聚合)

文章目录 Maven 多模块&#xff08;聚合&#xff09;非父子关系的多模块项目 Maven 多模块&#xff08;聚合&#xff09; Maven 继承和聚合是 2 个独立的概念。工程与工程之间可能毫无关系&#xff0c;也可能是继承关系&#xff0c;也可能是聚合关系&#xff0c;也可能既是继承…

QT数据库,实现数据库增删改查

QT关于数据库的相关概念 QT将数据库分为三个层次&#xff1a; 数据库驱动层&#xff1a;QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin sql接口层&#xff1a;QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError 用户接口层&#xff1a;提供一些模…

算法训练 第一周

一、合并两个有序数组 本题给出了两个整数数组nums1和nums2&#xff0c;这两个数组均是非递减排列&#xff0c;要求我们将这两个数组合并成一个非递减排列的数组。题目中还要求我们把合并完的数组存储在nums1中&#xff0c;并且为了存储两个数组中全部的数据&#xff0c;nums1中…

创建具有管理员权限的快捷方式

参考 https://zhidao.baidu.com/question/86334639.html

【AI】机器学习——绪论

文章目录 1.1 机器学习概念1.1.1 定义统计机器学习与数据挖掘区别机器学习前提 1.1.2 术语1.1.3 特点以数据为研究对象目标方法——基于数据构建模型SML三要素SML步骤 1.2 分类1.2.1 参数化/非参数化方法1.2.2 按算法分类1.2.3 按模型分类概率模型非概率模型逻辑斯蒂回归 1.2.4…

CRM 自动化如何改善销售和客户服务?

许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程&#xff0c;使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程&#xff0c;让团队有更多的时间来执行高价值的任务&#xff0c;而不是陷于一堆琐碎事情中。 什么是CRM自动化&#xff1f; CRM 自动化是指 C…

SD卡中了蠕虫病毒怎么办?清除病毒以及数据恢复方法

蠕虫病毒是近年来非常流行的病毒之一&#xff0c;它主要通过U盘、网络等途径进行传播。如果你的SD卡不幸感染了蠕虫病毒&#xff0c;可能会导致数据丢失。那么&#xff0c;如何进行数据恢复呢&#xff1f;同时&#xff0c;当SD卡中感染了蠕虫病毒时&#xff0c;我们应该采取什么…

Java“牵手”阿里巴巴商品详情数据,阿里巴巴商品详情API接口,阿里巴巴国际站API接口申请指南

阿里巴巴平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取阿里巴巴商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xf…

第8篇:ESP32连接超声波HC-SR04测距点亮LED无源喇叭播放声音

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloworld第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播放音乐《涛声…

【java基础复习】如何理解java中基本数据类型里的自动类型提升和强制类型转换?

自动类型提升强制类型转换注意事项 ❗感谢 &#x1f496; Java是一种强类型语言&#xff0c;这意味着在编写代码时&#xff0c;需要明确指定每个变量的数据类型。我们知道&#xff0c;java中有八大基本数据类型。分别是&#xff1a; 数据类型大小&#xff08;字节数&#xff0…

2024年java面试--多线程(4)

系列文章目录 2024年java面试&#xff08;一&#xff09;–spring篇2024年java面试&#xff08;二&#xff09;–spring篇2024年java面试&#xff08;三&#xff09;–spring篇2024年java面试&#xff08;四&#xff09;–spring篇2024年java面试–集合篇2024年java面试–redi…

BCSP-玄子Share-Java框基础_双系统Redis安装与基础语法

四、Redis 4.1 Redis 简介 Redis 是开源、高性能的key-value数据库&#xff0c;属于 NoSQL 数据库 NoSQL 数据库与关系型数据库 关系型数据库&#xff1a;采用关系模型来组织数据&#xff0c;主要用于存储格式化的数据结构NoSQL 数据库&#xff1a;泛指非关系型数据库&…

力扣|找出和所对应的两数的下标

从零开始刷力扣&#xff08;bushi 题目放在这&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

数电发票开票接口

全电发票&#xff0c;也叫数电发票&#xff0c;全称为全面数字化的电子发票。数电发票是依托可信身份体系和电子发票服务平台&#xff1b;以去介质、去版式、标签化、要素化、授信制、赋码制为基本特征&#xff1b;覆盖全领域、全环节、全要素的全新发票。与纸质发票具有同等法…

tkinter控件样式

文章目录 以按钮为例共有参数动态属性 tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框&#x1f48e;文件对话框&#x1f48e;控件样式扫雷小游戏&#x1f48e;强行表白神器 以按钮为例 tkinter对控件的诸…

05-Redis

1、Redis为什么快&#xff1f; 1、纯内存操作 2、单线程可以省去多线程时CPU上下文会切换的时间 3、渐进式ReHash、缓存时间戳 数组需要扩容的时候&#xff0c;他会维护两张hash表&#xff0c;比如第一张的数组长度为6&#xff0c;另一张的数组长度为12&#xff0c;在set和g…

JavaScript中的事件循环(event loop)机制

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 调用栈&#xff08;Call Stack&#xff09;⭐ 消息队列&#xff08;Message Queue&#xff09;⭐ 事件循环&#xff08;Event Loop&#xff09;⭐ 宏任务和微任务⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇…