반응형

Axios(액시오스)는 뷰에서 권고하고 있는 HTTP 통신 라이브러리 이고

Promise 기반이다.

 

*Promise : 자바스크립트 비동기 처리 패턴

 

HTTP 통신 라이브러리인 Axios를 알아보기 전에 간단하게 HTTP 통신 구조를 알아보려한다.

1. HTTP 통신 구조 (클라이언트 <-> 서버)

브라우저 (클라이언트)와 서버에서 HTTP 통신 방법을 간단하게 정리하자면

  1. 브라우저(클라이언트)에서 HTTP Requset를 통해 서버의 특정 백엔드 로직을 실행하고
  2. 백엔드 로직을 통해 DB에서 로직에 맞는 데이터를 가져온다.
  3. 가져온 데이터를 또 다시 특정 백엔드 로직을 통해 HTTP Response로 브라우저(클라이언트)에 응답을 한다.
  4. HTTP Response를 통해 가져온 데이터를 브라우저에 뿌려준다.

위와 같이 HTTP 통신 구조를 간략하게 정리할 수 있다.

 

2. Axios 적용

CDN 방식 or NPM 방식으로 axios 라이브러리를 설치한 뒤에

<div id="app">
    <button v-on:click="getData">get user</button><!-- 버튼 클릭시 vue 인스턴스에 저장해놓은 getData 메소드를 호출한다. -->
    <div> {{ users }} </div>
</div>
 
<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/')    // https://jsonplaceholder.typicode.com/users/ 에서 데이터 받아오기
                    .then(function(response){
                        console.log(response.data);     // response에서 data 속성 값 출력
                        // this.users = response.data;  // 함수 안에 this로 해당 this는 vue 인스턴스에 대한 this가 window를 가르킨다.
                        vm = response.data;             // getData 함수 내부에 this를 따로 변수에 담아서 사용
                    }.catch(function(){
                        console.log(error);
                    });
            }
        }
    });
</script>

 

vue 인스턴스 methods에 axios를 사용하기 위한 함수를 등록해준다.

axios.get() : 데이터 가져오기

axios.then() : 비동기 통신이 성공했을 경우 처리

axios.catch() : 통신시 오류가 발생했을 때의 처리

 

위의 소스와 같이 작성할 때 주의해야 할 점은 vue 인스턴스 내부에 있는 데이터에 접근하기 위해 this를 사용하게 되는데

함수 내에서 this를 사용하게되면 함수 내부에서 this를 가르키게 되어 this는 윈도우를 가르키게 된다.

 

그렇게 때문에 getData 메소드 내부에 this를 별도 변수에 담아서 사용하거나

then에서 function(){} 이 아닌 => 화살표 함수 방식으로 작성하여 this가 원하는 방향으로 지정되도록 처리할 필요가 있다.

 

 


출처

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
반응형

라우터는 뷰 라이브러리를 이용하여 SPA(Single Page Appliaction) 구현을 할 때 사용하는 라이브러리이다.

 

1. 라우터 연결

라우터를 사용하기 위해서는 CDN 방식 혹은 NPM 방식으로 설치할 수 있다.

 

CDN 방식은 script 태그에 CDN 링크를 추가해서 연결을 하는 방식이고

NPM 방식은 Vue CLI로 프로젝트를 생성하거나 NPM 기반으로 프로젝트를 생성해서 라우터 설치 명령어 입력을 통해 설치한다.

<!-- CDN 방식 -->
<script src="https://unpkg.com/vue@2"></script>
<script src="https://unpkg.com/vue-router@3"></script>
  
<!-- NPM 방식(아래 명령어 입력) -->
npm install vue-router@3

 

위와 같이 설치한 뒤 아래 소스와 같이 뷰 라우터를 등록할 수 있다.

 

var router = new VueRouter({
    // 라우터 옵션
});
 
// 인스턴스에 라우터 인스턴스를 등록
new Vue({
    router: router,     //  라우터 인스턴스의 변수명으로 등록
});

 

2. 라우터 옵션

라우터를 연결 및 등록한 뒤 라우터를 사용할 때 라우터 옵션을 지정한다.

2가지의 필수 옵션이 있다.

 

- routes: 라우팅 할 URL과 컴포넌트 값 지정(페이지의 라우팅 정보)

- mode: URL의 해쉬 값 제거 속성

 

