Next.js×TypeScript×microCMSで目次を作成する
Next.js×TypeScript×microCMSで目次を作成する方法をご紹介します。
例 : https://tkblog.netlify.app/blog/asbz5h_mr1h
目次を追加したい場合は、ブログの個別記事に当たるtsxファイルに記述します。
この記事の例では、/pages/blog/[id].tsxのコードを貼っています。
インストール
コマンドでcheerioをインストールします。
yarn add cheerio
これでインポートが可能になります。
import cheerio from 'cheerio';
getStaticProps
const headings = $('h2, h3, h4').toArray() const toc:content[] = headings.map((data) => { return { //@ts-ignore text: String(data.children[0].data), id: data.attribs.id, name: data.name, } })
$('h2, h3, h4').toArray()
のように、$()
内に目次として抽出したい要素をカンマ区切りで指定します。
各要素をどのように表示するかはdefault
関数で制御します。
text
には表示されるテキストが入ります。h2
などのタグに挟まれるテキストのことです。
id
には自動生成のidが入ります。
name
にはh2
やh3
などが入ります。
HTML
<ul id="lists"> {tableOfContents.map(content => { if (content.name == "h2"){ return <li id={content.name} key={content.id}> <a href={"#" + content.id}>{content.text}</a> </li> }else if (content.name=="h3"){ return <ul><li id={content.name} key={content.id}> <a href={"#" + content.id}>{content.text}</a> </li></ul> }else if (content.name=="h4"){ return <ul><ul><li id={content.name} key={content.id}> <a href={"#" + content.id}>{content.text}</a> </li></ul></ul> } })} </ul>
簡略化すると、{tableOfContents.map(content => {return HTML要素}
です。
例の様に配列.map
とするとループ処理になり、content
に各要素が入ります。
(content, index)
と書けばindexも利用できます。
h2,h3,h4で目次を入れ子にしたかったので、ulタグの中にulタグを入れています。