반응형

하위컴포넌트 -> 상위컴포넌트로 이벤트&데이터 전달하기

 


1. 자식 컴포넌트의 이벤트 내용에 다음 내용 추가

this.$emit( ' 상위로 전달할 이벤트명 ' , 데이터 ) ;

 this.$emit('update',this.childTime);

이벤트명은 임의로 적어주고 데이터는 전달할 데이터

 

2. 상위컴포넌트의 <하위 컴포넌트>명시 부분에 이벤트 핸들러 추가

@하위에서 전달받을 이벤트명="전달받고 실행할 이벤트"

 <setTime @update="timeChanged"/>

실행할 이벤트는 상위 컴포넌트에서 명시하면 된다.

 timeChanged(childTime){ //전달받은 데이터
    console.log("이벤트전달");
	this.parentTime=childTime;
}

전체 예시 소스

하위 컴포넌트

<template>
    <div id="setTime">
    {{childTime}}
        <button class="minusBtn" @click='setValue' value="-5">-5분</button> 
    </div>
</template>

<script>
export default {
  name: 'setTime',
  data(){
    return{
        childTime:'',
    }
  },
  methods:{
    setValue(){
         this.$emit('update',this.time); //상위 컴포넌트에 이벤트, 데이터 전달
    },
  }
}
</script>

 

상위 컴포넌트

<template>
    <div id="managerMain">
        <div>현재 {{time}} 분</div>
            <setTime @update="timeChanged"/> //이벤트 명시
    </div>
</template>


<script>
import setTime from '@/components/manager_setTime.vue'

export default {
   name: 'managerMain',
   components: {
    setTime
   },
   data(){
    return{
        parentTime:''
    }
   },
   methods:{
    timeChanged(childTime){ //전달받은 데이터
    console.log("이벤트전달");
        this.parentTime=childTime;
    }
   }
}

</script>
반응형
반응형

터미널에서 다음 명령어 입력하여 라이브러리 설치

npm install [라이브러리이름]

node_modules 밑에 설치한 라이브러리가 추가된다

script 부분에서 import XLSX from 'xlsx' 입력하면 됨