var LoginComponent = {
    template: '<div>Login</div>'
}
var MainComponent = {
    template: '<div>Main</div>'
}
 
var router = new VueRouter({
    mode: 'history',
    routes: [   // 배열 형식으로 지정
        {
            // 페이지의  url 이름
            path:'/login',
            // 해당 url에서 표시될 컴포넌트
            component: LoginComponent,
        },
        {
            path: '/main',
            component: MainComponent,
        }
    ]
});

 

위와 같이 라우터 옵션들을 입력해서 특정 컴포넌트들을 세부 페이지처럼 사용할 수 있게 url을 지정하고 연결해준다.

 

3. router-view

라우터 옵션으로 라우터를 컴포넌트와 연결하고 화면에 해당 컴포넌트를 뿌릴 때 router-view를 사용한다.

<div id="app">
    <router-view></router-view><!-- 라우터에 등록한 LoginComponent 혹은 MainComponent를 화면에 보여준다 -->
</div>

 

localhost:0000/router.html/login 으로 url을 입력시 LoginComponent 내용이,

localhost:0000/router.html/main 으로 url을 입력시 MainComponent 내용이 <router-view> 영역에 뿌려진다.

 

4. router-link

사용자들이 일반적인 웹 페이지에서 a태그를 통해 링크 이동을 하여 페이지를 탐색하듯

vue 화면에서 특정 링크를 클릭해서 화면을 이동할 수 있게 해주는 것이 router-link 이다. (실제 html 소스상에 <router-link> 는 a태그로 출력된다.)

<div id="app">
    <!-- <router-link to="이동할 URL"></router-link> -->
    <router-link to="/login">로그인</router-link>
    <router-link to="/main">메인</router-link>
 
    <router-view></router-view> <!-- routerlink를 클릭할 때마다 to에 연결된 url의 화면이 출력된다. -->
</div>
 
<!-- 출력
<a href="/login">로그인</a>
<a href="/main">메인</a>
-->

 

 


출처

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] Axios (액시오스)  (0) 2023.11.07
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
반응형

컴포넌트의 데이터는 각 컴포넌트에서 관리하기 때문에 각 컴포넌트는 고유한 데이터 유효범위를 갖는다.

따라서 컴포넌트간 데이터를 주고 받기 위해서는 특별한 규칙을 따라야한다.

 

 

위와 같이 상→하로 props를 통해 데이터를 전달하고

하→상은 이벤트를 올려서 전달한다.

 

*컴포넌트 통신 규칙 : 직접 연관이 되어있는 상, 하위 컴포넌트 간의 데이터 전달이 가능하다. (데이터 오류 발생시 추적에 용이)

 

 

1. props (상 -> 하)

props는 위에서 설명한 것과 같이 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달하는 방법이다.

 

부모 컴포넌트에 등록되어 있는 데이터를 가져오는 기본적인 사용 방법은 

 

1. 자식(하위) 컴포넌트에 props 속성을 사용해 프롭스 속성명을 등록해준다.

var appHeader = {
    template: '<h1>Title</h1>',
    props: ['propsdata']    // 프롭스 속성 명은 임의로 지정이 가능하다.
}
 
new Vue({
    el: '#app',
    component: {
        'app-header' : appHeader,
    },
    data: {
        message: 'hi',
    }
})

 

2. 자식 컴포넌트에서 v-bind를 사용해서 상위 컴포넌트의 데이터 속성을 해당하는 자식 컴포넌트로 전달한다. 

<!-- v-bind:프롭스 명="상위 컴포넌트의 data 속성" -->
<app-header v-bind:propsdata="message"></app-header>

 

크게 위 1, 2번의 방법으로 적용할 수 있다.

 

<div id="app">
    <app-header v-bind:propsdata="message"></app-header>
    <app-content v-bind:propsnum="num"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<h1>{{ propsdata }}</h1>',   // {{ 데이터 }} 이중 괄호를 통해 부모 컴포넌트로부터 받은 props 값을 그대로 뿌려줄 수 있다.
        props: ['propsdata'],
    }
    var appContent = {
        // 각 영역 안에 데이터는 고유의 데이터로 가진다. 따라서 appHeader와 마찬가지로 propsdata라는 같은 이름으로 사용해도 된다.
        template: '<div>{{ propsnum }}</div>',
        props: ['propsnum'],
    }
    new Vue({
        el: '#app',
        components: {
            'app-header' : appHeader,
            'app-content' : appContent,
        },
        data: {
            message: 'hi',
            num: 10
        }
    });
