【EJS】for文で要素ごとに情報を出しわける

どうも、くまだです。

EJSでfor文を使って要素ごとに情報を出しわけるときのメモ。

過去にEJSの記事は、タイトルの出しわけを書いています。

EJSのメリットや感想。

なお、CSSを楽に書ける「Sass」については下記の記事をご覧ください。(Dart-Sass対応)

EJSのfor文で要素ごとに情報を出しわける

例えば、カード型アイテムの配置で、アイテムごとに内容を出しわけたい場合は、下記のようになります。(CSSは省略)

<div class="p-cards">
<%
    const cards = [
        { title: "タイトル1", text:"テキスト1の文章", img: "dummy.png" },
        { title: "タイトル2", text:"テキスト2の文章テキスト2の文章", img: "dummy2.jpg" },
         { title: "タイトル3", text:"テキスト3の文章", img: "dummy3.jpg" },
    ];
%>
<% for (let i = 0; i < cards.length; i++) {
      const card = cards[i];
   %>
     <div class="p-card">
       <div class="p-card__img">
          <img src="images/<%= card.img %>" alt="">
       </div>
       <p class="p-card__title"><%= card.title %></p>
       <p class="p-card__text"><%= card.text %></p>
     </div>
    <% } %>

  </div>
EJSで表示

要素ごとに情報を出しわけたい部分(テキストやタイトル、画像など)を変数で<%= card.title %>のような感じで記述します。(変数名は任意、<%= %>はEJSの記法です)

出しわけたい情報は、配列にして格納します。

<%
    const cards = [
        { title: "タイトル1", text:"テキスト1の文章", img: "dummy.png" },
        { title: "タイトル2", text:"テキスト2の文章テキスト2の文章", img: "dummy2.jpg" },
        { title: "タイトル3", text:"テキスト3の文章", img: "dummy3.jpg" },
    ];
%>

カード部分をfor文で回します。

<% for (let i = 0; i < cards.length; i++) {
      const card = cards[i];
   %>
     <div class="p-card">
       <div class="p-card__img">
          <img src="images/<%= card.img %>" alt="">
       </div>
       <p class="p-card__title"><%= card.title %></p>
       <p class="p-card__text"><%= card.text %></p>
     </div>
    <% } %>

cards.lengthで配列の長さ未満(配列の数ぶん)の場合ループを実行。配列cardsの中の変数titleやimgなどの情報を変数cardを使ってアクセスしています。

なお、同じことをforEach文でやると下記の記述になります。

<%
    const cards = [
        { title: "タイトル1", text:"テキスト1の文章", img: "dummy.png" },
        { title: "タイトル2", text:"テキスト2の文章テキスト2の文章", img: "dummy2.jpg" },
        { title: "タイトル3", text:"テキスト3の文章", img: "dummy3.jpg" },
    ];
%>

<% cards.forEach(function(card) { %>
   <div class="p-card">
      <div class="p-card__img">
         <img src="images/<%= card.img %>" alt="">
      </div>
      <p class="p-card__title"><%= card.title %></p>
     <p class="p-card__text"><%= card.text %></p>
    </div>
<% }); %>

表示するアイテムを増やしたり減らしたい場合は、

const cardsの中の配列を増やしたり減らしたりすれば、カードもそれに合わせて増減します。

ここまで読んでくださりありがとうございました。

この記事を書いた人