Vue 003 데이터 바인딩 001
재활용이 뛰어난 뷰 컴포넌트는 viues 폴더와 components 폴더에 주로 만들게 된다.
일단은 단방향 데이터 바인딩
- views 폴더에 넣을 vue 파일은 끝에 View로 이름을 맞춘다.
컴포넌트 만들기
- 빈 공간에 입력
template
//html
script
//javascript vue
style
//css-scoped
- 데이터 함수와 데이터를 추가해 준다.
<template>
</template>
<script>
export default {
data(){
return{
userName:"Sloth"
}
}
}
</script>
- vue에서는 데이터 함수를 만들때 function 키워드를 사용하지 않아도 된다.
- html 태그는 template 태그 안에 들어가면 된다.
- javascript 태그는 script태그 안에 들어가면 된다.
- css 는 style scoped 안에 들어가면 되는데 현재 함께 보이는 화면에만 적용이 된다.
다른 컴포넌트로 가면 적용이 안된다!- 다른 컴포넌트에도 적용시키고 싶다면 scoped 없이 css 적용을 하면되는데
주로 이렇게 하지 않고 따로 assets에 style을 정리해준다.
- 다른 컴포넌트에도 적용시키고 싶다면 scoped 없이 css 적용을 하면되는데
- vue는 html,js,css들어가는 부분을 완벽하게 분리해서 사용할 수 있다. - 대규모 서비스에 협업이 편하다.
- template태그 안에서태그들은 하나의 루트 태그안에 존재해야 한다.(뷰3에서는 에러가 안나는데 빨간불 신경쓰인다.)
컴포넌트를 재사용 하려면 뷰2에도 들어가야 할 때도 있지 않을까? 그냥 감싸주자.
귀찮으니까 스니펫 만들기
File>Preference>config User Snippets 메뉴
검색창에 vue 입력, vue.json선택
아래 코드 입력
"Generate Basic Vue Code": {
"prefix": "vue-start",
"body": [
"<template>\n\t<div></div>\n</template>\n<script>\nexport default {\n\tcomponents: {}, \n\tdata() {\n\t\treturn {\n\t\t\tsampleData: '*'\n\t\t}\n\t},\n\tsetup() {},\n\tcreated() {},\n\tmounted() {},\n\tunmounted() {},\n\tmethods:{}\n}\n</script>\n<style scoped>\n\n</style>" ],
"description": "펻 기본 스니펫"
}
문자열 바인딩
- js 함수 혹은 html태그에서 사용하려는 데이터가 있으면 그 모든 데이터는 data(){}함수 안에 정의 되어 있어야 한다
- 문자열 데이터 바인딩을 할 때는 중괄호 두개를 사용해서 데이터를 사용한다.
<template>
<div>
<!-- data함수 안에서 message키와 userName키를 사용해 데이터 가져오기 -->
<h1> {{message}} {{userName}} How are you?</h1>
<p></p>
</div>
</template>
<script>
export default {
data(){
return{
userName:"Sloth",
message:"Hi!",
...
라우터 등록(router/index.js)
{
path: '/databinding/string',
name: 'DataBindingStringView',
component: () => import(/* webpackChunkName: "databinding" , webpackPrefetch:true */ '../views/1_databinding/DataBindingStringView.vue')
}
맞게 한거 같은데 아무것도 출력이 되지 않는다 뭐가 문제일까?
vue-router.mjs:62 [Vue Router warn]: uncaught error during route navigation:
warn @ vue-router.mjs:62
triggerError @ vue-router.mjs:3237
eval @ vue-router.mjs:2993
Promise.catch (async)
pushWithRedirect @ vue-router.mjs:2988
push @ vue-router.mjs:2919
navigate @ vue-router.mjs:2036
callWithErrorHandling @ runtime-core.esm-bundler.js:276
callWithAsyncErrorHandling @ runtime-core.esm-bundler.js:284
invoker @ runtime-dom.esm-bundler.js:472
vue-router.mjs:3239 TypeError: Cannot use 'in' operator to search for 'catch' in undefined
at extractComponentsGuards (vue-router.mjs:1950:32)
at eval (vue-router.mjs:3092:16)
아니 왜 이런 바보짓을 했는지 모르겠는데 component import 하는데 중괄호로 감싸줬었다. 왜 그랬지? 해제해 주니까 잘된다.
/*잘못된 예
{
path: '/databinding/string',
name: 'DataBindingStringView',
component: () => {import(/* webpackChunkName: "databinding" , webpackPrefetch:true */ '../views/1_databinding/DataBindingStringView.vue') }
}
*/
/* 잘된 예*/
{
path: '/databinding/string',
name: 'DataBindingStringView',
component: () => import(/* webpackChunkName: "databinding" , webpackPrefetch:true */ '../views/1_databinding/DataBindingStringView.vue')
}
그래 수정하니까 잘 나온다
데이터 바인딩이 왜 중요한가?
vue를 이용하지 않고 바닐라js를 사용해서 서버로 부터 가져온 데이터(가정)를 화면에 넣어 주려면
태그에 id를 주고 Dom 다루는 js를 많~~~~이 짜야하는데 vue에서는 중괄호 두개로 컨트롤 할 수 있다.
html바인딩
스니펫 써서 편하게 불러오자
<template>
<div></div>
</template>
<script>
export default {
components: {},
data() {
return {
sampleData: '*'
}
},
setup() {},
created() {},
mounted() {},
unmounted() {},
methods:{}
}
</script>
<style scoped>
</style>
- 이런식으로 하면 되나?
이건 string으로 들어가는건데 되나? 라우터 등록해서 확인해보자
//index.js
{
path: '/databinding/html',
name: 'DataBindingHtmlView',
component: () => import(/* webpackChunkName: "databinding", webpackPrefetch:true */ '../views/1_databinding/DataBindingHtmlView.vue')
}
//App.vue
<template>
<div>
<nav>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link> |
<router-link to="/databinding/string">String</router-link> |
<router-link to="/databinding/html">HTML</router-link>
</nav>
.
.
.
메뉴는 잘 나왔는데 태그는 그대로 String으로 나온다.
그렇다 html태그는 중괄호 두개로 넣어주면 안된다.
Vue에는 v-directive가 있다. html을 위해서는 v-html="키값"을 사용하면 된다.
<template>
<div>
<div>{{htmlString}}</div>
<div v-html="htmlString"></div>
</div>
</template>
결과
여기까지 서버에서 가져온 데이터(가정)을 화면에 뿌리는 단방향데이터 바인딩이었다.
양방향 데이터 바인딩은 사용자가 서버로, 서버에서 사용자로 상호작용할 수 있게 하는 것. 내일 합니다!
학원다닐때 강사님께 질문한게 있었다. vue나 react를 사용하면 더 쉽게 페이지를 만들 수 있고 팀플레이 하기 좋나요?
강사님의 대답은 아니오였다.
현재까지 배운 상황에서 내 대답은 강사님은 틀렸다는거다. vue나 react를 사용하는 이유가 있다.