Vue 기초 - newlife-js/Wiki GitHub Wiki
https://vuejs.org/ 에서 검색
// Vue library를 CDN 방식으로 설치하는 script
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
new Vue(){
el: '#app',
data: {
message: 'hi',
num: 10
}
};
new Vue({
el: '#app',
// 지역 컴포넌트 등록 방식
components: {
// '컴포넌트 이름': 컴포넌트 내용,
'app-footer': {
template: '<footer>footer</footer>'
}
},
});
<div id="app">
<app-header v-bind:propsdata="message"></app-header>
</div>
var appHeader = {
template: '<h1>{{ propsdata }}</h1>',
props: ['propsdata']
}
<div id="app">
<app-header v-on:pass="logText"></app-header>
</div>
var appHeader = {
template: '<button v-on:click="passEvent">click me</button>',
methods: {
passEvent: function() {
this.$emit('pass');
}
}
}
// router 설치(CDN)
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<div>
// a tag와 같음
<router-link to="/login">Login</router-link>
</div>
// router-link에서 클릭된 페이지(component)를 router-view에 표시
<router-view></router-view>
</div>
var LoginComponent = {
template: '<div>login</div>'
}
var router = new VueRouter({
// 페이지의 라우팅 정보
routes: [
{
// 페이지의 url
path: '/login',
// name: 'login',
// 해당 url에서 표시될 컴포넌트
component: LoginComponent
}
]
});
new Vue({
el: '#app',
router: router,
});
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
new Vue({
el: '#app',
data: {
users: []
},
methods: {
getData: function() {
var vm = this;
axios.get('https://jsonplaceholder.typicode.com/users/')
.then(function(response) {
console.log(response.data);
vm.users = response.data;
// 이 안에서 this를 직접 쓰면 axios 내의 this이므로 변수로 만들어서 쓴다.
})
.catch(function(error) {
console.log(error);
});
}
}
})
<div> {{ message }} </div>
- computed 속성 : data 변수에 logic을 더한 값
<div>{{ doubleNum }}</div>
new Vue({
el: '#app',
data:{
num: 10,
uuid: 'abc1234'
},
computed:{
doubleNum: function(){
return this.num * 2;
}
}
})
- v-bind:id="someid" -> someid에 정의된 값이 id로 변환되어 바인딩됨
id를 class 등으로 바꿔 쓸 수 있음
// 아래 두 line은 같은 것을 뜻함.
// data 내부의 uuid가 바뀌면 p tag의 id도 변경됨.
<p v-bind:id="uuid">{{ num }}</p>
<p id="abc1234">{{ num }}</p>
<div>
Hello <span v-if="show">Vue.js</span>
</div>
- v-if는 아예 DOM이 사라지지만, v-show는 style="display: none;"인 상태로 남아있음.
<div id="app">
<p v-bind:id="uuid" v-bind:class="name">{{ num }}</p>
<p id="abc1234">{{ num }}</p>
<p>{{ doubleNum }}</p>
<div v-if="loading">
Loading...
</div>
<div v-else>
test user has been logged in
</div>
<div v-show="loading">
Loading...
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data:{
num: 10,
uuid: 'abc1234',
name: 'text-blue',
loading: true
},
computed:{
doubleNum: function(){
return this.num * 2;
}
}
})
</script>
methods:{메소드이름 : function(){}, }
<button v-on:click="메소드이름 ">click me</button>
<input type="text" v-on:keyup.enter="메소드이름 ">
특정 data 변수가 바뀔 때마다 method를 실행할 수 있도록 하는 속성
data:{
num: 10,
},
watch: {
num: function() {
this.logText();
},
num: function(newValue, oldValue) { // 바뀐 값을 newValue, 이전 값을 oldValue로 받을 수 있음
this.fetchUserByNumber(newValue);
}
},
methods:{
addNum: function() {
this.num += 1;
},
logText: function() {
console.log('changed');
}
}
- computed에 비해 더 무거운 함수를 다룰 때 씀 참고자료
data가 바뀌었을 때 logic을 구현할 수도 있지만, 메소드를 class binding으로 받을 수도 있음.
<style>
.warning {
color: red;
}
</style>
</head>
<body>
<div id="app">
<p v-bind:class="errorTextColor">Hello</p> // 아래와 같음
<p v-bind:class="{ warning : isError }">Hello</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
isError: false
},
computed: {
errorTextColor: function() {
return this.isError ? 'warning' : null;
}
}
});
</script>
-
vue 관련 명령어 실행 위한 패키지
-
설치 :
npm install -g @vue/cli
vue create '프로젝트 이름'
※cli 4.X 버전에서는 create했을 때 2버전을 선택해야함.
Vue CLI v4.5.14
? Please pick a preset: Default ([Vue 2] babel, eslint)
npm run serve
== vue-cli-service serve
@package.json
-
빌드된 파일은 public/index.html의 body에 inject됨.
-
@src/main.js
new Vue({
render: h => h(App), //import한 App(from ./app.vue)이라는 component를 연결함
}).$mount('#app')
$mount('#app') == el:'#app'
- .vue 파일(싱글 파일 컴포넌트) : HTML, Javascript, CSS를 한 파일에 정의
- vu + tab 입력
<template>
<!-- HTML -->
</template>
<script>
export default {
// Javascript
}
</script>
<style>
/* CSS */
</style>
@App.vue
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/> // == <hello-world> </hello-world>
</div>
</template>
import HelloWorld from './components/HelloWorld.vue'
export default {
// 인스턴스 옵션 속성 or 컴포넌트 옵션 속성
name: 'App',
components: {
HelloWorld // == 'hello-world' : HelloWorld
}
}
- Vue 인스턴스와 다르게 data를 선언할 때에 function return을 이용해야 함
<script>
export default {
data: function(){
return {
str: 'hi'
}
}
}
</script>
- Components
- Component 폴더 내의 .vue 파일들은 camel case를 써야 함. -> tag 이름이 ㅁㅁ-OO 되도록 두단어로 쓰는게 좋음.
※ button의 type을 submit으로 하면 상위 form으로 이벤트 버블링이 일어남.
form의 submit 동작은 새로고침이 default임.
이를 막기 위해서는
event.preventDefault();
또는 v-on:submit.prevent="submitForm"과 같이 .prevent를 붙여준다.