이것 저것/포토폴리오 , 과제

js로 shopping Mall 구현

김가마 2022. 11. 2. 20:33

JS  이용한 미니 쇼핑 게임입니다.

Javascript fetch API 활용하여 데이터 바인딩 하였다.

 

 

티셔츠 바지 치마 버튼 과 색상 버튼  에 클릭이벤트를 추가하여 옷의 종류와 색상을 filtering 기능 구현 하였습니다

 

 

// Fetch the items from ths JSON file
function loadItems() {
  return fetch("/data/data.json")
    .then((response) => response.json())
    .then((json) => json.items);
}

1. 로드 아이템 함수를 생성 
우리는 패치를 통해 데이터를 받아 올거야 
데이터를 받아온  것이 성공이면 json 형태로 반환 한다.
그리고 json안의 items 리턴한다.
// Update the list with the given items 아이템 접근

function displayItems(items) {
  const inputText = document.querySelector(".items");
  inputText.innerHTML = items.map((item) => createHTMLString(item)).join("");
}

1. 디스플레이 아이템 함수 만듦
2() items 라는 아이템스 받아오기 

부모 컨테이너에 추가 해야 하기 때문에 컨테이너 변수 정의하기
3. const container . 문서 . 접근해. itmes 라고 정의 함
4. container. innerHTml를 이용해 우리가 받아온 items 를 li 그룽

/ container innerHTML를 이용해 우리 받아온 (items) 을 li 그룹으로 만들어서 container에 추가해줄거야
html =>   <ul class="items"></ul> 여기 접근 
items 데이터 배열의 가각의 해당하는 아이템들을 html 요소로  container.innerHTML
li 태그로 변환 하는 배열을 만들 거임 그래서 map 사용 : 한 가지 배열에서 다른 형태 배열을 변환하는 것 매핑 
creatHTMLString(itme)).join(""); 함수 만든다.
creatHTMLString(itme)) li 태그 가 들어있는 html 문자열로 만들기 때문에 
각각의 아이템들을  creatHTMLString 함수를 사용 해 items li 요소로 문자열로 변환 할 것임
join사용 해  한가지의 문자열로 종합 해 볼 것이다.

// items.데이터 배열을 각각의 해당된 아이템들을 html 요소로 >  li태그로 변환 하는 배열로 만들거야 그러기 위해
// 한가지 배열 형태에서 다른 형태 배여롤 변환하는 거 매핑하는 것을 맵을 이용하면 까능
// map (items => creatHTMLString(items)) creatHTMLString 함수로 만든다
// creatHTMLString(items) li 태그가 들어있는 html 문자열  로 만들기 때문에
// 각각의 아이템들을 items =>  creatHTMLString 함수를 이용해서 item li요소로 문자열로 변환해 볼 거다

// 함수를 정의한다 creatHTMLString (item) ()각각의 아이템을 받아와서 인자로
// 이 아이템들을 각각의 li 태그로 만들면 된다
// return ` ` 백틱 기호를 사용해 문자열을 리ㅊ턴할거다  [문자열 스트링]]
// 아이템이 있는 이미지 경로는  ${item.image} type/ gender / size 해당하는 li를 만들 수 있다
// join 를 사용해 한가지의 문자열로 종합 해볼 것이다..
리턴 li 계속 반복되서 문자열로 변환 할 건대 이렇ㄱ ㅔ
3. 번째 
주어진 데이터 항목에서 HTML 목록 항목 만들기

// Create HTML list item from the given data item//

function createHTMLString(item) {
  return `<li class="item" >
        <img src="${item.image}" alt="${item.type}" class="item__thumbnail">
        <span class="item__description">${item.gender}, ${item.size}</span>
        </li>`;
}
json.items 을 전달받아 아래 작업을 수행

그러면 creatHTMLString 함수만든다 (정의 )

() 안에 items 인자 값을 받아오고 => 각 각의 아이템들을 받아와서 인자로 각각의 li 태그로 만들면 된다.
return  백틱 기호를 사용해 class = item 을 문자열을 (리턴)반환 할 것 . [문자열 string]

items image 경로는 ${item.image}  alt ~ {itme.type}
<span> ${item.gender} , ${item.size}
 4. handle button event 
