카테고리 없음

[Vue] Vue 기초

yun000 2025. 3. 4. 20:59

Vue

=MVVM pattern의 view model layer에 해당하는 화면단 라이브러리

 

Vue특징

1. DOMListener

= 마우스 클릭 등 이벤트를 잡아서 자바스크립트와 연결해준다.

2. Data Bindings

= 자바스크립트의 데이터가 변했을 때 Data Bindings 이용해서 화면에 그것을 반영

3. Component

= 단방향 데이터 흐름 사용. 화면단위를 컴포넌트 조립으로 구성하여 코드 재사용 최대화

4. Reactivity

=데이터 변화에 따라서 화면에 자동으로 반영되어 그려지는 

 

 

  MVVM pattern = Backend 로직과 데이터 표현, 처리하는 부분을 분리하기 위한 구조. 

■  View =사용자에게 보여지는 화면

  HTML = 화면에 나타나는 어떤 태그, DOM정보를 넣는 것

DOM을 이용해서 자바스크립트로 조작할 수 있게 한다.

  자바스크립트 = 태그나 DOM내용을 조작

   생성자 함수=자바스크립트에서 어떤 함수를 이용해서 인스턴스를 생성하는 방법

 

1️⃣ Vue Instance

= Vue 생성자 함수로 인스턴스를 생성하는법

new Vue({
});

Instance option 속성도 포함 가능

el, template, methods, data, created, watch...

new Vue({
	template: "",
    el: "",
    methods: {},
    data:{},
    등....
});

 

Vue Instance lifecycle

instance 생성시 수행하는 초기화 작업

1. 데이터 관찰 2. 템플릿 컴파일 3. DOM에 객체 연결 4. 데이터 변경 시 DOM 업데이트

 

이 외에도 개발자의 커스텀 로직 추가 가능

created, mounted, updated, destroyed 등...

new Vue({
	data:{a:1},
  created: function(){
    console.log("a is: "+this.a);
  }
});

 

 

new Vue

new Vue로 instance를 생성할 때 Vue를 생성자라고 부른다.

뷰로 개발시 필요한 기능을 생성자에 미리 정의해 놓고 사용자가 그 기능 재정의하면 편하게 사용 가능하다

 

 

2️⃣ Vue Components

=화면 영역을 단위로 쪼개어 재활용 가능한 형태로 관리하는 것

코드의 재사용성이 높아지고 효율이 올라간다

 

 

① 전역 컴포넌트 등록


Vue
.component('component name', component content);

<body>
    <div id="app">
        <app-header></app-header>
        <app-content></app-content>
    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        Vue.component('app-header',{
            template: '<h1>Header</h1>'
        });
        Vue.component('app-content',{
            template: '<div>content</div>'
        })

        new Vue({
            el:'#app'
        });
    </script>
</body>

 

② 지역 컴포넌트 등록

 
new Vue({
            el:'#app',
            components:{
                'component name':{component content}
            }
        });
 

 

<body>
    <div id="app">
        <app-footer></app-footer>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>       
        new Vue({
            el:'#app',
            components:{
                'app-footer':{template:'<footer>footer</footer>'}
            }
        });
    </script>
</body>

 

<body>
    <div id="app">
        <app-header></app-header>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var appHeader={
            template:'<h1>header</h1>'
        }
        new Vue({
            el: '#app',
            components:{
                'app-header':appHeader
            }
        });
    </script>
</body>

 

+) 컴포넌트와 인스턴스 차이

인스턴스를 생성하면 root component가 된다.

전역 컴포넌트는 인스턴스 생성할 때마다 따로 등록할 필요없다.

하지만 지역 컴포넌트는 인스턴스마다 새로 생성해주어야 한다.

 

 

예제

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app"></div>

    <script>

    </script>
    <script>
        var div=document.querySelector('#app');
        div.innerHTML='hello wolds';
        var viewmodel={};

        Object.defineProperty(viewmodel,'str',{
            get:function(){
                console.log('접근');
            },
            set:function(newValue){
                console.log('할당',newValue);
            }
        })

    </script>
