<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
let vm = new Vue({});
let vm = new Vue({
el: '#app',
data: {
message:'hi'
},
methods:{},
created function(),
});
<div id="app">
<app-header></app-header>
<app-content></app-content>
<app-footer></app-footer>
</div>
<script>
//전역 컴포넌트
Vue.component('app-header', {
template:'<h1>Header</h1>'
});
Vue.component('app-content',{
template:'<div>content</div>'
});
new Vue({
el: '#app',
//지역 컴포넌트
components: {
// '컴포넌트 이름':'컴포넌트 내용',
'app-footer' : {
template : '<footer>footer</footer>'
}
}
});
</script>
전역 컴포넌트는 모든 인스턴스에 적용가능하고, 지역 컴포넌트는 인스턴스에 컴포넌트를 입력해줘야 한다.
상위컴포넌트는 하위컴포넌트로 props를 전달 하위 컴포넌트는 상위로 이벤트를 전달 합니다.
<div id="app">
<!-- <app-header v-bind:프롭스 속성이름 = "상위 컴포넌트의 데이터 이름"></app-header> -->
<app-header v-bind:propsdata = "message"></app-header> <!-- h1 -->
<app-content v-bind:propsdata = "num"></app-content> <!-- 10 -->
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 컴포넌트
let appHeader ={
template: '<h1>{{propsdata}}</h1>',
props: ['propsdata']
}
//컴포넌트
let appContent = {
template : '<div>{{propsdata}}</div>',
props: ['propsdata']
}
new Vue({
el:'#app',
components:{
'app-header' : appHeader,
'app-content' : appContent
},
data : {
message: 'h1',
num:10
}
});
</script>
<script src='https://unpkg.com/vue-router@4.1.6/dist/vue-router.global.js'></script>
npm install vue-router@4
※ 자바스크립트 비동기처리와 콜백함수란?
비동기 처리란?
먼저 실행된 코드가 종료될때까지 기다리지않고 다음 코드로 넘어가 실행되는 것
콜백함수
데이터가 준비된 시점에서만 동작하는 함수
크롬 개발자도구 네트워크를 통해 응답을 볼 수 있다.
data를 받아오는 태그
예제)
<p v-bind:id="uuid" v-bind:class="name">{{num}}</p>
<div v-if="loding"> loding...</div>
<div v-else>user login</div>
<div v-show="loding">
v-show는 false일때 display:none
</div>
기존에 있는 요소를 재사용 할때 사용한다.
가벼운 값을 계산할때 주로 사용합니다.
new Vue({
el:'#app',
data: {
num: 10,
},
computed:{ // 기존에 있는 요소를 재사용할때
doubleNum: function(){
return this.num*2;
}
}
})
데이터가 수정될때 마다 watch에서 속성이 동작 합니다.
무거운 코드를 작동할때 주로 사용합니다.
new Vue({
el:'#app',
data:{
num: 10,
},
watch:{
num : function(){ //num이 변경될때마다 함수실행
this.logText();
},
},
methods:{
addNum : function(){
this.num = this.num + 1
},
logText : function(){
console.log('정상적으로 변경됨');
}
}
})
computed vs watch 공식문서
대부분 가벼운건 computed로 직관적으로 처리 하는게 좋다
Vue CLI 링크 : https://cli.vuejs.org/
//버전확인
node -v
npm -v
//vue installation
npm install -g @vue/cli
//설치할떄 사용자 권환이 없는경우 이렇게 설치
sudo npm install -g @vue/cli
위 방법으로 설치된 vue 패키지는 아래의 루트에 설치된다
%USERPROFILE%\AppData\Roaming\npm\node_modules
//vue create 프로젝트명
vue create vue-cli
// 프로젝트로 이동후 실행
cd vue-cli
npm run serve
//서버 종료 단축키
ctrl + c
※ 웹팩에 대한 공부 필수
<template>
<div>{{ str }}</div>
</template>
<script>
//함수 리턴으로 문법 정의
export default {
data : function(){
return {
str: 'hi',
}
}
}
</script>
<style>
</style>
<script>
// import 변수명 form '상대값 경로';
import AppHeader from './components/AppHeader.vue';
export default {
data : function(){
return {
str: 'hi',
}
},
components:{
'app-header' : AppHeader
// <app-header></app-header> 에 출력
}
}
</script>
//App.vue 파일
<template>
<div>{{ str }}
<!-- <app-header v-bind:props 속성 이름="상위 컴포넌트의 데이터 이름"></app-header> -->
<app-header v-bind:propsdata="str"></app-header>
</div>
</template>
<script>
// import 변수명 form '상대값 경로';
import AppHeader from './components/AppHeader.vue';
export default {
data : function(){
return {
str: 'hi',
}
},
components:{
'app-header' : AppHeader
}
}
</script>
AppHeader로 props 내리기 >
//AppHeader.vue 파일
<template>
<header>
<h1>{{propsdata}}</h1>
</header>
</template>
<script>
export default {
props:['propsdata']
}
</script>
<style>
</style>
propsdata에 str을 저장하여 출력한다
하위 컴포넌트에서 this.$emit('이벤트 명') 으로 상위 컴포넌트로 이벤트를 전달 하여 v-on:event명 = '실행 함수명' 으로 이벤트를 받고 출력한다.
// AppHeader.vue (app.vue의 하위 컴포넌트)
<template>
<header>
<h1>{{propsdata}}</h1>
<button v-on:click="eventSend">event send</button>
</header>
</template>
<script>
export default {
props:['propsdata'],
methods:{
eventSend: function(){
// this.$emit('전달할 이벤트명');
this.$emit('newData');
}
}
}
</script>
-> 상위 컴포넌트로 이벤트 전달
<template>
<div>{{ str }}
<!-- <app-header v-bind:프롭스 속성 이름="상위 컴포넌트의 데이터 이름"></app-header> -->
<app-header
v-bind:propsdata="str"
v-on:newData="renewStr"
></app-header>
<!--
event 받기
v-on:event명 = '실행 함수명'
-->
</div>
</template>
<script>
// import 변수명 form '상대값 경로';
import AppHeader from './components/AppHeader.vue';
export default {
data : function(){
return {
str: 'hi',
}
},
components:{
'app-header' : AppHeader
},
methods:{
renewStr : function(){
this.str = 'newdata 갱신'; // 버튼클릭시 newdata 갱신으로 str 변경
}
}
}
</script>
<form v-on:submit.prevent="submitForm">
<input type="text" id="username" v-model="username">
<input type="password" id="password" v-model="password">
<button type="submit">login</button>
</form>
<script>
export default {
data: function(){
return{
username : '',
password :'',
}
},
</script>
v-on:submit.prevent="submitForm" 로 event.preventDefault(); 와 동일한 효과다.
<form v-on:submit.prevent="submitForm">
</form>
submit 클릭시 submitForm 함수를 실행하여 데이터 처리
<script>
//데이터를 주고받기 위한 라이브러리 axios 터미널에서 npm i axios
import axios from 'axios';
export default {
data: function(){
return{
username : '',
password :'',
}
},
methods:{
submitForm : function(){
//폼을 보낼때 새로고침을 막기위해 event 인자값를 받아 event.preventDefault(); 추가
// event.preventDefault();
console.log(this.username, this.password);
let url = 'https://jsonplaceholder.typicode.com/users';
let data = {
username: this.username,
password: this.password
};
// axios.post(url,data).then().catch();
axios.post(url, data)
.then(
//실행문
function(response){
console.log(response.data);
}
)
.catch(
//오류문
function(error){
console.log('에러문:',error);
}
);
}
}
}
</script>