EJSの変数使用例(EJS内)

以前EJSで変数を使ってmeta情報の設定について書きました

今回はも同じく変数についてですが、別の事例でfor文も交えて書こうと思います

あわせて読みたい
EJSにおけるmeta情報の設定方法 僕は静的ページコーディングの際はejsを使用しています。 ejsでファイルを分割することでWordPressのようにheaderとfooterを共有でどのページでも呼び出せるようになり...
この記事の目次

QAセクションを管理しやすくする

こちらが今回変数を使用して管理したい対象です

<!-- QAセクション -->
<section class="qa">
  <div class="qa__inner">
    <h2 class="section-title">qaタイトルです</h2>
    <p class="section-subtitle">qaサブタイトルです</p>
    <ul class="qa__list">
      <li class="qa__list-item">
        <p class="question">question:q1だよおおお </p>
        <p class="answer">answer:a1ですううう </p>
      </li>
      <li class="qa__list-item">
        <p class="question">question:q2を書いてるよ </p>
        <p class="answer">answer:a2が答えだよ! </p>
      </li>
      <li class="qa__list-item">
        <p class="question">question:q3ですq3です </p>
        <p class="answer">answer:答えa3です </p>
      </li>
    </ul>
  </div>
</section>

質問リスト、ちょっとなら良いんですが項目増えてくると面倒ですよね

少しすっきりさせて管理をしやすくすることができるので、やっていきます

セクションタイトルをパーツ化する

セクションタイトルって共通なことが多いと思います。そういった場合は共通パーツとして定義してあげると使い回せるようになり便利です

以下は共通化したものです

<!-- QAセクション -->
<% const qa_title = {
  title: 'qaタイトルです',
  subtitle: 'qaサブタイトルです',
};
%>
<section class="qa">
  <div class="qa__inner">
    <%- include('./common/_section-title', { section: qa_title } ) %>
    <ul class="qa__list">
      <li class="qa__list-item">
        <p class="question">question:q1だよおおお </p>
        <p class="answer">answer:a1ですううう </p>
      </li>
      <li class="qa__list-item">
        <p class="question">question:q2を書いてるよ </p>
        <p class="answer">answer:a2が答えだよ! </p>
      </li>
      <li class="qa__list-item">
        <p class="question">question:q3ですq3です </p>
        <p class="answer">answer:答えa3です </p>
      </li>
    </ul>
  </div>
</section>

変数を設定する

まずセクションタイトルに入れる項目を変数化します

今回はタイトルとサブタイトルですので以下のように定義しています

<% const qa_title = {
  title: 'qaタイトルです',
  subtitle: 'qaサブタイトルです',
};
%>

includeでパーツを呼び出す

以下のようにして呼び出します

<%- include('./common/_section-title', { section: qa_title } ) %>

第一引数は読み込むファイルのパス(.ejsは省略可)

第二引数は定義した変数qa_titleを読み込んだ_section-title.ejs内ではsectionという名前で渡しています。

つまりsectionほにゃららってやらないと変数引っ張ってこれないよ!ということ

セクションタイトル部分を別ファイルにコピペする

コピペした上でタイトルとサブタイトル部分を変数で指定します

上で言ったとおり、sectionという値を使わないと読めません。

qa_title内ではタイトルはtitle、サブタイトルはsubtitleと定義してあるので

section.titleといったようにピリオドで繋げて指定します

<h2 class="section-title"><%= section.title %></h2>
<p class="section-subtitle"><%= section.subtitle %></p>

質問リストを変数と繰り返し文で整理する

以下は完成形です

<!-- QAセクション -->
<% const qa_title = {
  title: 'qaタイトルです',
  subtitle: 'qaサブタイトルです',
};
%>
<% const qa = [
  {
    question: 'q1だよおおお',
    answer: 'a1ですううう',
  },
  {
    question: 'q2を書いてるよ',
    answer: 'a2が答えだよ!',
  },
  {
    question: 'q3ですq3です',
    answer: '答えa3です',
  },
];
%>
<section class="qa">
  <div class="qa__inner">
    <%- include('./common/_section-title', { section: qa_title } ) %>
      <ul class="qa__list">
        <% for( let i in qa ) { %>
          <li class="qa__list-item">
            <p class="question">question:<%- qa[i].question %>
            </p>
            <p class="answer">answer:<%- qa[i].answer %>
            </p>
          </li>
          <% } %>
      </ul>
  </div>
</section>

変数を設定する

セクションタイトルと同じように変数を定義します

<% const qa = [
  {
    question: 'q1だよおおお',
    answer: 'a1ですううう',
  },
  {
    question: 'q2を書いてるよ',
    answer: 'a2が答えだよ!',
  },
  {
    question: 'q3ですq3です',
    answer: '答えa3です',
  },
];
%>

for文で繰り返す

for(…in…)を使ってます

<section class="qa">
  <div class="qa__inner">
    <%- include('./common/_section-title', { section: qa_title } ) %>
      <ul class="qa__list">
        <% for( let i in qa ) { %>
          <li class="qa__list-item">
            <p class="question">question:<%- qa[i].question %>
            </p>
            <p class="answer">answer:<%- qa[i].answer %>
            </p>
          </li>
          <% } %>
      </ul>
  </div>
</section>

iにはインデックス番号が入り、それに対応した配列の要素に定義されている変数の中身が代入されます

この例でいうと、インデックス番号0〜2の要素が入っている形ですね

さらにセクションをパーツにする場合

セクション部分をパーツにして、includeで読み込みます

第二引数は最初にやったときと同様の考えで書きます

配列qaはqaで変数を引っ張ってきているため、qaをqaという値で渡しています

セクションタイトル部分は上の方にあるのと同様qa_titleをsectionという値で渡します

<!-- QAセクション -->
<% const qa_title = {
  title: 'qaタイトルです',
  subtitle: 'qaサブタイトルです',
};
%>
<% const qa = [
  {
    question: 'q1だよおおお',
    answer: 'a1ですううう',
  },
  {
    question: 'q2を書いてるよ',
    answer: 'a2が答えだよ!',
  },
  {
    question: 'q3ですq3です',
    answer: '答えa3です',
  },
];
%>
 <%- include('./common/_qa_section', { qa: qa, section: qa_title } ) %>

このへんは慣れるまで難しいかもしれません

実際に手を動かして、どうなるかやってみると理解できるんじゃないかと思います

この記事が気に入ったら
フォローしてね!

シェアしてね!!
  • URLをコピーしました!

著者

Webコーダー。
ドライブとコーヒーとガジェットが好き。
「Code Widgit」は「Code With it」と「gadget」を合わせた造語。

この記事の目次
閉じる