</body>
</html>

 

 

 

 

컴포넌트 통신 방식

= 컴포넌트 간의 통신 방식은 props, event이다.

그냥 N방향으로 마구잡이로 통신하게 되면 데이터 무결성 보안성 등 위험이 생긴다

그래서 상위, 하위 컴포넌트 끼리만 통신하는 규칙을 주었다.

데이터 흐름을 추적할 수 있게

상위 컴포넌트 → 하위 컴포넌트 : props 전달로 통신
하위 컴포넌트 → 상위 컴포넌트 : event emit 로 통신

 

 

 Props

{{props data}}

값이 반영되어 화면에 나타난다. 데이터 바인딩.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- <app-header v-bind: 프롭스 속성 이름="상위 컴포넌트 데이터 이름"></app-header> -->
        <app-header v-bind:propsdata="message"></app-header>
        <app-content></app-content>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var appHeader={
            template:'<h1>{{propsdata}}</h1>',
            props: ['propsdata']
        }

        var appContent={
            template: '<div>content</div>',
            props:[]
        }
        new Vue({
            el: '#app',
            components:{
                'app-header':appHeader,
                'app-content':appContent
            },
            data:{
                message:'hi',
                num:10
            }
        });
    </script>
</body>
</html>

 

 

 Event Emit

= 하위 컴포넌트에서 상위 컴포넌트에 통신 하는 것

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 이벤트 바인딩 수정</title>
</head>
<body>
    <div id="app">
        <p>{{ num }}</p>
        
        <!-- pass 이벤트를 app-header에서 발생시키고 이를 handlePass 메서드에서 처리 -->
        <app-header v-on:pass="handlePass"></app-header>

        <!-- increase 이벤트를 app-content에서 발생시키고 이를 increaseNumber 메서드에서 처리 -->
        <app-content v-on:increase="increaseNumber"></app-content>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        // app-header 컴포넌트
        var appHeader = {
            template: '<button v-on:click="passEvent">Click Me</button>',
            methods: {
                passEvent: function() {
                    this.$emit('pass'); // 부모 컴포넌트로 'pass' 이벤트 전달
                }
            }
        };

        // app-content 컴포넌트
        var appContent = {
            template: '<button v-on:click="addNumber">Add</button>',
            methods: {
                addNumber: function() {
                    this.$emit('increase'); // 부모 컴포넌트로 'increase' 이벤트 전달
                }
            }
        };

        // Vue 인스턴스
        new Vue({
            el: '#app',
            components: {
                'app-header': appHeader,
                'app-content': appContent
            },
            data: {
                num: 10
            },
            methods: {
                handlePass: function() {
                    console.log('pass 이벤트 발생!');
                },
                increaseNumber: function() {
                    this.num += 1; // num 값 증가
                    console.log('현재 숫자:', this.num);
                }
            }
        });
    </script>
</body>
</html>

 

 

+) this란?

현재 포함된 객체의 데이터를 의미

 

 

③ 같은 레벨내의 컴포넌트 통신

=부모에 event로 통신하고 자식에 props로 전달하면됨

 

 

3️⃣ Router

= 싱글 페이지 애플리케이셔 제작시 유용한 library

페이지 이동 기능 제공

 

설치

npm install vue-router --save
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

 

예제

<body>
  <div id="app">
    <div>
      <router-link to="/login">Login</router-link>
      <router-link to="/main">Main</router-link>
    </div>
    <router-view></router-view>
  </div>

  <!--install Vue, routing-->
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script src="https://unpkg.com/vue-router@3.5.3/dist/vue-router.js"></script>
  
  <script>
    var LoginComponent = {
      template: '<div>login</div>'
    }
    var MainComponent = {
      template: '<div>main</div>'
    }

    var router = new VueRouter({
      // 페이지의 라우팅 정보      
      routes: [
        // 로그인 페이지 정보
        {
          // 페이지의 url
          path: '/login',
          // name: 'login',
          // 해당 url에서 표시될 컴포넌트
          component: LoginComponent
        },
        // 메인 페이지 정보
        {
          path: '/main',
          component: MainComponent
        }
      ]
    });

    new Vue({
      el: '#app',
      router: router,
    });
  </script>
