이미지를 상태에 따라
이미지와 관련된 작업을 하다보면 [ active | defult | error ] 등 상태값에 따라 다르게 보여줘야 하는 경우가 있다. 최소한의 코드를 작성하고 최대 효율을 내고 싶어하던 와중에 여태까지 경험해본 이미지 리소스에 대한 활용예시를 공유해보려고 한다. (물론 개발자마다 처리하는 방식이 다르기때문에 이 방법은 공유차원에서만 쓰는 글이다)
우선 기본적으로 v-for 문을 통해 아래처럼 배열 형식으로 소스 닉네임을 가져왔다. 보통 value가 아닌 id 값을 사용하긴 하지만 대충 적어봤다. 아래 예시는 참고용으로만 봐주시길 바랍니다.
👉 script data
sortItem: [
{
value: 1,
active: false,
},
{
value: 2,
active: false,
},
{
value: 3,
active: false,
},
],
이제 이 배열을 for문을 돌려서 상태값에 따라(active) 이미지를 바꿔주려고 한다.
사실 Vue를 처음 접했을때 바인딩(:) 구문을 사용하면 대부분의 데이터값을 동적으로 사용할 수 있어서 매우 편리하게 작동했는데 img는 그런 술수는 통하지 않는다. 따지고 보면 dom 이 읽혀질때 이미 이미지 소스를 가지고와야하기때문에일 수도 있다는 생각을 해봤다.
작동안하는 예시
<img :src="`@/assets/news/sort0${item.value}_active.svg`" alt="">
<img :src="'@/assets/news/sort0' + item.value + '.svg'" alt="" />
위 두 예시는 for 문 내부에 넣고 item 값을 받아 value로 이미지 를 동적으로 처리해주었지만 읽히지 않는다. 실제로 html 구조를 읽어보아도 경로는 맞는데 읽혀지지 않는다. (이와 관련되서 잘 알고계시는 분은 따로 알려주시면 감사하겠습니다 :-))
해결방법 1
첫번째 해결방법은 public 폴더 내부에 img 소스로 경로를 지정해주는 것이다. 이런경우 위에 예시로 작성된 src 부분에 아래 경로처럼 img 내부 파일명을 적어주면 동적으로 사용이 가능하다. 실제로 빌드해서 사용이 가능하다. public 은 빌드되면서 경로를 가지고 가기 때문에 결국 img :src에 읽히는 item.img 는 url 경로로 읽혀져 정상작동된다.
👉 template
//{"img": "/img/mark-01.svg"}
<div class="title_img">
<img :src="item.img" alt="" />
</div>
http://thumbnail1.jpg => 이렇게 읽힌다
해결방법 2
작업하는 프로젝트는 애초에 vuetify 를 사용하고 있기 때문에 어렵지 않게 다른방법을 찾을 수 있었다. vuetify 에서 제공하는 v-img 를 사용 + 삼항연산자를 통해 acitve 상태값도 동시에 체크해 이미지를 어렵지않게 바꿔줄 수 있었다.
이렇게 하면 data에 해당하는 active 의 상태만 바꿔주어도 상태를 제대로 출력할 수 있다.
👉 template
<section class="feeds_sort">
<div>
<ul>
<li v-for="(item, index) in sortItem" :key="index">
<button>
<v-img
width="26"
height="26"
style="margin: 0 auto"
:src="
item.active === true
? require(`@/assets/news/sort0${item.value}_active.svg`)
: require(`@/assets/news/sort0${item.value}.svg`)
"
alt=""
/>
</button>
</li>
</ul>
</div>
</section>
'쬬의 Vue' 카테고리의 다른 글
[Vue] firebase logEvent 연동하기 + Realtime (0) | 2023.02.12 |
---|---|
[Vue] innerWidth 감지해서 resize 이벤트 생성 (0) | 2022.11.16 |
[Vue] Cookie 설정으로 하루보지 않기 설정 + 테스트 방식 공유 (0) | 2022.10.04 |
[Vue] mycure/vue-wysiwyg 기본편집기 활용하기 (default 값 넣기) (0) | 2022.09.20 |
[Vue] vue-cli-serve production 빌드 시 스타일 문제 해결과정 (0) | 2022.09.16 |