
템플릿 문법 : HTML을 확장하여 데이터 바인딩, 조건부 렌더링, 반복 렌더링 등 다양한 기능 제공
1. data()
- Vue.js 데이터 속성 정의와 반환
data(){
return{
// 오브젝트 형태(키와 값)로 반환
}:
}
or
data:()⇒{
}
<script>
export default {
name: 'App', // 컴포넌트의 이름
// 여기서는 컴포넌트들을 등록
components: {},
// 컴포넌트의 데이터는 data() 메소드 안에 정의
data() {
return { // 오브젝트 형태로 반환
animal: 'Cat' // 'animal'이라는 키에 'Cat'이라는 값을 저장
};
}
}
</script>
- 변수를 화면에 연결하기
- mustache 문법
{{ 변수명}}
<!--HTML 코드 작성-->
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1> // mustache 문법
</template>

2. v-text
- HTML 요소의 텍스트 콘텐츠만을 설정
- 태그 안에 다른 HTML 요소나 텍스트를 삽입하면 오류가 발생

<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<h3 v-text="food"></h3>
</template>

- input 태그
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" />
</template>

3. v-model
- 직접 input 태그의 값을 바꿔도 적용됨
- 상태 관리가 되고 있음
- 복잡한 JS 코드 없이 손 쉽게 데이터를 업데이트 하고 공유하는 것끼리 연결 가능
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
</template>

- 직접 웹에서 내용을 바꿀 경우 상태 관리됨

4. v-html
- 태그 자체를 가져와서 보여주고 싶을 경우 사용
- 확실하게 믿을 수 있는 경우에만 사용하기
- 보안 문제
- HTML을 직접 삽입
- 사용자 입력을 HTML로 렌더링할 때 XSS(교차 사이트 스크립팅) 공격에 취약할 수 있음
- HTML 인젝션
- 외부 소스에서 HTML 콘텐츠를 삽입할 때는 반드시 신뢰할 수 있는지 확인 필수
- 불필요한 HTML 태그나 악성 스크립트가 포함되어 있을 수 있기 때문에 주의
- 성능 문제
- 대량의 HTML 콘텐츠를
v-html
로 삽입하면 렌더링 성능에 영향을 줄 수 있음
- 그냥 사용하면 String으로 인식됨
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<div>{{ alertMessage }}</div> <!--String으로 인식됨-->
</template>

- 태그로 인식됨
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<div v-html="alertMessage"></div> <!--String으로 인식됨-->
</template>


5. v-bind
- 이미지를 동적으로 연결
- Pexels에서 제공하는 이미지 URL
https://images.pexels.com/photos/247599/pexels-photo-247599.jpeg
<!--HTML 코드 작성-->
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<div v-html="alertMessage"></div>
<img v-bind:src="imageSource" alt="random">
</template>
<!--Java Script 코드 작성-->
<script>
export default {
name: 'App', // 컴포넌트의 이름
// 여기서는 컴포넌트들을 등록
components: {},
// 컴포넌트의 데이터는 data() 메소드 안에 정의
data() {
return { // 오브젝트 형태로 반환
animal: 'Cat', // 'animal'이라는 키에 'Cat'이라는 값을 저장
food: 'fish',
alertMessage: '<h2>경고!!!</h2>',
imageSource: 'https://images.pexels.com/photos/247599/pexels-photo-247599.jpeg' // Pexels에서 제공하는 이미지 URL
};
}
}
</script>

- v-bind 생략가능
:href=""
<!--HTML 코드 작성-->
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<div v-html="alertMessage"></div>
<a :href="naverUrl">naver</a>
<img v-bind:src="imageSource" alt>
</template>
<!--Java Script 코드 작성-->
<script>
export default {
name: 'App', // 컴포넌트의 이름
// 여기서는 컴포넌트들을 등록
components: {},
// 컴포넌트의 데이터는 data() 메소드 안에 정의
data() {
return { // 오브젝트 형태로 반환
animal: 'Cat', // 'animal'이라는 키에 'Cat'이라는 값을 저장
food: 'fish',
alertMessage: '<h2>경고!!!</h2>',
imageSource: 'https://images.pexels.com/photos/247599/pexels-photo-247599.jpeg', // Pexels에서 제공하는 이미지 URL
naverUrl: 'https://www.naver.com'
};
}
}
</script>

<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<div v-html="alertMessage"></div>
<a :href="naverUrl">{{food}}</a>
<img v-bind:src="imageSource" alt="random">
</template>

<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<a :href="food">{{food}}</a>
</template>

6. class
- 동적으로 class를 부여하는 방법
- CSS class 준비
<!--CSS 코드 작성-->
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
input{
font-size: 20px;
}
.orange {
color: orange;
}
.salmon {
color: salmon;
}
.blue{
color: blue;
}
.not-good {
text-decoration: line-through;
}
</style>
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<a :href="naverUrl">{{food}}</a>
<hr /> <!--종료 태그가 없는 태그 작성하는 방법-->
<h2 class="red">고양이는 {{ food }}를 좋아합니다</h2>
</template>

- 색깔을 동적으로 부여하기
- 배열 문법을 사용하여 클래스 바인딩
<h2 :class="[food === 'fish' ? 'blue' : '', 'common-class']">
- 오브젝트를 사용하여 클래스 바인딩
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<a :href="naverUrl">{{food}}</a>
<hr /> <!--종료 태그가 없는 태그 작성하는 방법-->
<h2 v-bind:class="{blue: food == 'fish' }">고양이는 {{ food }}를 좋아합니다</h2>
</template>


- class 명에 -이 들어간 것은 ‘’처리 해주면 인식됨
<template>
<img alt="Vue logo" src="./assets/logo.png">
<H1>Hello~ {{ animal }}</H1>
<H2>고양이는 {{ food }}을 좋아합니다</H2>
<input type="text" v-model="food"/>
<a :href="naverUrl">{{food}}</a>
<hr /> <!--종료 태그가 없는 태그 작성하는 방법-->
<h2 v-bind:class="{blue: food == 'fish', 'not-good': food =='cookie' }">고양이는 {{ food }}를 좋아합니다</h2>
</template>

Share article