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

Svelte中如何基于另一个Store更新Writable Store(轮播场景)

问题解决:Svelte轮播Store索引更新错误

错误原因

你遇到的Property 'length' does not exist on type 'Readable<{}[]>'错误,核心原因是**slides是Readable类型的Store对象,不是直接的数组**——你不能直接通过slides.length访问数组长度,必须先获取Store内部的实际数组值。另外你的currentSlide推导Store也有小错误:$slides本身就是你存储的数组,不需要再访问.slides属性。

修正方案

1. 导入get函数

首先确保从svelte/store导入get工具函数,它可以同步获取Store的当前值:

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

2. 修正nextSlide和previousSlide函数

在更新索引时,先用get(slides)获取实际的幻灯片数组,再计算长度:

function nextSlide() {
  slideIndex.update((currentIndex) => {
    const slidesArr = get(slides);
    const isLast = currentIndex === slidesArr.length - 1;
    return isLast ? 0 : currentIndex + 1;
  });
}

function previousSlide() {
  slideIndex.update((currentIndex) => {
    const slidesArr = get(slides);
    const isFirst = currentIndex === 0;
    return isFirst ? slidesArr.length - 1 : currentIndex - 1;
  });
}

3. 修正currentSlide推导Store

derived函数的回调参数会自动解包Store的值,$slides就是你初始化时传入的数组,直接用它访问对应索引的幻灯片即可:

const currentSlide = derived(
  [slides, slideIndex],
  ([$slides, $slideIndex]) => {
    return $slides[$slideIndex];
  }
);

额外说明

如果你的slides Store后续会异步更新(比如从接口获取数据),get(slides)仍然能正确获取最新的数组值,因为它会读取Store当前的状态快照。这种同步获取的方式非常适合按钮点击这类同步触发的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:10:02