🔗

Next.jsとMUIのLinkコンポーネント両方をいい感じに組み合わせて使いたい

2023/01/19に公開

Next.jsとMUIでNext.jsの遷移機能を活かしつつMUIのデザインも取り入れたいときに、両方のLinkコンポーネントのラッパーを作ることで対処しています。

パラメータなどはさまざま考えられると思いますが、よく使う最小構成としては以下のかたちです。(わかりやすいように名前を変えてインポートしています)

import { Link as MuiLink } from '@mui/material'
import NextLink, { LinkProps } from 'next/link'
import React, { ReactNode } from 'react'

type Props = {
  linkProps: LinkProps
  children?: ReactNode
}

export const Link = (props: Props) => {
  return (
    <NextLink href={props.linkProps.href} passHref>
      <MuiLink>{props.children}</MuiLink>
    </NextLink>
  )
}

MUIのLinkをNext.jsのLinkでラップしています。ポイントはNext側にpassHref属性をつけることでしょうか。これがあることでhrefの参照先を内部のMUIのLinkへ渡すことができます。

また、外部リンクとして利用したい場合は以下のようにMuiLinktarget='_blank'をつけてあげれば大丈夫です。

本来、外部リンクの場合はNext.jsのLinkコンポーネントではなく単純に<a>タグを使うのですが、リンク情報を内側にパスしてあげればOK。これもpassHrefのおかげです。

- <MuiLink>{props.children}</MuiLink>
+ <MuiLink target='_blank' rel='noopener noreferrer'>{props.children}</MuiLink>

targetrelはパラメータとして制御してあげてもよさそうです。

Discussion