我如何使用 Svelte 的道具为我正在构建的这个可重复使用的画廊导入数据?
How can I import data using props with Svelte for this reusable gallery I'm building?
我正在使用 Svelte 构建一个可重复使用的图库。所有其他都已完成,但我有多个画廊,所以有多组图像数据,我无法弄清楚如何将图像数据作为道具传递。不管怎样,代码应该能更好地表达我的意思。
我有一个用于图像数据的 .js 文件:
//rocketgallery.js
export const images = [
{
id: 0,
alt: "Zack and Alex arming a rocket.",
src: "img/gallery/rocket1.jpg"
},
{
id: 1,
alt: "Zack and Matt performing parachute testing.",
src: "img/gallery/rocket2.jpg"
}
]
图库组件本身(我只是展示了我想如何导入图像 [这显然不起作用]):
//slidegallery.svelte
export let gallerydata = {gallerydata}
import {images} from gallerydata
和插入画廊的小片段:
//in index.svelte
import Slidegallery from '$lib/components/slidegallery.svelte'
<Slidegallery gallerydata='../data/rocketgallery.js' size='20vw' position='left' display='wrap'/>
<Slidegallery gallerydata='../data/anothergallery.js' size='20vw' position='center' display='block'/>
如您所见,我试图在索引页面的每个图库中指明我想要的图像,并且我的组件正在寻找从指定路径导入图像。我一直坚持这一点,所以任何方向都会有很大的帮助。我不确定我的整个方法是否错误,或者这是否是一个简单的语法问题。不管怎样,先谢谢你!
您可能可以使用动态导入,但考虑到您的数据形式,将它们转换为 JSON 并使用 fetch
.[=21 加载它们似乎更容易和更直接=]
首先,您需要将画廊数据转换为 JSON 文件,并将它们放在 static
目录中,以供下载。例如:
static/galleries/gallery1.json
[
{
"id": 0,
"alt": "Zack and Alex arming a rocket.",
"src": "img/gallery/rocket1.jpg"
},
{
"id": 1,
"alt": "Zack and Matt performing parachute testing.",
"src": "img/gallery/rocket2.jpg"
}
]
然后,你可以像这样制作一个图库组件:
<script>
export let gallery;
const loadGallery = (name) =>
fetch(`/galleries/${gallery}.json`)
.then((res) => {
if (!res.ok) throw new Error('Fetch error');
return res;
})
.then((res) => res.json());
$: imagesPromise = gallery && loadGallery(gallery);
</script>
{#if imagesPromise}
{#await imagesPromise then images}
<pre>{JSON.stringify(images, null, 2)}</pre>
{:catch err}
<pre>{err}</pre>
{/await}
{/if}
如果你真的希望你的画廊数据是一些 JavaScript,你可以像这样将动态导入传递给你的组件:
<SlideGallery gallery={import('../data/rocketgallery.js')} ... />
然后您的组件将收到一个将解析为 JS 模块的承诺。您可以像这样使用它们,例如:
SlideGallery.svelte
<script>
export let gallery;
</script>
{#if gallery}
{#await gallery then imageModule}
<pre>{JSON.stringify(imageModule.images, null, 2)}</pre>
{:catch err}
<pre>{err}</pre>
{/await}
{/if}
请注意,要使其正常工作,您需要将 静态字符串 (即不是用代码构造的字符串或变量中的某些字符串)传递给动态导入,因为否则打包器将不会“看到”它们。
// works because the bundler sees the full URL
import('../data/gallery.js')
// doesn't work because the bundler doesn't see the URL hidden
// in the dynamic string, and so the import won't be rewritten
// to what it'll really be in your bundled app
import('../data/' + 'gallery.js')
或者,您可以将原始 .js
文件放入 static
,这样您就可以知道它们的实际运行时 URL。
我正在使用 Svelte 构建一个可重复使用的图库。所有其他都已完成,但我有多个画廊,所以有多组图像数据,我无法弄清楚如何将图像数据作为道具传递。不管怎样,代码应该能更好地表达我的意思。
我有一个用于图像数据的 .js 文件:
//rocketgallery.js
export const images = [
{
id: 0,
alt: "Zack and Alex arming a rocket.",
src: "img/gallery/rocket1.jpg"
},
{
id: 1,
alt: "Zack and Matt performing parachute testing.",
src: "img/gallery/rocket2.jpg"
}
]
图库组件本身(我只是展示了我想如何导入图像 [这显然不起作用]):
//slidegallery.svelte
export let gallerydata = {gallerydata}
import {images} from gallerydata
和插入画廊的小片段:
//in index.svelte
import Slidegallery from '$lib/components/slidegallery.svelte'
<Slidegallery gallerydata='../data/rocketgallery.js' size='20vw' position='left' display='wrap'/>
<Slidegallery gallerydata='../data/anothergallery.js' size='20vw' position='center' display='block'/>
如您所见,我试图在索引页面的每个图库中指明我想要的图像,并且我的组件正在寻找从指定路径导入图像。我一直坚持这一点,所以任何方向都会有很大的帮助。我不确定我的整个方法是否错误,或者这是否是一个简单的语法问题。不管怎样,先谢谢你!
您可能可以使用动态导入,但考虑到您的数据形式,将它们转换为 JSON 并使用 fetch
.[=21 加载它们似乎更容易和更直接=]
首先,您需要将画廊数据转换为 JSON 文件,并将它们放在 static
目录中,以供下载。例如:
static/galleries/gallery1.json
[
{
"id": 0,
"alt": "Zack and Alex arming a rocket.",
"src": "img/gallery/rocket1.jpg"
},
{
"id": 1,
"alt": "Zack and Matt performing parachute testing.",
"src": "img/gallery/rocket2.jpg"
}
]
然后,你可以像这样制作一个图库组件:
<script>
export let gallery;
const loadGallery = (name) =>
fetch(`/galleries/${gallery}.json`)
.then((res) => {
if (!res.ok) throw new Error('Fetch error');
return res;
})
.then((res) => res.json());
$: imagesPromise = gallery && loadGallery(gallery);
</script>
{#if imagesPromise}
{#await imagesPromise then images}
<pre>{JSON.stringify(images, null, 2)}</pre>
{:catch err}
<pre>{err}</pre>
{/await}
{/if}
如果你真的希望你的画廊数据是一些 JavaScript,你可以像这样将动态导入传递给你的组件:
<SlideGallery gallery={import('../data/rocketgallery.js')} ... />
然后您的组件将收到一个将解析为 JS 模块的承诺。您可以像这样使用它们,例如:
SlideGallery.svelte
<script>
export let gallery;
</script>
{#if gallery}
{#await gallery then imageModule}
<pre>{JSON.stringify(imageModule.images, null, 2)}</pre>
{:catch err}
<pre>{err}</pre>
{/await}
{/if}
请注意,要使其正常工作,您需要将 静态字符串 (即不是用代码构造的字符串或变量中的某些字符串)传递给动态导入,因为否则打包器将不会“看到”它们。
// works because the bundler sees the full URL
import('../data/gallery.js')
// doesn't work because the bundler doesn't see the URL hidden
// in the dynamic string, and so the import won't be rewritten
// to what it'll really be in your bundled app
import('../data/' + 'gallery.js')
或者,您可以将原始 .js
文件放入 static
,这样您就可以知道它们的实际运行时 URL。