■■▶뷰_Vue.js◀( 2024. 6. 9. 09:40

 

1. Directive ?

디렉티브란 HTML 태그 안에 v- 접두사를 가지는 모든 속성을 의미합니다. 주로 사용되는 directive에 대해서 예를 들어가며 하나씩 알아보도록 하죠. 더 많은 directive가 있지만 필수적인 것들을 위주로 살펴보겠습니다.

1.1 v-text, v-html directive

데이터를 출력하기 위해서는 일반적으로 {{ }} (콧수염 문법)를 이용해요. 그런데 이거 말고 데이터를 출력하기 위한 directive가 따로 존재해요!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <h2>{{ message }}</h2>
        <h2 v-text="message"></h2>
        <h2 v-html="message"></h2>
    </div>

    <script src='https://unpkg.com/vue'></script>
    <script>
        var vm = Vue.createApp({
            name: 'App',
            data() {
                return {
                    message: '<i>안녕하세요!</i>'
                }
            }
        }).mount('#app')

    </script>
</body>
</html>

 

 

 

1.2 v-bind directive

v-bind directive는 Element의 속성(attribute)을 바인딩 하기 위해 사용합니다.

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        데이터 입력 : <input type="text" v-bind:value="msg">
        <br><br>        
        <img :src="imgPath">
    </div>
    <script src='https://unpkg.com/vue'></script>
    <script>
        const vm = Vue.createApp({
            name: 'App',
            data() {
                return {
                    msg: 'v-bind directive예요!',
                    imgPath: 'https://images.unsplash.com/photo-1532974297617-c0f05fe48bff?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8MXx8fGVufDB8fHx8fA%3D%3D'
                }
            }
        }).mount('#app')
    </script>
</body>
</html>


위와 같이 v-bind directive를 통해 HTML Element의 속성이 변경된것을 확인할 수 있습니다.

이러한 기법을 데이터 바인딩 이라고 부릅니다. 많이 사용하는 방법인데 v-bind를 항상 명시하려다보니 너무 깁니다. 그래서 줄여쓰는 방법이 있는데 v-bind를 생략하는 것입니다. 즉, 아래와 같이 사용하면 됩니다.

한가지 주의해야 할 점은 v-bind는 단방향으로만 데이터를 바인딩합니다.

즉, Vue instance의 데이터나 속성이 바뀌면 UI를 갱신하게 되는데 반대로 화면의 바인딩된 요소에서 값을 변경하더라고 데이터가 바뀌는지 않는다는 것입니다. 이를 단방향 데이터 바인딩 이라고 합니다.

1.3 v-model directive

앞에서 살펴본 directive는 모두 단방향 데이터 바인딩을 지원합니다. 하지만 사용자로부터 입력값을 받고 싶은 경우에는 양방향 데이터 바인딩을 사용하면 편리합니다. 이럴때 사용하는 directive가 바로 v-model directive입니다.

기본코드부터 알아보아요!

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div>
            데이터 입력 : <input type="text" v-model="msg">
        </div>
    </div>
    <script src='https://unpkg.com/vue'></script>
    <script>
        const vm = Vue.createApp({
            name: 'App',
            data() {
                return {
                    msg: 'v-bind directive예요!'
                }
            }
        }).mount('#app')
    </script>
</body>
</html>

 

 

많이 사용하는 기능이기 때문에 다른예제 하나만 더 해보아요!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div>
            <h2>취미생활</h2>
            <input type="checkbox" id="hobbyA" 
            v-model="hobby" value="A">
            <label for="hobbyA">운동</label>
            <br>
            <input type="checkbox" id="hobbyB"
            v-model="hobby" value="B">
            <label for="hobbyB">독서</label>
            <br>
            <input type="checkbox" id="hobbyC"
            v-model="hobby" value="C">
            <label for="hobbyC">음악</label>
            <br>
            <input type="checkbox" id="hobbyD"
            v-model="hobby" value="D">
            <label for="hobbyD">영화</label>
            <br>
            <br><br>
            <select v-model="category">
                <option value="code1">가전</option>
                <option value="code2">음식</option>
                <option value="code3">여행</option>
            </select>
        </div>
    </div>
    <script src='https://unpkg.com/vue'></script>
    <script>
        const vm = Vue.createApp({
            data() {
                return {
                    hobby: [],
                    category: ''
                }
            }
        }).mount('#app')
    </script>
</body>
</html>


 

 

1.4 조건 렌더링(v-show)

v-show는 화면에 보여줄지 말지를 결정하는 directive입니다. 렌더링은 수행(즉, HTML 요소는 생성)하지만 화면에 보여주지 않을 수 있다는 거죠.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div>
            예금액 : <input type="text" v-model="amount">
            <br><br>
            현재 금액 : <span v-text="amount"></span>
            <br><br>
            대출 잔여 : <span v-text="amount" v-show="amount > 0"></span>
        </div>
    </div>
    <script src='https://unpkg.com/vue'></script>
    <script>
        const vm = Vue.createApp({
            data() {
                return {
                    amount: 0
                }
            }
        }).mount('#app')
    </script>
</body>
</html>

 

1.5 v-if, v-else, v-else-if directive

v-if는 조건에 부합되지 않을 경우 렌더링을 수행하지 않습니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div>
            잔고: <input type="text" v-model="balance">
            <br><br>
            회원등급:
            <span v-if="balance >= 1000000">Gold</span>
            <span v-else-if="balance >= 100000">Silver</span>
            <span v-else-if="balance >= 10000">Bronze</span>
            <span v-else>Basic</span>
        </div>
    </div>
    <script src='https://unpkg.com/vue'></script>
    <script>
        const vm = Vue.createApp({
            data() {
                return {
                    balance: 0
                }
            }
        }).mount('#app')
    </script>
</body>
</html>

 

1.6 v-for directive

반복적인 데이터를 렌더링하기 위해서 v-for directive를 사용합니다. 사용하는 방법은 JavaScript의 for문과 유사합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <table border="1">
            <thead>
                <tr>
                    <th>순번</th>
                    <th>번호</th>
                    <th>이름</th>
                    <th>전화번호</th>                    
                </tr>
            </thead>
            <tbody>
                <tr v-for="(contact, idx) in contacts" :key="contact.no">
                    <td>{{ idx + 1 }}</td>
                    <td>{{ contact.no }}</td>
                    <td>{{ contact.name }}</td>
                    <td>{{ contact.mobile }}</td>
                </tr>
            </tbody>
        </table>
    </div>
    <script src='https://unpkg.com/vue'></script>
    <script>
        const vm = Vue.createApp({
            data() {
                return {
                    contacts: [{
                        no: 1000,
                        name: '홍길동',
                        mobile: '010-1111-2222'
                    },{
                        no: 2000,
                        name: '신사임당',
                        mobile: '010-3333-4444'
                    },{
                        no: 3000,
                        name: '강감찬',
                        mobile: '010-5555-6666'
                    }]
                }
            }
        }).mount('#app')
    </script>
</body>
</html>

 

+++++++

 

'■■▶뷰_Vue.js◀(' 카테고리의 다른 글

08-Vue.js / vue-router  (0) 2024.06.09
07-Vue.js / Single File Component  (0) 2024.06.09
05-Vue.js / Component Communication  (0) 2024.06.08
04-Vue.js / Component  (0) 2024.06.08
03-Vue.js / Instance  (0) 2024.06.08
posted by [서ㄹ하 雪河 Selha YoonSem]
: