[Vue]Single File Component(SFC)

chaewonΒ·2024λ…„ 7μ›” 18일
0
post-thumbnail

πŸ’»Single File Component

Vueμ—μ„œ Single File Component(SFC, *.vue)λŠ” Vue μ»΄ν¬λ„ŒνŠΈμ˜ ν…œν”Œλ¦Ώ(template), 둜직(script), μŠ€νƒ€μΌ(style)을 ν•˜λ‚˜μ˜ 파일둜 μΊ‘μŠν™”ν•˜λŠ” 특수파일 ν˜•μ‹μ΄λ‹€. ν™•μž₯μžλŠ” *.vue이닀.


μ–Έμ–΄ 블둝


1. <template>

  1. 각 *.vueνŒŒμΌμ€ ν•œ λ²ˆμ— μ΅œλŒ€ ν•˜λ‚˜μ˜ top-level <template>블둝을 포함할 수 μžˆλ‹€.
  2. μ½˜ν…μΈ λŠ” μΆ”μΆœλ˜μ–΄ @vue/compiler-dom으둜 μ „λ‹¬λ˜κ³ , JavaScript λ Œλ” κΈ°λŠ₯으둜 사전 컴파일되고, renderμ˜΅μ…˜μœΌλ‘œ 내보내어 μ»΄ν¬λ„ŒνŠΈμ— μ²¨λΆ€λœλ‹€.

2. <script>

  1. 각 *.vueνŒŒμΌμ€ ν•œ λ²ˆμ— μ΅œλŒ€ ν•˜λ‚˜μ˜ <script>블둝을 포함할 수 μžˆλ‹€.(< script setup >μ œμ™Έ)
  2. μŠ€ν¬λ¦½νŠΈλŠ” ES λͺ¨λ“ˆλ‘œ μ‹€ν–‰λœλ‹€.
  3. defaulte exportλŠ” 일반 객체 λ˜λŠ” defineComponent의 λ°˜ν™˜ κ°’μœΌλ‘œ Vue μ»΄ν¬λ„ŒνŠΈ μ˜΅μ…˜ 객체여야 ν•œλ‹€.

3. <script setup>

  1. 각 *.vue νŒŒμΌμ€ ν•œ λ²ˆμ— μ΅œλŒ€ ν•˜λ‚˜μ˜ <script setup>블둝을 포함할 수 μžˆλ‹€.
  2. <script setup>은 사전에 μ²˜λ¦¬λ˜μ–΄ μ»΄ν¬λ„ŒνŠΈμ˜ setup()ν•¨μˆ˜λ‘œ μ‚¬μš©λœλ‹€. 즉 μ»΄ν¬λ„ŒνŠΈμ˜ 각 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ μ‹€ν–‰λœλ‹€. <script setup>의 μ΅œμƒμœ„ 바인딩은 ν…œν”Œλ¦Ώμ— μžλ™μœΌλ‘œ λ…ΈμΆœλœλ‹€.

4. <style>

  1. 단일 *.vueνŒŒμΌμ—λŠ” μ—¬λŸ¬ <style>νƒœκ·Έκ°€ 포함될 수 μžˆλ‹€.
  2. <style> νƒœκ·ΈλŠ” ν˜„μž¬ μ»΄ν¬λ„ŒνŠΈμ— μŠ€νƒ€μΌμ„ μΊ‘μŠν™”ν•˜λŠ”λ° 도움이 λ˜λ„λ‘ scoped λ˜λŠ” module 속성을 κ°€μ§ˆ 수 μžˆλ‹€. μΊ‘μŠν™” λͺ¨λ“œκ°€ λ‹€λ₯Έ μ—¬λŸ¬ <style> νƒœκ·Έλ₯Ό λ™μΌν•œ ꡬ성 μš”μ†Œμ—μ„œ ν˜Όν•©ν•  수 μžˆλ‹€.

Custom Blocks


ν”„λ‘œμ νŠΈλ³„ μš”κ΅¬μ‚¬ν•­μ— 따라 *.vueνŒŒμΌμ— μ‚¬μš©μž μ •μ˜ 블둝을 μΆ”κ°€ν•  수 μžˆλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό 같은 μ‚¬μš©μž μ •μ˜ 블둝 μ˜ˆκ°€ μžˆλ‹€.

  • Gridsome: <page-query>
  • vite-plugin-vue-gql: <gql>
  • vue-i18n: <i18n>

μ „μ²˜λ¦¬κΈ°


<script>의 lang속성을 μ‚¬μš©ν•˜μ—¬ μ „μ²˜λ¦¬κΈ° μ–Έμ–΄λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€. 일반적인 κ²½μš°μ—λŠ” TypeScriptλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

<script lang="ts">
   //use TypeScript
</script>

lang속성은 λͺ¨λ“  블둝에 μ μš©ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ SASS와 Pugλ₯Ό <style>κ³Ό <template>에 μ μš©ν•  수 μžˆλ‹€.

<template lang="pug">
  p {{ msg }}
</template>

<style lang="scss">
	$primary-color:#333;
  	body{
  		color: $primary-color;
  	}
</style>

Src κ°€μ Έμ˜€κΈ°


*.vue μ»΄ν¬λ„ŒνŠΈλ₯Ό μ—¬λŸ¬ 파일둜 λΆ„ν• ν•˜λ €λŠ” 경우 src속성을 μ‚¬μš©ν•˜μ—¬ language block에 λŒ€ν•œ μ™ΈλΆ€ νŒŒμΌμ„ κ°€μ Έμ˜¬ 수 μžˆλ‹€.

<template src="./templatye.html"></template>
<style src="./style.css"></style>
<script src="./script.js"></script>

src둜 κ°€μ Έμ˜€λŠ” 것은 webpack λͺ¨λ“ˆ μš”μ²­κ³Ό λ™μΌν•œ 경둜 확인 κ·œμΉ™μ„ λ”°λ¦…λ‹ˆλ‹€. 즉, λ‹€μŒμ„ μ˜λ―Έν•œλ‹€. μƒλŒ€ κ²½λ‘œλŠ” ./ 둜 μ‹œμž‘ν•΄μ•Ό ν•œλ‹€.


npm μ’…μ†μ„±μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

<!-- import a file from the installed "todomvc-app-css" npm package -->
<style src="./style.css"></style>

src κ°€μ Έμ˜€κΈ°λŠ” μ‚¬μš©μž μ •μ˜ λΈ”λ‘μ—μ„œλ„ μž‘λ™ν•©λ‹ˆλ‹€.

<unit-test src="./unit-test.js">
</unit-test>

CSS κΈ°λŠ₯


Scoped CSS
<style>νƒœκ·Έμ— scoped속성이 μžˆλŠ” 경우 ν•΄λ‹Ή CSSλŠ” ν˜„μž¬ μ»΄ν¬λ„ŒνŠΈμ˜ μš”μ†Œμ—λ§Œ μ μš©λœλ‹€.

<template>
  <p class="greeting">greeting</p>
</template>
<style scoped>
  .greeting{ color:red; font-weight:bold;}
</style>

μ›λ¦¬λŠ” PostCSS μ‚¬μš©ν•˜μ—¬ μ•„λž˜μ™€ 같이 λ³€ν™˜ λœλ‹€.

<template>
  <p class="greeting" data-v-7ba5bd90>greeting</p>
</template>
<style scoped>
  .greeting[data-v-7ba5bd90]{ color:red; font-weight:bold;}
</style>

CSS λͺ¨λ“ˆ
<style module>은 CSS λͺ¨λ“ˆλ‘œ 컴파일되고, CSS 클래슀 $style객체의 μ†μ„±μœΌλ‘œ λ…ΈμΆœν•œλ‹€.

<template>
  <p :class="$style.red">This should be red</p>
</template>
<style module>
  .red{ color: red;}
</style>

κ²°κ³Ό ν΄λž˜μŠ€λŠ” μΆ©λŒμ„ ν”Όν•˜κΈ° μœ„ν•΄ ν•΄μ‹œλ˜μ–΄ CSS λ²”μœ„λ₯Ό ν˜„μž¬ μ»΄ν¬λ„ŒνŠΈλ‘œλ§Œ μ§€μ •ν•˜λŠ” 것과 λ™μΌν•œ 효과λ₯Ό μ–»μŠ΅λ‹ˆλ‹€. μ „μ—­ μ˜ˆμ™Έ 및 ꡬ성과 같은 μžμ„Έν•œ λ‚΄μš©μ€ CSS λͺ¨λ“ˆ 사양을 μ°Έμ‘°
Custom Inject Name
λͺ¨λ“ˆ 속성에 값을 μ œκ³΅ν•˜μ—¬ μ£Όμž…λœ 클래슀 객체의 속성 ν‚€λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.

<template>
  <p :class="classes.red">red</p>
</template>
<style module="classes">
  .red{ color: red;}
</style>

v-bind() in CSS
SFC <style> νƒœκ·ΈλŠ” v-bind CSS κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ CSS 값을 동적 ꡬ성 μš”μ†Œ μƒνƒœμ— μ—°κ²°ν•˜λŠ” 것을 μ§€μ›ν•œλ‹€.

<template>
  <div class="text">hello</div>
</template>
<script>
	export default {
  		data(){
  			return{
  				color: 'red'
  			}
  		}
  	}
</script>

<style>
.text{ color: v-bind(color);}
</style>
profile
μ˜λ¬Έμ€ 'μ‚Άμ˜ μˆ˜μ€€'을 κ²°μ •ν•˜κ³ , μ§ˆλ¬Έμ€ 'μ‚Ά 자체'λ₯Ό λ°”κΎΌλ‹€.

0개의 λŒ“κΈ€