JavaScript/javascript UI

UI: Select option (하드코딩 & forEach함수)

SeaPlus 2021. 9. 16. 11:04


form 에서 상품들을 선택하면 그에 맞게 사이즈 option들이 변하는 UI 이다.

소핑몰 웹사이트에서 흔하게 볼수 있는 매우 기본적인 UI로, 하드코딩 방법과 동적프로그래밍 방법으로 구현해봤다.

 

(JQuery 사용!)


하드코딩이란?

- 상수나 변수에 들어가는 값(문자열, 정수 등)을 literal이라고 하는데, 이 값을 소스코드에 직접 쓰는 게 하드코딩

- 반대로, 소스코드에 직접 쓰지 않고 데이터를 외부 파일로 빼서 따로 관리하는 것을 '로딩'이라고 한다.

 

장점

- 육안으로 값을 직접 확인할수있다.

- 로딩절차 없이 다이렉트로 읽을수 있어 속도가 비교적 빠르다.

 

단점

- 자주바뀌는 데이터를 하드코딩하면 계속해서 수정하고 ,재컴파일, 재배포 해야한다.

- 유지보수, 운용이 어렵게 된다.


[HTML]

<h1>Select 시 변하는 option 예제</h1>
      <form action="GET" class="container my-5">
        <div class="form-group">
          <p>상품선택</p>
          <select id="option1" class="form-control">
            <option>바지</option>
            <option>셔츠</option>
          </select>

          <div class="size-select">
            <p class="mt-4">사이즈선택</p>
            <select id="option2" class="form-control">
              <option>95</option>
              <option>100</option>
              <option>105</option>
            </select>
          </div>
        </div>
      </form>

HTML의 구성은 심플하게 했다.  #option1의 상품선택 option에는 바지,셔츠 두 상품을 두고 #option2는 사이즈들로 구성해서 #option1을 클릭하면 #option2의 사이즈들이 보이는 UI이다.

 


[1. HTML의 요소들을 숨겼다 보여주는 방법] 

//change는 요소값 변경했을때 발생하는 이벤트
$("#option1").on("change", function () {
  // 만약에 사용자가 선택한 값이 셔츠라면 ui를 보여준다.
  // 만약 #option1의 선택된 값이 == 셔츠이면
  if ($("#option1").val() == "셔츠") {
    $(".size-select").addClass("show-display");
  } else {
    $(".size-select").removeClass("show-display");
  }
});
  • #option2의 display값을 none 으로 적용한뒤  "show-display" 라는 display:block으로 된 클래스를 만들어 addClass, removeClass 를 통해 적용과 해제를 할수 있다.
  • 이 방법은 많은 옵션이 발생 할 수록 HTML 태그가 지저분해진다는 단점이 있다.  

 

 

[2. JS 내부에서 option 을 하드코딩하는 방법] 

$("#option1").on("change", function () {
  if ($("#option1").val() == "셔츠") {
    $("#option2").html("");
    // 변수를 선언한 뒤 `` 를 이용해 html태그를 코딩한다
    var 탬플릿 = `<option>95</option>
    <option>100</option>
    <option>105</option>
    `;
    // append() 함수는 선택한 요소의 내용의 끝에 콘텐츠를 추가 한다.
    // 하드코딩된 값,변수를을 적용하려면 append()함수를 사용해 적용
    $("#option2").append(탬플릿);
  }
});
  • #option2의 값들을 html 이 아닌 js 내에서 하드코딩하는 방법이다.
  • 요소들은 backtick( ` `)내부에 적어야 템플릿 리터럴방식에 의해 문자열의 개행까지도 용이하게 하드코딩 가능하다.
  • 변수에 하드코딩된 값을 반영한뒤 append()함수를 통해 #option2에 데이터를 넣는 구조 이다.
  • 이 방법 역시 많은 옵션이 발생 할 수록 JS 파일이 지저분해 지고 유지보수가 어렵다는 단점이 있다.

 

 

