我正在尝试设置一个在 TypeScript 中使用上下文的组件。当我尝试运行它时,出现以下错误
TypeError: Cannot destructure property 'registerItem' of '__vite_ssr_import_1__.getContext(...)' as it is undefined.
at carouselItem.svelte:16:24
at Object.$$render (C:\...\node_modules\svelte\internal\index.js:1380:22)
at Object.default (/src/lib/Header/header.svelte:108:109)
at eval (/src/lib/Carousel/carousel.svelte:63:68)
at Object.$$render (C:\...\node_modules\svelte\internal\index.js:1380:22)
at eval (/src/lib/Header/header.svelte:107:165)
at Object.$$render (C:\...\node_modules\svelte\internal\index.js:1380:22)
at eval (C:\...\src\routes\__layout.svelte:24:94)
at Object.$$render (C:\...\node_modules\svelte\internal\index.js:1380:22)
at root.svelte:36:44
我一直在关注文档中的示例,所以我不确定我哪里出错了。我觉得我可能犯了一个愚蠢的错误,但无论哪种方式,任何帮助都会受到赞赏。
这是我一直试图运行的
carousel.svelte
<script context="module" lang="ts">
export const carouselContext = {}
export type CarouselContext = {
registerItem: (item: CarouselItem) => void
prevItem: Writable<CarouselItem> | null
activeItems: Writable<CarouselItem[]> | null
nextItem: Writable<CarouselItem> | null
}
</script>
<script lang="ts">
import { setContext, onDestroy } from 'svelte'
import { Writable, writable } from 'svelte/store'
import type { CarouselItem } from './carouselItem.svelte'
export const loop = true
export const visibleItems = 1
export let index = 0 // The first of the visible items
const carouselItems: CarouselItem[] = []
const prevItem: Writable<CarouselItem | null> = writable(null)
const activeItems: Writable<CarouselItem[] | null> = writable(null)
const nextItem: Writable<CarouselItem | null> = writable(null)
const computedIndex = (i: number) => ...
function updateVisible(i: number) {
...
}
setContext<CarouselContext>(carouselContext, {
registerItem: (item: CarouselItem) => {
...
},
prevItem,
activeItems,
nextItem,
})
$: updateVisible(index)
</script>
<div class="carousel">
<slot></slot>
</div>
carouselItem.svelte
<script lang="ts" context="module">
export type CarouselItem = {
...
}
</script>
<script lang="ts">
import { getContext } from 'svelte'
import carouselContext, { CarouselContext } from './carousel.svelte'
let isPrev = false
let isActive = false
let isNext = false
let ref
const { registerItem, prevItem, activeItems, nextItem } = getContext<CarouselContext>(carouselContext)
const thisItem: CarouselItem = {
...
}
registerItem(thisItem)
prevItem.subscribe(value => isPrev = value === thisItem)
activeItems.subscribe(value => isActive = value.indexOf(thisItem) !== -1)
nextItem.subscribe(value => isNext = value === thisItem)
$: isRendered = isPrev || isActive || isNext
</script>
{#if isRendered}
<div class="carousel-item">
<slot></slot>
</div>
{/if}