본문 바로가기

Vue.js

데이터 바인딩

을 읽고 메모용으로 작성한 글.

자세한 설명없이 코드만으로 어떤 구조인지 알 수 있다...

데이터 바인딩을 하는 여러 방법들


Text 데이터 바인딩

DataBinding.vue

<template>
    <h1>
        Hello, {{title}}!
    </h1>
</template>

<script>
export default {
    data() {
        return {
            title: 'World'
        };
    }
}
</script>

data()에 정의된 title {{title}}이 바인딩되어 Hello, World가 출력된다.

index.js에 해당 내용을 추가

import DataBinding from '../views/DataBinding.vue'

const routes = [
  {
    path: '/dataBinding',
    name: 'DataBinding',
    component: DataBinding
  }
]

App.vue에 해당 내용울 추가하여 바인딩이 되었는지 확인할 수 있다.

<router-link to="/dataBinding">Data Binding</router-link>


raw html 데이터 바인딩

v-html을 이용하여 String으로 이루어진 html 문법을 바인딩할 수 있다.

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

<script>
export default {
    data() {
        return {
            htmlString: '<p style="color:blue;">blue</p>'
        };
    }
}
</script>


Form 입력 데이터 바인딩

<template>
    <div>
        <input type="text" v-model="valueModel" />
    </div>
</template>

<script>
export default {
    data() {
        return {
            valueModel: 'Form input test'
        };
    }
}
</script>

<template>
    <div>
        <input type="number" v-model.number="numberModel" />
    </div>
</template>

<script>
export default {
    data() {
        return {
            numberModel: 27
        };
    }
}
</script>


Textarea 데이터 바인딩

<template>
    <div>
        <textarea v-model="message"></textarea>
    </div>
</template>

<script>
export default {
    data() {
        return {
            message: "test text area"
        };
    }
}
</script>


Select 데이터 바인딩

<template>
    <div>
        <select v-model="abc">
            <option value="01">A</option>
            <option value="02">B</option>
            <option value="03">C</option>
        </select>
    </div>
</template>

<script>
export default {
    data() {
        return {
            abc: "03"
        };
    }
}
</script>


Check box 데이터 바인딩

<template>
    <div>
        <label><input type="checkbox" v-model="checked">{{checked}}</label>
    </div>
</template>

<script>
export default {
    data() {
        return {
            checked: true
        };
    }
}
</script>


Radio 데이터 바인딩

<template>
    <div>
        <label><input type="radio" v-bind:value="radio1" v-model="picked">A</label>
        <label><input type="radio" v-bind:value="radio2" v-model="picked">B</label>
        <label><input type="radio" v-bind:value="radio3" v-model="picked">C</label>
        <br>
        <span>선택 : {{picked}}</span>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                picked: '',
                radio1: 'A',
                radio2: 'B',
                radio3: 'C',
            };
        }
    }
</script>


 

img 객체의 src에 바인딩

<template>
    <div>
        <img v-bind:src="imgSrc" />
    </div>
</template>

<script>
export default {
    data() {
        return {
            imgSrc: "https://avatars.githubusercontent.com/u/6128107?s=200&v=4"
        };
    }
}
</script>


button 객체의 비활성화

text가 없는 상태일 경우 버튼을 disabled 상태로 만든다.

<template>
    <div>
        <input type="text" v-model="textValue" />
        <button type="button" v-bind:disabled="textValue==''">Click</button>
    </div>
</template>

<script>
export default {
    data() {
        return {
            textValue: ""
        };
    }
}
</script>

폼에 입력을 하자 Click 버튼이 활성화되는 것을 볼 수 있다.


Class에 바인딩

<template>
    <div class="container" v-bind:class="{
        'active': isActive, 'text-red': hasError
    }">Class Binding</div>
</template>

<script>
export default {
    data() {
        return {
            isActive: true,
            hasError: false
        };
    }
}
</script>

<style scoped>
    container {
        width: 100%;
        height: 200px;
    }
    .active {
        background-color: aquamarine;
        font-weight: bold;
    }
    .text-red {
        color: red;
    }
</style>

<template>
    <div class="container" v-bind:class="[activeClass, errorClass]">Class Binding</div>
</template>

<script>
export default {
    data() {
        return {
            activeClass: 'active',
            errorClass: 'text-red'
        };
    }
}
</script>

<style scoped>
    container {
        width: 100%;
        height: 200px;
    }
    .active {
        background-color: aquamarine;
        font-weight: bold;
    }
    .text-red {
        color: red;
    }
</style>

 


Style 바인딩

<template>
    <div v-bind:style="styleObject">Style Binding</div>
</template>

<script>
export default {
    data() {
        return {
            styleObject: {
                color: 'blue',
                fontsize: '14px'
            }
        };
    }
}
</script>

