💭

【初心者向け/ITスクール 81日】JS miniproject(data-set, filter)

2023/11/14に公開

はじめに

今日は、ITスクールに通った81日目の日です。
SpringBoot基礎講座をまた、繰り返えしながら理解できなかったところをもう一度コーディングしたり、JavaScriptのfetchメソッド、json()を活用し、filter, data-set attributeなど、
filterlingと非同期処理の練習をしました。
1時間の動画でしたが、自分の力で具象するのがとてもぶずかしかったです。

JS

先日、作成したmini shopのプロジェクトに活用したいと考え、JSで非同期処理の練習を行いました。
fetch()と必要なhtmlを挿入するのはなんとなく段々分かりましたが、filterlingは本当に難しかったと思います。
これで6時間を費やしましたが、なんとなく感が付きましたので、今後のプロジェクトでも積極的に活用したいと思います。

難しかった点(OVERHEADしない)

あまに、JSとfetch()になれてないこともありましたが、一番難しかったのはNodelist, JSONなどを具別することでした。Queryselectorの場合、Nodelistには適用されないところと、JSONとcssのelementを具別することがとても難しかった。

特に、XSSがあるので、innerHTMLを使わず、insertAdjacentHTMLを使用し、
無駄を減らすために各カテゴリをクリックする際に、もう一度データーを書き直すこどではなく、cssで隠す練習をしました。
こちらで6時間以上かかりました。

CODE

//main
loadItems()
  .then((items) => {
    writeItems(items);
    showAllItems();
    setEventListeners();
  })
  .catch(console.log);
コード詳細
/* fetch()で、data.jsonをloading */

function loadItems() {
  return fetch('data/data.json')
    .then((response) => response.json())
    .then((json) => json.items);
}

/* containerにhtml注入(No InnerHTML) */
function writeItems(items) {
  const container = document.querySelector('.items');
  container.insertAdjacentHTML(
    'afterbegin',
    items.map((item) => createHTMLString(item)).join('')
  );
}


/* data.json(item)を HTMLに */
function createHTMLString(item) {
  return `
  <li class="item" data-type="${item.type}" data-color="${item.color}">
    <img src="${item.image}" alt="${item.type}" class="item__thumbnail">
    <span class="item__description">${item.gender}, ${item.size}</span>
  </li>
  `;
}


/*page loading 完了 ->  ボタンでデーターをfilitering*/


/* invisible(css) classを除去しdisplay:noneを除去 */
function showAllItems() {
  const itemElements = document.querySelectorAll('.item');
  itemElements.forEach((itemElement) => {
    itemElement.classList.remove('invisible');
  });
}

/*event delegationを通して、buttonsにevent handling*/
function setEventListeners() {
  const logo = document.querySelector('.logo');
  const buttons = document.querySelector('.buttons');

  logo.addEventListener('click', () => {
    showAllItems();
  });

  buttons.addEventListener('click', (event) => {
    onButtonClick(event);
  });
}

/*clickした部ターンのdataを獲得*/
function onButtonClick(event) {
  const dataset = event.target.dataset;
  const key = dataset.key;
  const value = dataset.value;

  if (key == null || value == null) {
    return;
  }

  updateItems(key, value);
  
}



/* dataのkeyと valueが一致していないクラスにinvisible追加*/
function updateItems(key, value) {
  const itemElements = document.querySelectorAll('.item');
  itemElements.forEach((item) => {
    if (item.dataset[key] === value) {
      item.classList.remove('invisible');
    } else {
      item.classList.add('invisible');
    }
  });
}

完成

Discussion