You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte中如何利用派生存储的旧值计算最大/最小值

在Svelte派生存储中获取旧值的实现方法

要在派生存储(derived store)中获取上一次的计算值,Svelte没有直接提供内置API,但可以通过以下两种常用方式实现:

方法一:利用闭包保存历史状态

在派生存储外部定义变量,通过闭包保留上一次的生成结果,每次更新派生存储时基于该变量计算新值:

import { writable, derived } from 'svelte/store';

const base_values = writable({ x: 0, y: 0 });

// 初始化历史状态,与派生存储返回结构一致
let previousGenerated = { a: 0, b: 0, min_a: 0, max_a: 0, min_b: 0, max_b: 0 };

const generated_values = derived(base_values, (changed_values) => {
  const a = Math.sin(changed_values.x);
  const b = Math.cos(changed_values.y);

  // 基于历史值计算新的min/max
  const min_a = Math.min(a, previousGenerated.a);
  const max_a = Math.max(a, previousGenerated.a);
  const min_b = Math.min(b, previousGenerated.b);
  const max_b = Math.max(b, previousGenerated.b);

  // 更新历史状态为当前值
  previousGenerated = { a, b, min_a, min_b, max_a, max_b };

  return { a, b, min_a, min_b, max_a, max_b };
});

方法二:自定义存储实现灵活状态管理

创建自定义存储,订阅base store的变化,利用update方法直接获取当前存储的旧值进行计算:

import { writable } from 'svelte/store';

const base_values = writable({ x: 0, y: 0 });

function createGeneratedStore(baseStore) {
  // 初始化自定义存储的初始状态
  const { subscribe, update } = writable({
    a: 0, b: 0, min_a: 0, max_a: 0, min_b: 0, max_b: 0
  });

  // 订阅base store的变化,触发更新逻辑
  const unsubscribe = baseStore.subscribe(({ x, y }) => {
    update(currentState => {
      const a = Math.sin(x);
      const b = Math.cos(y);

      return {
        a,
        b,
        min_a: Math.min(a, currentState.a),
        max_a: Math.max(a, currentState.a),
        min_b: Math.min(b, currentState.b),
        max_b: Math.max(b, currentState.b)
      };
    });
  });

  // 返回自定义存储,包含订阅和取消订阅方法
  return {
    subscribe,
    unsubscribe
  };
}

const generated_values = createGeneratedStore(base_values);

注意事项

  • 闭包方式需确保previousGenerated的初始值符合第一次计算逻辑,避免出现错误的初始min/max。
  • 自定义存储更适合复杂状态管理场景,非组件环境使用时,记得在不需要时调用unsubscribe清理订阅,防止内存泄漏。

内容的提问来源于stack exchange,提问作者user9559682

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:27:23