<script>
import XLSX from 'xlsx'
  export default{
    data() {
      return {
       year : ["2020","2021"],
       month : 12,
       day : 31
    }
   }
</script>
반응형
반응형

사용자 정의 component에서의 prop 정의

<template>
    <div>
    {{content}}
    <p>사용자 정의 Local Component</p>
    message1 is : {{message1}}<br>
    message2 is : {{message2}}
    </div>
</template>

<script>
    export default {
    name : 'LocalComponent',
    props :{
        message1 :{
            type: String,
            default : "값 없음"
        },
        message2 :{
            required : true
        }
    }
}
</script>

<style scoped>
div {
    width: 300px;
    border: solid;
    border-color: rgb(38, 138, 253);
    border-radius: 8px;
    padding: 8px;
    margin :0 auto;
  }

</style>

 

상위 component에서의 prop 전달

v-bind를 사용하여 부모의 데이터에 props를 동적으로 바인딩 할 수 있다. (동적 props)

<template>
  <div id="app">
    <myComponent></myComponent>
    <LocalComponent message1="전달한 prop1" message2="전달한 prop2"></LocalComponent>
    
    <input v-model="inputValue">
    input 내용 : {{inputValue}}

    <LocalComponent v-bind:message1="inputValue"></LocalComponent>

  </div>
</template>

<script>
import LocalComponent from './components/myLocalComponent'

export default{ 
  data(){
    return{
      inputValue : ''
    }
  },
  components : {LocalComponent}
  
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

 

결과

반응형
반응형

vue 컴포넌트란? vue 인스턴스를 말한다

컴포넌트의 등록과 사용

  • 전역등록(Global Registration)
  • 지역등록(Local Registration)

전역 컴포넌트 등록

1. components 경로에 vue 파일 생성

 

2. myComponent.vue 내용작성

<template>
<div>
    {{content}}
    <p>사용자 정의 전역 컴포넌트</p>
</div>
</template>


<script>
export default {
    name : 'myComponent',
    data() {
        return{
            content : '짜란~'
        }
    }
}
</script>


<style scoped>
div {
    width: 300px;
    border: solid;
    border-color: rgb(253, 230, 202);
    border-radius: 8px;
    padding: 8px;
    margin :0 auto;
  }

  
</style>

 

3. main.js에 전역 등록

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false


import myComponent from './components/myComponent'
Vue.component(myComponent.name,myComponent)


new Vue({
  render: h => h(App),
}).$mount('#app')

 

4. 최상위 컴포넌트인 App.vue에서 해당 컴포넌트 사용

<template>
  <div id="app">
  
    <myComponent></myComponent>

  </div>
</template>

<script>
export default{ 
  data() {
    return {
    }
  }
}
</script>

 

결과

 


지역 컴포넌트 등록

1. components 경로에 vue 파일 생성

 

2. myLocalComponent.vue 내용 작성

<template>
    <div>
    {{content}}
    <p>사용자 정의 Local Component</p>
    </div>
</template>

<script>
    export default {
    name : 'LocalComponent',
    data() {
        return{
            content : '로컬~'
        }
    }
}
</script>

<style scoped>
div {
    width: 300px;
    border: solid;
    border-color: rgb(38, 138, 253);
    border-radius: 8px;
    padding: 8px;
    margin :0 auto;
  }

</style>

 

3. App.vue에서 import하여 사용

<template>
  <div id="app">
    <myComponent></myComponent>
    <LocalComponent></LocalComponent>

  </div>
</template>

<script>
//로컬component import
import LocalComponent from './components/myLocalComponent'

export default{ 
  components : {LocalComponent}
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

 

결과

 


참고 링크

 

 

컴포넌트 — Vue.js

Vue.js - 프로그레시브 자바스크립트 프레임워크

kr.vuejs.org

 

 

[Vue.JS] Component 개념을 익히고 만들어보자!!

Vue.js의 기본 개념을 익히고 기본적인 Vue.js Component를 생성해 보자. Vue.js의 Component 개념은 Vue.js Framework에서도 중요한 부분을 차지하고 어떻게 Vue.js Component를 생성하느냐에 따라 Vue.js의 개발속도

kdydesign.github.io

 

반응형
반응형

싱글 파일 컴포넌트 방식으로 연습하였음

vue 버전 4.5.12


1. 데이터 표시

<template> <!--html 코드 -->
	<div id="app">
	1. 원숭이 : {{animal}} <br>
	2. 원숭이(v-text) : <p v-text="animal"></p>
	3. 원숭이(v-html) : <p v-html="animal"></p>
	</div>
</template>


<script> 
export default{ 
  data() {
    return {
      animal : "<h1>Monkey</h1>",
    }
  }
}
</script>


2. html 폼 타입 지정

<template> <!--html 코드 -->
  <div id="app">
    <a :href='url'>naver</a><br>
    <input :type='type1'><br>
    <input v-bind:type='type2'><br>
  </div>
</template>


<script> 
  export default{ 
    data() {
      return {
        type1 : 'text',
        type2 : 'checkbox',
        url : 'https://www.naver.com'
      }
    }
  }
</script>


3. 클래스 지정

<template> <!--html 코드 -->
  <div id="app">
   <p v-bind:class='class1'> 클래스 하나지정 </p>
   <p v-bind:class='[class1,class2]'> 다중 클래스 지정</p>
  </div>
</template>

<script> 
  export default{ 
    data() {
      return {
        class1:'Class1',
        class2:'Class2'
      }
    }
  }

</script>

4. html 입력 폼 생성 및 데이터 바인딩

<template> <!--html 코드 -->
  <div id="app">
  
<input v-model="input_value">
input 입력 내용 : {{input_value}}<br><br>


<textarea v-model="textarea_value"></textarea>
textarea 입력내용 : {{textarea_value}}<br><br>


<input type="checkbox" v-model="checkbox_value" value="checkbox1">
<input type="checkbox" v-model="checkbox_value" value="checkbox2">
<input type="checkbox" v-model="checkbox_value" value="checkbox3">
checkbox 선택 value : {{checkbox_value}}<br><br>


<input type="checkbox" v-model="checkbox_check" value="checkbox0">
checkbox 선택여부 : {{checkbox_check}}<br><br>


<input type="radio" v-model="radio_value" value="radio1">
<input type="radio" v-model="radio_value" value="radio2">
<input type="radio" v-model="radio_value" value="radio3">
radio value : {{radio_value}}<br><br>


<select v-model="select_value">
  <option selected>default</option>
  <option>value1</option>
  <option>value2</option>
</select>
select value : {{select_value}}<br><br>


  </div>
</template>

<script> 
  export default{ 
    data() {
      return {
        input_value: '코끼리',
        textarea_value:'textarea입니다',
        checkbox_value:[],
        checkbox_check:false,
        radio_value:'',
        select_value:''
      }
    }
 }

</script>


5. 메소드 생성

<template> <!--html 코드 -->
  <div id="app">
  
<button v-on:click="countUp"> 1씩 증가</button>
<p>{{count}}</p>

<button :disabled="click" v-on:click="oneClick">한 번만 클릭가능</button>
<br><br>


<button v-on:click="alertClick">알림창 </button>
  </div>
</template>

<script> 
  export default{ 
    data() {
      return {
        count:0,
        click:false
      }
    },
    methods :{
      countUp(){
        this.count++;
      },
      oneClick(){
        this.click=true;
      },
      alertClick(){
        alert("OK");
      }
    }
  }

</script>


6. 조건문 사용

<template> <!--html 코드 -->
  <div id="app">

<button v-bind:disabled="Case1" v-on:click="case1Click">case1</button>
<button v-bind:disabled="Case2" v-on:click="case2Click">case2</button>
<button v-bind:disabled="Case3" v-on:click="case3Click">case3</button>


<p v-if="Case1">Case1 </p>
<p v-else-if="Case2">Case2 </p>
<p v-else>Case3 </p>

  </div>
</template>

<script> 
  export default{ 
    data() {
      return {
       Case1 :false,
       Case2 :false,
       Case3 :false
      }
    },
    methods :{
      case1Click(){
        this.Case1 = true;
        this.Case2 = false;
        this.Case3 = false;
      },
      case2Click(){
        this.Case1 = false;
        this.Case2 = true;
        this.Case3 = false;
      },
      case3Click(){
        this.Case1 = false;
        this.Case2 = false;
        this.Case3 = true;
      }
    }
  }

</script>


7. 반복문을 통한 배열 출력

2.2.0 이상에서 v-for는 :key를 적어줘야 한다고 함.

적지 않으면

element in iteration expect to have v-bind key

에러가 남 

<template> <!--html 코드 -->
  <div id="app">

<p v-for="pick in arr" v-bind:key="pick">{{pick}}</p>

<p v-for="(key,value) in obj" v-bind:key="key"> {{key}} : {{value}}</p>

<p v-for="(item) in objArr" v-bind:key="item.name"> {{item.name}}, {{item.age}}, {{item.job}}</p>

<input type="text" v-model="textValue">
<button v-on:click="push(textValue)">저장</button><br>
배열 내용 : {{pushArr}}

  </div>
</template>

<script> 
  export default{ 
    data() {
      return {
       arr : ['짜장','짬뽕','탕수육'],
       obj: {'a':'1','b':'2','c':'3'},
       objArr : [{'name' : 'park', 'age' : '13','job':'student'},{'name' : 'lee', 'age' : '30', 'job' : 'teacher'}],
       pushArr : [],
       textValue :''
      }
    },
    methods :{
      push(textValue){
        this.pushArr.push(textValue);
      }
    }
  }

</script>

<style>

 


 

8. computed (데이터 변화 감지)

onchange와 메소드를 간편하게 결합시켜놓은 기능같다.

** 함수 내부의 프로퍼티가 변경되면 실행됨

** computed의 함수들은 항상 return 값이 있어야 함 

** 같은 기능을 하는 watch는 반환값이 없어도 됨.

<template>
  <div id="app">
    <input v-model.number="price" type="number">원 X 
    <input v-model.number="count" type="number">개
    <p> 합계 {{sum}}원 </p>
    <p> 세금포함 {{taxIncluded}} 원</p><br><br>

  </div>
</template>

<script>
export default{ 
  data() {
    return {
      price: 100,
      count:1
    }
  },

  computed:{
    sum:function(){
      return this.price * this.count;
    },
    taxIncluded:function(){
      return this.sum*1.08;
    }
  }
}
</script>

 


 

수식어

1) .lazy

입력 이벤트가 끝난 뒤 입력과 데이터를 동기화 함.

입력중일 땐 동기화가 안 된다는 말.

   <input v-model.number="message" type="number">
    message is : {{ message }}

입력 중 / 입력 후 

 

 

2)  .trim

input을 자동으로 trim

<input v-model.trim="message" >
 message is : {{ message }}

띄어쓰기가 아예 없어지는 건 아닌가 봄

 

3) .number