<template>
    <div v-bind:style="[baseStyle, addStyle]">Style Binding</div>
</template>

<script>
export default {
    data() {
        return {
            baseStyle: 'background-color:cyan;width:100%;height:200px;',
            addStyle: 'color:blue;font-weight:bold;'
        }
    }
}
</script>


v-for 디렉티브를 이용한 배열 바인딩

<template>
    <div>
        <table>
            <thead>
                <tr>
                <th>학번</th>
                <th>이름</th>
                <th>학년</th>
                <th>성별</th>
                <th>이메일</th>
                <th>소속</th>
                <th>취미</th>
            </tr>
            </thead>
            <tbody>
                <tr :key="i" v-for="(info, i) in infoList">
                    <td>{{info.id}}</td>
                    <td>{{info.name}}</td>
                    <td>{{info.grade}}</td>
                    <td>{{info.gender}}</td>
                    <td>{{info.email}}</td>
                    <td>{{info.department}}</td>
                    <td>{{info.hobby}}</td>
                </tr>
            </tbody>
        </table>
    </div>
</template>

<script>
export default {
    data() {
        return {
            infoList: [
                {
                    "id":"2023100100",
                    "name":"aufsprit",
                    "grade":1,
                    "gender":"male",
                    "email":"test@test.test",
                    "department":"computer engineering",
                    "hobby":"coding, game"
                },
                {
                    "id":"2023100122",
                    "name":"test",
                    "grade":1,
                    "gender":"female",
                    "email":"test3@test.test",
                    "department":"computer engineering",
                    "hobby":"cooking"
                },
            ]
        };
    }
}
</script>

<style scoped>
    table {
        font-family: arial, sans-serif;
        border-collapse: collapse;
        width: 100%;
    }
    td, th {
        border: 1px solid #dddddd;
        text-align: left;
        padding: 8px;
    }
</style>


v-if, v-show

<template>
    <div>
        <h1 v-if="type=='A'">A</h1>
        <h1 v-else-if="type=='B'">B</h1>
        <h1 v-else>C</h1>
    </div>
</template>

<script>
export default {
    data() {
        return {
            type: 'A'
        };
    }
}
</script>

<template>
    <div>
        <h1 v-show="Show">Show가 true일 경우에 블록이 보임</h1>
    </div>
</template>

<script>
export default {
    data() {
        return {
            Show: true
        };
    }
}
</script>

Show: false이면 v-show의 블록이 보이지 않게 된다.

v-ifv-show의 차이

v-if는 조건이 만족할 경우 생성되지만

v-show의 블록은 미리 생성되어 조건에 만족할 경우에만 보인다.


v-on

<template>
    <div>
        <button tpye="button" @click="count">Click</button>
        <p>click count: {{counter}}</p>
    </div>
</template>

<script>
export default {
    data() {
        return {
            counter: 0
        };
    },
    methods: {
        count() {
            this.counter = this.counter + 1;
        }
    }
}
</script>


change 이벤트

<template>
    <select v-model="selectedValue" @change="changeSelect">
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
    </select>
</template>

<script>
export default {
    data() {
        return {
            selectedValue: ''
        };
    },
    methods: {
        changeSelect() {
            alert(this.selectedValue);
        }
    }
}
</script>

 


key 이벤트

<template>
    <div>
        <input @click.ctrl="clickCtrl" @keyup.esc="esc" />
    </div>
</template>

<script>
export default {
    methods: {
        esc() {
            alert("esc를 누르셨습니다.");
        },
        clickCtrl() {
            alert("click과 ctrl을 누르셨습니다.")
        }
    }
}
</script>


computed, watch

<template>
    <h1>name: {{fullname}}</h1>
</template>

<script>
export default {
    data() {
        return {
            first: 'John',
            last: 'Doe'
        };
    },
    computed: {
        fullname() {
            return this.first + ' ' + this.last;
        }
    }
}
</script>

<template>
    <h1>name: {{fullname}}</h1>
    <button type="button" @click="changeName">Click</button>
</template>

<script>
export default {
    data() {
        return {
            first: 'John',
            last: 'Doe',
            fullname: ''
        };
    },
    watch: {
        first() {
            this.fullname = this.first + ' ' + this.last;
        },
        last() {
            this.fullname = this.first + ' ' + this.last;
        }
    },
    methods: {
        changeName() {
            this.first = 'Jane';
            this.last = 'Smith';
        }
    }
}
</script>


클릭을 하게 되면 changeName() 메소드가 적용이 되어 watch가 적용이 된다.


 

 

'Vue.js' 카테고리의 다른 글

postman을 사용하여 API 테스트하기 - 2  (0) 2023.03.07
postman을 사용하여 API 테스트하기 - 1  (0) 2023.03.07
Vue.js와 Spring Boot 연결  (0) 2023.02.19