</script>

 

 

2. Event Emit (하 -> 상)

부모 컴포넌트의 데이터를 가져올 때 props 속성을 사용한다면

자식 컴포넌트에서는 이벤트 발생(emit)을 통해 상위로 이벤트를 전달해준다.

 

방법은

1. 자식 컴포넌트에 event emit 메소드를 등록해준다.

// appHeader에 있는 button을 클릭하면 passEvent 함수가 실행되고 그 함수는 'pass'라는 이벤트명을 가진 event emit용 함수이다.
var appHeader = {
    template: '<button v-on:click="passEvent">click me</button>',
    methods: {
        passEvent: function(){  //passEvent라는 메소드를 통해 해당 자식 컴포넌트에 $emit 이벤트명은 정의한다.
            this.$emit('pass'); // 이벤트 이름 등록 : $emit('이벤트명')
        }
    }
}
 
new Vue({
    el: '#app',
    components: {
        'app-header': appHeader,
    },
    methods: {
        logText: function(){
            console.log('hi');
        },
    }
})

 

2. 자식 컴포넌트에 $emit으로 등록한 이벤트 명을 통해 부모 컴포넌트의 메소드를 가져온다.

<!-- v:on:하위 컴포넌트에서 발생한 이벤트 이름="상위 컴포넌트의 메소드 이름" -->
<app-header v-on:pass="logText"></app-header>

 

위와 같이 작업하면 app-header 영역에 버튼이 생기고

해당 버튼을 클릭하면 자식 요소의 버튼을 클릭하지만 부모 요소에 logText() 메소드가 실행된다.

<div id="app">
    <!-- v:on:하위 컴포넌트에서 발생한 이벤트 이름="상위 컴포넌트의 메소드 이름" -->
    <app-header v-on:pass="logText"></app-header>
    <app-content v-on:number="addNum"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<button v-on:click="passEvent">click me</button>',
        methods: {
            passEvent: function(){
                this.$emit('pass');
            }
        }
    }
    var appContent = {
        template: '<button v-on:click="addNumber">add</button>',
        methods: {
            addNumber: function(){
                this.$emit('number');
            }
        }
    }
    new Vue({
        el: '#app',
        components: {
            'app-header': appHeader,
            'app-content': appContent,
        },
        methods: {
            logText: function(){
                console.log('hi');
            },
            addNum: function(){
                this.num++
                console.log(this.num);
            }
        },
        data: {
            num: 10,
        }
    })
</script>

 

위와 같은 소스로 자식 컴포넌트에서의 이벤트로 부모 컴포넌트의 data 값을 변경할 수도 있다.

 

3. 같은 레벨에서의 컴포넌트 통신 방법

같은 레벨의 컴포넌트에서는 다이렉트로 데이터를 통신할 수 없고 연결되어 있는 부모 컴포넌트를 통해서 데이터를 주고받을 수 있다.

 

AppContent에서 버튼을 클릭해서 10이라는 숫자를 AppHeader로 보내기 위해서는 다음과 같이 적용할 수 있다.

 

1. AppContent에서 Root 컴포넌트로 event emit을 이용해서 이벤트를 전달한다.

<div id="app">
    <app-header></app-header>
    <app-content v-on:pass="deliverNum"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<div>header</div>',
    }
    var appContent = {
        template: '<div>Content <button v-on:click="passNum">pass</button></div>',
        methods: {
            passNum: function(){
                this.$emit('pass', 10); // 10이라는 숫자를 pass 이벤트에 담아 보낸다.
            },
        }
    }
    new Vue({
        el: '#app',
        components: {
            'app-header' : appHeader,
            'app-content' : appContent,
        },
        data: {
            num: 0,
        },
        methods: {
            deliverNum: function(value){    // value는 $emit으로 보낸 10이 담겨온다.
                this.num = value;
            }
        }
    });
</script>

 

2. 부모 컴포넌트에서 AppContent로부터 받아온 이벤트를 AppHeader로 props를 통해 전달한다.