사용자 입력이 자동으로 숫자로 형변환 된다고 함.

type="number"를 사용하는 경우에도 HTML 입력 엘리먼트의 값은 항상 문자열을 반환하기 때문에 이것은 종종 유용하게 사용할 수 있습니다.  라고 함

<input v-model.number="message" type="number">
message is : {{ message }}

 

 


 

 

참고링크

 

폼 입력 바인딩 — Vue.js

Vue.js - 프로그레시브 자바스크립트 프레임워크

kr.vuejs.org

 

[Vue] Vue.js 기본 문법 총정리

최근 프로젝트에서 프론트엔드 Jquery, Ajax를 적극 활용해보며 프론트에 약간 관심이 생겨 Vue를 한번 공부해봤다. Vue에 대한 개념은 건너뛰고 문법만 딱 정리하고자 한다.  1. Vue 인스턴스 Vue.js로

cjw-awdsd.tistory.com

 

반응형
반응형

1. Node.js 설치

 

다운로드 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

 


 

2. VUE CLI 전역설치

> npm install -g @vue/cli

-g  : 로컬 어디에서든 vue-cli를 요청할 수 있도록 함. 

안 된다면 vscode를 껐다 켜보자.

 

 

 


 

3. vue 프로젝트 만들기

> vue.cmd create [프로젝트명]