버튼을 클릭시 발생하는 함수 정의
function onButtonClick(event, items) {
  const dataset = event.target.dataset;
  const key = dataset.key;
  const value = dataset.value;

  const filterData = items.filter((item) => item[key] == value);
  displayItems(filterData);
}

만약 key: color, value: blue 라면 item 에서 item.color == blue 인것만 filter된다.

event는 Event인터페이스는 DOM에서 일어나는 이벤트를 나타낸다.
event자체에는 모든 이벤트에 공통적인 속성과 메서드가 포함되어 있다.
event.target은  이벤트가 전달되는 객체(대상)를 반환한다.

변수 3가지를선언
dataset/ key 키/ value 값 
이벤트 타켓 > 이벤트가 전달되는 객체를 반환 한다,

  조건문 
키가 == null 이거나 value 가 null 일때 리턴 해라

디스플레이 아이템() 이용해 해당하는 키와 벨류
데이터만 보여줄 ㅜ수 있도록 만들면 된다
우리가 배열에서 어떤 특정한 데이터만 뽑아와서 새로운 
작은 단위의 배얄을 만들떄 ~~ filter를 사용한다, main point 

  
  (item 아이템에 있는 => itme[key])아이템의 object객체 키 값추출 

object 는 배열처럼 키를 이용해서 데이터에 접ㄱ근이 가능하다
객체 item 안에 [배열key]값이 === 내가 원하는 value 가 똑같은 아이들만 ==>displayItems 전달해줘
5번쨰 set 이벤트리스너 함수 (아이템스 인자 받는다 )
// 5. setEvent
function setEventListeners(items) {
  const logo = document.querySelector(".logo");
  const buttons = document.querySelector(".buttons");
  logo.addEventListener("click", () => displayItems(items));
  buttons.addEventListener("click", () => onButtonClick(event, items));
}

 버튼이 클릭되면 처리 할 수있도록  event 가 발생한 아이를 () 인지로 전달해주고 event , items 도 전달해준다  }

 이벤트를 처리하는 함수는 on을 붙여 사용 함  버튼을 클릭했을 때 처리하는 함수구나 ~!
 ( 이벤트, 아이템) 들을 전달 받아서 / 이제 버튼이 클릭 되었을 때 setEventLisnter를 처리를 여기서 해볼 거여
 버튼이 클릭이면 그 정보들을 items 필터 할 것  displayItems호출해서 필터된 아임ㅌ템들을 
 / 핸들링 이벤트 setEventLisnter 함수 만들기
 로고,  번튼을  const 변수 정의를 해야한다
 const logo = document.querySelector('.logo');
  const buttons = document.querySelector(".buttons");
/
 하나하나의 한곳에서 만 이벤트 핸들링을 만들어줘야한다

이벤트를 처리하는 방법은 on을 시작해 붙여준다 onButtonClick
items 를 전달 ㅂ받아서
  logo.addEventListener("click", () => displayItems(items));
                       클릭햇을 때 동작 할 수 있도록 정의해볼 것 입니다.addEventListener
logo 가 클릭이 되면 전부다 보여줘 displayItems을 이용해서 로고가선택되면 모든 아이템들이 선택 할수 있도록 만들어준다
/
    
  /
buttons.addEventListener("click", (event) => onButtonClick(event, items));
버튼 이 클릭이되면 전부 다 보여줘 onButtonClick 버튼이 클릭되면 이벤트를 처리 할 수 있도록 event 이벤트가 발생한 아이을
 인자로 전달해주고 (event, items) items 도 전달해준다/
   
우선 로고와 버튼스 요소를 정의 해야한다
컨테이너 자체를 등록 이벤트 위임 (' ') 하나하나의 이벤트를 등록하는 것 보다
팀들이 있는 컨테이너 한곳에서 이벤트 리스너를 등록해서 한곳에서 핸들링 하는 것
부모에게 준다 ㅠbuttons

6번쨰 loadItem 동적 

// main 동작
loadItems()
  .then((items) => {
    displayItems(items);
    setEventListeners(items);
  })
  .catch(console.log);


 loadItems를 실행하고 items를 반환한다.
  이후 displayItems, setEventListeners 를 실행시킨다