カスタム Intent コンポーネント
同じ種類のターゲットが多い場合は、useIntentTarget を一度ラップして、できたコンポーネントを再利用します。
再利用可能な IntentButton
通常の button props に加えて onIntent、importance、cost を受け取ります。
"use client";
import type { ButtonHTMLAttributes } from "react";
import {
useIntentTarget,
type UseIntentTargetOptions,
} from "intent-link";
type IntentButtonProps =
ButtonHTMLAttributes<HTMLButtonElement> &
UseIntentTargetOptions;
export function IntentButton({
onIntent,
importance,
cost,
children,
...buttonProps
}: IntentButtonProps) {
const intentRef = useIntentTarget<HTMLButtonElement>({
onIntent,
importance,
cost,
});
return (
<button ref={intentRef} {...buttonProps}>
{children}
</button>
);
}使い方
<IntentButton
className="preview-button"
onIntent={preloadPreview}
>
Preview
</IntentButton>再利用可能な IntentArticle
同じパターンを商品カードやその他の意味を持つコンテナーにも使えます。
"use client";
import type { HTMLAttributes } from "react";
import {
useIntentTarget,
type UseIntentTargetOptions,
} from "intent-link";
type IntentArticleProps =
HTMLAttributes<HTMLElement> &
UseIntentTargetOptions;
export function IntentArticle({
onIntent,
importance,
cost,
children,
...articleProps
}: IntentArticleProps) {
const intentRef = useIntentTarget<HTMLElement>({
onIntent,
importance,
cost,
});
return (
<article ref={intentRef} {...articleProps}>
{children}
</article>
);
}使い方
<IntentArticle
className="product-card"
onIntent={() => preloadProduct(productId)}
>
<ProductImage />
<ProductDetails />
</IntentArticle>