๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“  archive

[Vue.js] v-deep ์†์„ฑ์— ๋Œ€ํ•ด์„œ

by HandHand 2022. 2. 20.

vue ์—์„œ v-deep ์ด๋ž€?

๐Ÿ“Œ ์ปดํฌ๋„ŒํŠธ์˜ scoped ์„ ์–ธ

์‚ฌ๋‚ด์—์„œ vuetify ๋กœ ๊ตฌ์„ฑ๋œ ์ผ๋ถ€ ํ™”๋ฉด์„ ๋‹ค๋ฃฐ ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ

vuetify ์—์„œ ์ œ๊ณต๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ ์ง€์ •์ด ๋œป๋Œ€๋กœ ๋˜์ง€ ์•Š์„ ๋•Œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿด ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด scoped ์„ ์–ธ ์—†์ด ์Šคํƒ€์ผ์„ ๋ฎ์–ด ์”Œ์šฐ๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ

์ด ๊ฒฝ์šฐ ์ „์—ญ์ ์œผ๋กœ ํ•ด๋‹น ์Šคํƒ€์ผ์ด ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

// BAD !

<style>
    .some-style { /** */ }
<style>

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ scoped ๋ฅผ ํ•ด์น˜์ง€ ์•Š๊ณ  ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ํ•œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„ ์–ธ๋œ ๋ถ€๋ถ„์—์„œ ์ˆ˜์ •์„ ํ•˜๋ฉด ๋˜๊ฒ ์ง€๋งŒ,

vuetify ์™€ ๊ฐ™์ด ๋ฒˆ๋“ค๋ง๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์€ ์ผ์ž…๋‹ˆ๋‹ค.

 

์ด๋Ÿด ๋•Œ vue ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋”ฅ ์…€๋ ‰ํ„ฐ ์ธ v-deep ์„ ํ™œ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ v-deep ์„ ํ†ตํ•ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ ๋ณ€๊ฒฝํ•˜๊ธฐ

Vue ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋”ฅ ์…€๋ ‰ํ„ฐ ๋Š” ์ด 3๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

// #1
<style scoped>
.a >>> .b { /* ... */ }
</style>

// #2
<style scoped>
.a::v-deep .b { /* ... */ }
</style>

// #3
<style scoped>
.a /deep/ .b { /* ... */ }
</style>

sass ์™€ ๊ฐ™์€ ์ผ๋ถ€ CSS ์ „์ฒ˜๋ฆฌ ํ™˜๊ฒฝ์—์„œ๋Š” >>> ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ๋‘๋ฒˆ์งธ๋‚˜ ์„ธ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ v-deep ์„ ์ด์šฉํ•ด์„œ v-html ์Šคํƒ€์ผ ๋‹ค๋ฃจ๊ธฐ

v-html ๋กœ ์„ ์–ธ๋œ HTML ๋งˆํฌ์—…์€ scoped ์Šคํƒ€์ผ ์ ์šฉ์ด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ v-deep ์„ ์ด์šฉํ•˜๋ฉด ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template>
  <div>
    <div v-html="htmlData" />
  </div>
</template>

<script lang="ts">
// ...

export default class Index extends Vue {
  private htmlData = '<p class="red">Hello World!</p>'
}
</script>

<style lang="scss" scoped>
div::v-deep .red {
  color: red;
}
</style>

 

๐Ÿ“Œ ์ฐธ๊ณ  ์ž๋ฃŒ

Scoped CSS | Vue Loader

์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ CSS(SCSS)๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋”ฅ์…€๋ ‰ํ„ฐ(v-deep) ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐ˜์‘ํ˜•

๐Ÿ’ฌ ๋Œ“๊ธ€