<div id="app">
    <app-header v-bind:propsdata="num"></app-header>
    <app-content v-on:pass="deliverNum"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<div>header</div>',
        props: ['propsdata']    // props 등록
    }
    var appContent = {
        template: '<div>Content <button v-on:click="passNum">pass</button></div>',
        methods: {
            passNum: function(){
                this.$emit('pass', 10);
            },
        }
    }
    new Vue({
        el: '#app',
        components: {
            'app-header' : appHeader,
            'app-content' : appContent,
        },
        data: {
            num: 0,
        },
        methods: {
            deliverNum: function(value){
                this.num = value;
            }
        }
    });
</script>

 

위 처럼 작업하게 되면 AppContent에 있는 버튼을 클릭할 때 

AppHeader에 propsdata:10 값이 전달된다.

 

 

 


참고

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] Axios (액시오스)  (0) 2023.11.07
[vue 2 기초] 라우터  (1) 2023.11.06
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
반응형

컴포넌트란 화면을 영역별로 구분하고 개발할 수 있는 뷰의 기능이다. 

컴포넌트 단위로 화면을 개발하게 되면 특정 영역을 여러 페이지에서 사용하게 될 때 특정한 컴포넌트를 가져와서 사용하면 되기 때문에 재사용성이 올라가고 효율이 올라간다.

 

1. 전역 컴포넌트

<div id="app">
    <app-header></app-header>   <!-- 컴포넌트를 생성하면 컴포넌트 태그를 써서 적용한다. -->
    <app-content></app-content>
</div>
 
<!-- 적용 후
<div id="app">
    <h1>Header</h1>
    <div>Content</div>
</div>
-->
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    // Vue.component('컴포넌트 이름', 컴포넌트 내용);
    // 전역 컴포넌트
    Vue.component('app-header', {
        template: '<h1>Header</h1>',
    });
    Vue.component('app-content', {
        template: '<div>Content</div>',
    });
 
    new Vue({
        el: '#app',
    });
</script>

 

위와 같은 소스를 Vue 개발자 도구에서 확인해보면

<Root>
    <app-header>
    <app-content>

 

위와 같이 생성된다.

(인스턴스를 생성하면 기본적으로 <Root> 컴포넌트가 만들어진다.)

 

위 방법은 전역 컴포넌트를 등록하는 방법이고 실 서비스에서는 주로 지역 컴포넌트를 사용하게 된다.

 

2. 지역 컴포넌트

<div id="app">
    <app-footer></app-footer>
</div>
 
<!-- 적용 후
<div id="app">
    <footer>Footer</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>

 

3. 전역 컴포넌트, 지역 컴포넌트의 차이

- 지역 컴포넌트는 components 속성에 있는 컴포넌트들을 통해 해당 페이지를 봤을 때 어떤 컴포넌트들이 연결이 되어있는지 명시적으로 확인이 수월하다. (일반적으로는 지역 컴포넌트 사용)

- 전역 컴포넌트는 플러그인이나 라이브러리와 같이 전역으로 사용해야하는 컴포넌트만 등록해서 사용한다.

 

 

 


참고

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
SPA 란?  (0) 2020.04.20
반응형

인스턴스는 뷰를 개발할 때 필수로 생성해야하는 코드이다.

 

인스턴스는 기본적으로 new Vue() 로 생성한다.(Vue 2 기준)

 

<div id="app"></div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el: '#app',     // 인스턴스가 그려지는 화면의 시작점
        template: ,     // 화면에 표시할 요소 (HTML, CSS 등)
        data: ,         // 뷰의 반응성(Reactivity)이 반영된 데이터 속성
        methods: ,      // 화면의 동작과 이벤트 로직을 제어하는 메소드
        created: ,
        watch: ,
    });
</script>

 

vue에서 사용할 수 있는 속성과 API는 위와 같이 el, template, data, methods, created, watch 등이 있다.

 

*인스턴스 내 this

인스턴스 내에서 this는 인스턴스 객체 자체를 가르킨다.

var Vue = {
    el: '',
    data: {
        num: 10,
    },
    methods: {
        getNumber: function(){
            console.log(this.num);  // 10 출력
        }
    }
}

 

 

 


참고

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
SPA 란?  (0) 2020.04.20
반응형

일반적인 웹에서는 html, css, javascript를 이용해서 화면을 구성하고 조작한다.

 

Vue.js 

 

 

<div id="app"></div>
 