Please pick a preset 에서 방향키를 이용하여 두 가지 선택지중에 하나를 선택할 수 있는데

위쪽의 Default로 했다.

프로젝트의 node_modules경로에 Babel, ESLint 가 포함되어있는 걸 볼 수 있음.

Babel 자바스크립트 컴파일러.
최신버전의 자바스크립트 문법은 브라우저가 이해하지 못하기 때문에
Babel은 이 브라우저가 이해할 수 있는  구버전 문법으로 변환시켜줌.
ESLint 코딩 스타일 가이드를 따르지 않거나 문제가 있는 코드나 안티 패턴을 찾아 표시를 달아 놓는 도구

 

 

 


 

4. vue router 설치

> npm install vue-router --save

설치가 된 건가 안 된건가 모르겠넴

 

package-lock.json 파일에 router 내용이 추가된 것 확인

 

package.json 파일에 router 내용 추가된 것 확인


 

5. 프로젝트 실행

프로젝트 경로로 이동 > cd .\vue-form 
실행 > npm run serve

 

 

 


 

확인

브라우저 URL 탭에서 localhost:8080를 입력하여 이동하면

 

 


 

6. vetur 설치 (선택사항)

.vue 파일의 코드에 색을 입혀서 보기 편하게 만들어 준다고 함.

 

 


 

디렉터리 구조 확인

vscode에서 아까 생성한 vue 프로젝트 폴더를 연다.

 

* App.vue 가장 최상위 컴포넌트

* main.js : 가장 먼저 실행되는 javascript 파일. Vue 인스턴스를 생성한다. 

 


 

버전확인

> vue -V

이렇게 나온다면 

파워쉘이 아닌 cmd에서 해보면 된다.

+ 를 눌러서 cmd로 터미널을 만들어서 다시 입력해보면

으음~ 편안~


 

TEST

 

1. vue 이미지 지워보기

App.vue의 template 부분에서 img 소스를 지운다.

 

 

2. 원하는 text 로 변경

template 부분에서 helloworld를 지우고 넣어줌

App 컴포넌트를 사용하지 않아서 에러가 남

 script 부분에서도 지워주면 됨.

 


Vue 파일 구조 : 싱글파일 컴포넌트

  • vue에서 제공하는 컴포넌트라는 개념에 template과 CSS 스타일링을 합쳐놓은 것
  • .vue 파일내에서 template / script / style 부분으로 나뉜다.
  • 하나의 파일에 HTML과 JS, CSS 를 한꺼번에 작성할 수 있는 장점이 있다.

 

  • 싱글파일컴포넌트 아닌 경우 script 부분
new Vue({
	data: {
	aimal : 'monkey'
    }
})

 

  • 싱글파일컴포넌트인 경우 script 부분
export default {
    data(){
        return {
            animal: 'Monkey'
        }
    }
}

참고한 블로그

 

Vue Cli 초기 세팅

Vue CLI는 Vue 프로젝트를 개발할 수 있게 해주는 아주 유용한 도구이며, 여기서 CLI란 Command Line Interface의 약자로서 타이핑으로 명령어를 입력하여 원하는 바를 실행시키는 도구를 말한다. 윈도우

velog.io

 

반응형

+ Recent posts