今Gatsby.js(= React.jsベースの静的サイトジェネレーター)でブログアプリを作っていて、各ページでヘッダーやフッターやサイドバーを共通化したいケースでどうやるかをメモっておく。
前提
- GatsbyのDefault Starter(デフォルトスターター)を元にサイトを構築しているので、パスやフォルダ構成は適当に読み替えてくださいー
Default Starterだとヘッダーはもともとheader.jsとしてコンポーネント化されているけど、フッター部分は共通(親)テンプレートである src/components/layout.js に記述されている。
そこで、フッターもヘッダーと同様にコンポーネント化する方法が下記。
1. 共有パーツ化したい部分のファイルを作る
今回はフッター用のファイルをコンポーネントフォルダ内に作成する。
src/components/footer.js
import { Link } from "gatsby"
import PropTypes from "prop-types"
import React from "react"
const Footer = ({ siteTitle }) => (
<footer className="footer-common">
<div>
<h1 style={{ margin: 0 }}>
<Link to="/">
{siteTitle}
</Link>
</h1>
</div>
</footer>
)
Footer.propTypes = {
siteTitle: PropTypes.string,
}
Footer.defaultProps = {
siteTitle: ``,
}
export default Footer
HTML部分は適当に書き換えてください。
2. コンポーネントを読み込みたい親ファイルでインポートする
今回用意するフッターは全ページ共通で使いたいので、src/components/layout.js で呼び出すよう設定を行う。
import Footer from "./footer"
...
3. 同じファイル内で、コンポーネントを呼び出したい箇所にタグを記載する
先ほどコンポーネント化したフッター部分を呼び出したい箇所に<Footer />
を書く。僕は src/components/layout.js で下記のようにした。
...
return (
<>
<Header siteTitle={data.site.siteMetadata.title} />
<main>{children}</main>
<Footer />
</>
)
...
全てのHTML(厳密にはHTMLだけではないが)タグは閉じられている必要があるため、<Footer />
も最後にスラッシュが必要。これによりSublime Textのスニペットの配色がバグるので、GatsbyというかReactの記法をうまくカバーしてくれるプラグインを探し中・・・。
以上、Reactについてもフレームワークについてもまだまだ基本的なポイントから勉強中で、ミスっていたらツッコミいただけると嬉しいです。