[3. JS 내부 하드코딩을 for문으로 축약하는 방법] 

//셔츠사이즈
var 셔츠사이즈 = [95, 100, 105];

//바지사이즈
var 바지사이즈 = [26, 28, 30, 32, 34, 36];

$("#option1").on("change", function () {
  if ($("#option1").val() == "셔츠") {
    //option2 내부 속성들을 계속해서 초기화 한다.
    $("#option2").html("");
    for (i = 0; i < 3; i++) {
      //${array[index]}는 최신 js 문법으로 ``내부에 변수를 삽입할수 있는 기술이다.
      var 탬플릿 = `<option>${셔츠사이즈[i]}</option>`;
      $("#option2").append(탬플릿);
    }
  } else if ($("#option1").val() == "바지") {
    //option2 내부 속성들을 계속해서 초기화 한다.
    $("#option2").html("");

    for (i = 0; i < 6; i++) {
      //${array[index]}는 최신 js 문법으로 ``내부에 변수를 삽입할수 있는 기술이다.
      var 탬플릿 = `<option>${바지사이즈[i]}</option>`;
      $("#option2").append(탬플릿);
    }
  }
});
  • #option2의 값들을 js에서 하드 코딩하는 대신 배열로 만든다. 
  • for()반복문 내부에 탬플릿리터럴 방식을 통해 배열의 값들을 받아와서 #option2에 반복적으로 넣는 과정을 가진다.
  • 위와 같이 반복문을 사용한 방법은 유지보수도 용이하고 훨씬 코드자체도 간결해 진다.

 

[4. JS 내부 하드코딩을  forEach 반복문으로 축약하는방법] 

//상품
var 상품 = ["셔츠", "바지", "맨투맨", "신발"];
//셔츠사이즈
var 셔츠사이즈 = [95, 100, 105];
//바지사이즈
var 바지사이즈 = [26, 28, 30, 32, 34, 36];
//맨투맨사이즈
var 맨투맨사이즈 = [90, 95, 100, 105, 110];
//신발사이즈
var 신발사이즈 = [230, 235, 240, 245, 250, 255, 260];

// 상품 목록을 계속해서 자동 할당
상품.forEach(function (i) {
  var 상품탬플릿 = `<option>${[i]}</option>`;
  $("#option1").append(상품탬플릿);
});

// 상품 사이즈를 할당하기 위한 프로그래밍을 함수로 만들었다.
function template(list) {
  //option2 내부 속성들을 계속해서 초기화 한다.
  $("#option2").html("");

  //forEach-> 왼쪽 array 자료 갯수만큼 반복문을 돌려라
  //반복문이 인덱스값으로 진행되는게 아니라 배열 내부 값들로 반복되기때문에 배열 내부 값들을 append()함수에 넣는다.
  list.forEach(function (i) {
    var 사이즈탬플릿 = `<option>${[i]}</option>`;
    $("#option2").append(사이즈탬플릿);
  });
}

$("#option1").on("change", function () {
  if ($("#option1").val() == "셔츠") {
    template(셔츠사이즈);
  } else if ($("#option1").val() == "바지") {
    template(바지사이즈);
  } else if ($("#option1").val() == "맨투맨") {
    template(맨투맨사이즈);
  } else if ($("#option1").val() == "신발") {
    template(신발사이즈);
  }
});
  • forEach는 배열,map 등을 위한 반복문이다.
  • forEach -> 왼쪽 array 자료 갯수만큼 반복문을 돌려라
  • 반복문이 인덱스값으로 진행되는게 아니라 배열 내부 값들로 반복되기때문에 배열 내부 값들을 append()함수에 넣는다.
  • forEach내부 함수는 콜백함수이다.
  • forEach문을써서 option2에 배열 값들을 넣는 문제는 계속해서 발생하고 있다 -> 함수로 만든뒤에 필요할때마다 함수를 호출하면된다.

 

출처:

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=guseod24&logNo=221459329316 

https://codingapple.com/course/javascript-jquery-ui/