<script>
    const app = document.querySelector('#app');
    let str = 'hello';
    app.innerHTML = str;    // #app 영역에 hello 텍스트 노출
 
    str = 'Hi';
    app.innerHTML = str;    // str 변수의 값을 바꿨지만 바뀐 내용이 즉시 반영되는 것이 아닌 innerHTML 을 통해 다시 선언해줘야 바뀐 변수값이 #app 영역에 적용된다.
</script>

 

반면 Vue.js는 MVVM(Model-View-ViewModel) 패턴으로 

화면에서 보여지는 내용들을(View) Vue의 Dom Listeners를 통해 자바스크립트에 있는 데이터를 바꿔주거나 특정 자바스크립트를 실행하게 된다.

그리고 Dom Listeners를 통해 자바스크립트의 데이터가 변경 됐을 때 Data Bindings를 통해 변경된 내용을 화면에 반영하게 된다.

<div id="app"></div>
 
<script>
    const app = document.querySelector('#app');
    const viewModel = {};
 
    // Object.defineProperty(대상 객체, 객체의 속성, {
    //      정의할 내용
    // })
 
    Object.defineProperty(viewModel, 'str', {
        // 속성에 접근했을 때의 동작을 정의
        get: function(){
            console.log('접근')       // 콘솔창에서 viewModel.str 을 입력하면 '접근' 출력
        }
        // 속성에 값을 할당했을 때의 동작을 정의
        set: function(newValue){
            console.log('할당', newValue)     // 콘솔창에서 viewModel.str = 'Hi' 를 입력하면 '할당 10'  출력
            app.innerHTML = newValue        // viewModel.str 값을 할당/변경할 때 마다 해당하는 값을 app에 뿌려준다.
        }
    });
</script>

 

* Object.defineProperty : 객체의 속성에 접근, 할당 했을 때의 동작을 정의한다.

 

위와 같이 데이터를 접근/변경할 때 마다 바로바로 데이터를 바인딩 시켜주는 것은 Vue.js의 가장 중요한 특징인 Reactivity이다.

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
SPA 란?  (0) 2020.04.20
반응형

SPA란 Single Page Application 의 약자로 

 

기존의 웹 페이지는 페이지 자체가 여러개 존재하고

원하는 정보가 있으면 새 데이터를 요청할 때 마다

전체 페이지가 다시 로드 되었다.

 

하지만 SPA를 사용하게 되면

맨 처음 로딩할 때 하나의 페이지를 불러오고

그 페이지에서 JSON/XML 등의 데이터를 동적으로 가져오는 형태로 페이지를 바꿔나간다.

 

즉, 새로고침이나 새로운 페이지를 부르지 않고

데이터를 가지고만 페이지를 운영한다.

 

 

1. SPA의 장점

그렇다면 왜 기존의 페이지를 불러오는 방식이 아닌

SPA 방식을 사용하는지 즉, 장점에 대한 생각을 해봐야한다.

 

1. 사용자가 페이지를 이용할 때의 속도가 빠르다. (반응성이 빠르다)

  : 초기 로딩에 데이터를 가져오기 때문에 로딩이 된 후에는 새로고침 없이 빠르게 페이지를 이용할 수 있다.

 

2. 화면에 필요한 데이터만 가져와서 렌더링 하기 때문에 효율적이다.

 

3. 신속한 개발이 가능

  : 단일 페이지 응용 프로그램 아키텍처가 분리되어 있기 때문에 프론트엔드와 백엔드 개발 서비스를 분리하여 작업할 수 있다. 그렇기 때문에 개발자는 독립적이고 신속하게 작업을 할 수 있다.

 

4. 캐싱 능력

  : 데이터에 대한 지속적인 액세스가 있기 때문에 캐싱 관리하기에 수월하다.

 

2. SPA의 단점

SPA가 장점만 갖고있는 것은 아니라

SPA를 사용했을 때의 단점도 몇 가지 있다.

 

1. 초기 로딩시에 데이터를 가져오는 문제로 초기 로딩 속도 저하의 문제가 발생할 수 있다.

 

2. 검색엔진최적화 (SEO)에 어려움이 있을 수 있다.

  : 스크립트 언어로 화면의 전환이 되기 때문에 검색엔진에서 크롤링 하기가 어렵다.

 

 

 

 


 

참고

https://www.excellentwebworld.com/what-is-a-single-page-application/

 

 

반응형

'Frontend > Vue.js' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03

+ Recent posts