TinyBase 基础教程:监听 Store 数据变化

TinyBase 基础教程:监听 Store 数据变化

tinybase The reactive data store for local‑first apps. tinybase 项目地址: https://gitcode.com/gh_mirrors/ti/tinybase

前言

在现代前端开发中,状态管理是一个核心概念。TinyBase 作为一个轻量级的状态管理库,提供了简洁而强大的 API 来管理应用状态。本文将深入探讨 TinyBase 中如何监听 Store 数据变化,这是构建响应式应用的关键技术。

监听器基础概念

在 TinyBase 中,监听器(Listener)是一种回调函数,当 Store 中的数据发生变化时会被自动调用。TinyBase 提供了层级分明的监听机制,可以监听从整个 Store 到单个 Cell 的各种粒度变化。

监听器类型概览

TinyBase 提供了多种监听器类型,覆盖了数据结构的各个层级:

键值对数据监听:

  • addValuesListener - 监听整个键值对集合
  • addValueIdsListener - 监听键集合变化
  • addValueListener - 监听单个键值变化

表格数据监听:

  • addTablesListener - 监听所有表格变化
  • addTableIdsListener - 监听表格ID集合变化
  • addTableListener - 监听单个表格变化
  • addTableCellIdsListener - 监听表格中所有Cell ID变化
  • addRowIdsListener - 监听行ID集合变化
  • addSortedRowIdsListener - 监听排序后的行ID集合变化
  • addRowListener - 监听单行变化
  • addCellIdsListener - 监听Cell ID集合变化
  • addCellListener - 监听单个Cell变化

此外,还有专门监听无效数据写入的监听器:

  • addInvalidValueListener - 监听无效键值写入
  • addInvalidCellListener - 监听无效Cell写入

监听器使用示例

基本监听示例

让我们从一个简单的例子开始,展示如何监听整个表格数据的变化:

import {createStore} from 'tinybase';

// 创建Store并初始化数据
const store = createStore().setTables({
  pets: {fido: {species: 'dog'}},
  species: {dog: {price: 5}},
});

// 添加表格监听器
const listenerId = store.addTablesListener(() => {
  console.log('表格数据发生了变化!');
});

// 修改数据会触发监听器
store.setCell('species', 'dog', 'price', 6);
// 控制台输出: '表格数据发生了变化!'

监听器触发条件

需要注意的是,监听器只有在数据实际发生变化时才会触发。如果设置的值与当前值相同,监听器不会被调用:

store.setCell('pets', 'fido', 'species', 'dog');
// 数据没有实际变化,监听器不会被调用

监听器清理

每个监听器注册后会返回一个ID,用于后续的监听器移除:

// 移除监听器
store.delListener(listenerId);

store.setCell('species', 'dog', 'price', 7);
// 监听器已被移除,不会触发

良好的编程习惯是及时清理不再需要的监听器,避免内存泄漏。

监听器参数详解

监听器回调函数可以接收多个参数,提供关于变化的详细信息:

const listenerId2 = store.addTablesListener((store, getCellChange) => {
  const change = getCellChange('species', 'dog', 'price');
  console.log('Cell变化详情:', change);
});

store.setCell('species', 'dog', 'price', 8);
// 输出: [true, 7, 8] 
// 表示: [是否变化, 旧值, 新值]

store.delListener(listenerId2);

行级监听示例

更细粒度的监听可以获取到变化的上下文信息:

const listenerId3 = store.addRowListener(
  'pets',
  'fido',
  (store, tableId, rowId) => {
    console.log(`${rowId}行在${tableId}表中发生了变化`);
  }
);

store.setCell('pets', 'fido', 'color', 'brown');
// 输出: 'fido行在pets表中发生了变化'

store.delListener(listenerId3);

通配符监听器

TinyBase 支持通配符监听器,可以监听某一层级的所有变化:

// 监听pets表中任何行的变化
const listenerId4 = store.addRowListener('pets', null, (store, tableId, rowId) => {
  console.log(`${rowId}行在${tableId}表中发生了变化`);
});

store.setCell('pets', 'fido', 'color', 'black');
// 输出: 'fido行在pets表中发生了变化'

store.delListener(listenerId4);

最佳实践

  1. 合理选择监听粒度:根据需求选择最合适的监听级别,避免过度监听带来的性能开销。

  2. 及时清理监听器:不再需要的监听器应及时移除,防止内存泄漏。

  3. 避免在监听器中修改数据:默认情况下,监听器内部不能修改Store数据,这可能导致意外行为。

  4. 利用监听器参数:充分利用监听器提供的参数获取变化详情,减少不必要的Store查询。

总结

TinyBase 提供了强大而灵活的监听机制,使开发者能够精确响应数据变化。通过理解不同层级的监听器及其参数,可以构建高效、响应式的应用程序。记住根据实际需求选择合适的监听粒度,并遵循最佳实践来确保应用性能。

在后续学习中,可以进一步探索如何在监听器中安全地修改数据,以及如何结合Schema使用监听器等高级主题。

tinybase The reactive data store for local‑first apps. tinybase 项目地址: https://gitcode.com/gh_mirrors/ti/tinybase

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

包力文Hardy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值