API
nsh/image
nsh/image 导出 Image,即显示图片的 <Image> 元素。同一个 Image 还可以在不显示图片的情况下向原生图片加载器查询图片信息:尺寸,以及在显示之前预先加载。
import { Image, type ImageSize } from "nsh/image";
Image 是一个带有两个函数的组件:<Image src=…> 渲染原生图片视图(编译器像处理 <View> 一样就地创建它),Image.getSize / Image.prefetch 则直接在它上面调用。
const Image: ((props: ImageProps) => YNode) & {
getSize(source: string | { uri: string }): Promise<ImageSize>;
prefetch(source: string | { uri: string }): Promise<boolean>;
};
教程见图片与资源。
#Image.getSize
getSize(source: string | { uri: string }): Promise<ImageSize>;
interface ImageSize {
width: number; // 像素
height: number;
}
加载图片,并 resolve 为它的像素尺寸(源图片的尺寸,而不是降采样后的副本)。加载的数据会保留在内存中,接下来显示它的 <Image> 不会再次下载。图片无法加载时 Promise 会 reject。
import { signal } from "nsh";
import { Image } from "nsh/image";
const url = "https://picsum.photos/seed/nsh/1200/800";
const ratio = signal(1);
Image.getSize(url).then(({ width, height }) => ratio.set(width / height));
<Image src={url} style={{ width: "100%", aspectRatio: ratio() }} />;
#Image.prefetch
prefetch(source: string | { uri: string }): Promise<boolean>;
在显示之前预先加载图片。数据进入内存后 resolve 为 true(无法加载时为 false)。适合用于相册的下一页,或点击后才会显示的图片。
const next = photos.slice(index + 1, index + 4);
next.forEach((p) => Image.prefetch(p.url));
#相关内容
<Image>:src、resizeMode、defaultSource、onLoad、onProgress、onError等属性。- 导入图片文件(
import logo from "./logo.png")会得到一个ImageAsset({ uri, width, height },尺寸单位为点),<Image src>和画布的drawImage都接受它。