본문 바로가기

JavaScript

[ JS | VUE ] element 중간에 새로운 element 삽입하기

728x90
반응형

 

ul태그 안에 v-for로 data들이 뿌려진 li element들이 있는데, 

이 li 사이에 일정 간격을 두고 배너가 들어가야 하는 상황이었다.

 

 

 

  적용 전  

html css로 표현된 li들

  방법 1  

첫번째로 든 생각은

데이터들이 다 뿌려진 후인 mounted에서

li를 querySelectorAll로 가지고와서 원하는 사이에 배너 html을 끼워넣는 방법이였다.

→ Element.insertAdjacentHTML() 이용

 

 

<script>
  mounted(){
    //전체 li 가져오기 ul에 ul_wrap라는 class값을 주고 그 기준으로 가져오게 했다
    const liList = document.querySelectorAll('.ul_wrap li')
    const bannerDiv=' <li class="banner"> BANNER </li>'

    liList.forEach((el,idx)=>{
      let index = idx +1
      index % 2 == 0 ? liList[idx].insertAdjacentHTML('afterend', bannerDiv) : ''
    })
  }
</script>

element의 2번째 4번째에 나와야 하는데 idx값은 element의 순서보다 -1된 값이니 

idx값이 2의 배수인지 확인할땐 -1된 값을 index에 할당해  비교하고 적용할땐 원래 idx값을 사용했다

 

 

 

  방법 2  

두번째 방법은 v-for로 불러올때

v-if로 index값을 활용해 배너를 원하는 위치에 넣어주는 방법이였다.

(다른분이 알려주신 더 좋은 방법이였음!)

 

<template>
  <ul class="ul_wrap">
    <div v-for="(li,idx) in list" v-bind:key="idx">
      <li>li_{{li}}</li>
      <li v-if="idx % 2 == 1" class="banner">BANNER</li>
    </div>
  </ul>
</template>

<script>
export default {
  data() {
    [1, 2, 3, 4, 5, 6];
  }
};
</script>

위에서와 같이 element의 위치와 idx값이 1차이가 나므로

이번엔 index가 홀수값인 경우(idx가 1이면 2번째 li가 보여진 상황이므로 그 뒤에 banner삽입)

그 뒤에 banner가 보여지도록 조건을 주었다.

 

 

 

 

둘다 결과는 아래와같다

 

 

  적용 후  

 

 

banner가 삽입 된 li들

 

 

  예제  

아래는 vue파일이 아닌 html파일로 확인 가능하도록 예제 코드를 넣어두었다 

<style>
  li{
    list-style:none;
    padding: 5px 30px;
    border :1px solid #38B886;
    background :#E1F2EB;
    color: #38B886;
    font-weight:600;
    font-size:14px;
    margin-bottom:5px;
    width:100px;
    text-align:center
  }

  li.banner{
      border-color:#F8CCB5;
      background: #FEF9F6;
      color:#F8CCB5
  }
</style>

<body>
<ul class="ul_wrap">
	<li> li_1 </li>
    <li> li_2 </li>
    <li> li_3 </li>
    <li> li_4 </li>
    <li> li_5 </li>
    <li> li_6 </li>
</ul>
<script>
	const liList = document.querySelectorAll('.ul_wrap li')
    const bannerDiv=' <li class="banner"> BANNER </li>'
    console.log(liList)
    liList.forEach((el,idx)=>{
      let index = idx +1
      index % 2 == 0 ? liList[idx].insertAdjacentHTML('afterend'
      , bannerDiv):''
      })
    
</script>
</body>

 


✔︎ 참고

developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML

728x90
반응형