</body>

 

 

 

Axios

=vue에서 권장하는 HTTP 통신 라이브러리.

Promise기반의 HTTP 통신 라이브러리.

 

+) HTTP 라이브러리 =브라우저에서 axios이용하여 HTTP 프로토콜, 데이터를 주고받기 위한 규칙

 

 

설치

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
npm install axios

 

사용 예시

methods: {
  fetchData: function() {
    axios.get('URL 주소');
  }
}

 

예제

<body>
  <div id="app">
    <button v-on:click="getData">get user</button>
    <div>
      {{ users }}
    </div>
  </div>

	//install
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  
  
  <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;
            })
            .catch(function(error) {
              console.log(error);
            });
        }
      }
    })
  </script>
</body>

 

 

 

 

4️⃣ Vue Template

vue template 문법 = 뷰로 화면 조작하는 문법

 

① 데이터 바인딩

= 뷰 인스턴스에서 정의한 데이터를 화면에 표시

{{ }} Mustache Tag 활용하여 인스턴스의 data, computed, props 속성 연결 가능

<body>
    <div id="app">
        {{str}}
        {{num}}
        {{doubleNum}}
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                num:10,
                str:'hi'
            },
            computed:{
                doubleNum:function(){
                    return this.num*2;
                }
            }
        });
    </script>
</body>

 

 

② Directive

= 화면 조작 편하게 할 수 있게 하는 문법

v-if, v-bind, v-on 등...

<body>
    <div id="app">
        <button v-on:click="logText">click</button>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            methods:{
                logText:function(){
                    console.log('clicked');
                }
            }
        });
    </script>
</body>

 

③ Filters

= 텍스트 형식 편안하게 변환

{{ message | capitalize }}

 

new Vue({
  filters: {
    capitalize: function(value) {
      if (!value) return "";
      value = value.toString();
      return value.charAt(0).toUpperCase() + value.slice(1);
    }
  }
});

 

5️⃣ watch, computed

computed=단순 값 계산 등

watch=더 무거운계산

 

 

6️⃣ Vue CLI

= vue command line interface

명령어로 액션 수행하는 도구

 

설치

= AppData\npm\node_modules에 설치된다.

node -v
npm -v
sudo npm install -g @vue/cli

 

생성및 실행

vue create 프로젝트이름 //프로젝트 생성
cd 프로젝트이름 //해당 프로젝트 폴더로 이동
npm run serve //서버로 실행

 

 

 

7️⃣ SFC (singl File Component)

= 화면의 HTML, CSS, JS코드를 한 파일에서 관리하는 방법

<template>
  <!-- HTML -->
</template>

<script>
  // Javascript
</script>

<style>
  /* CSS */
</style>

 

 

8️⃣ 자바스크립트 비동기 처리 패턴

비동기 처리=코드 연산 완료를 기다리지 않는 것

 

1. callback = 특정 연산이 완료된 후 실행될 코드를 함수 형태로 정의

2. promise = 비동기 작업 결과(완료 혹은 실패) 반환

3. promise+generator = 코드 블록 일시 중지 했다가 

4. async & await = promise기반 

 

 

 

 

⭐ Vue의 특징 전체 정리

Reactivity

=데이터 변화를 뷰에서 감지하여 화면에 보여줌

상위로 한 번 이동 후 하위로 다시 이동

 

인스턴스

=vue개발시 필수 생성해야하는 단위

 

컴포넌트

=화면영역 구분해서 개발하는 방식

컴포넌트 통신 = 데이터 규칙 제한하며 흐름 예측

    - props =상위에서 하위

    - event emit = 하위에서 상위

 

HTTP통신 라이브러리(axios)

 

템플릿문법

-데이터 바인딩 = 데이터 화면에 보여주는 것이 데이터 바인딩

- 뷰 디렉티브 = 뷰에서 추가적으로 제공하는 문법 (v-)

 

Vue CLI

= 명령어로 vue생성하는것