'개발 부트캠프 > 프론트엔드' 카테고리의 다른 글
[Vue] Pinia (State Manager) (1) | 2024.12.26 |
---|---|
[Vue] Props & Emit (0) | 2024.12.24 |
[Vue] 조건문&반복문 (v-if, v-for) (0) | 2024.12.23 |
[Vue] 데이터 바인딩(Data Binding) (0) | 2024.12.23 |
[Vue] 뷰 라우터(Vue Router) (2) | 2024.12.23 |
[Vue] Pinia (State Manager) (1) | 2024.12.26 |
---|---|
[Vue] Props & Emit (0) | 2024.12.24 |
[Vue] 조건문&반복문 (v-if, v-for) (0) | 2024.12.23 |
[Vue] 데이터 바인딩(Data Binding) (0) | 2024.12.23 |
[Vue] 뷰 라우터(Vue Router) (2) | 2024.12.23 |
State Manager는 애플리케이션의 상태(state)를 중앙에서 관리하고, 이를 효율적으로 업데이트하거나 공유할 수 있도록 도와주는 도구입니다. Vue와 같은 프런트엔드 프레임워크에서 상태 관리는 컴포넌트 간 데이터 흐름을 명확하게 하고, 복잡한 데이터 구조를 보다 쉽게 다룰 수 있도록 해줍니다.
Vue는 기본적으로 컴포넌트 간 데이터 흐름을 위해 props와 emit을 사용합니다. 하지만 애플리케이션 규모가 커질수록 아래와 같은 문제들이 발생할 수 있습니다:
이러한 문제를 해결하기 위해 Vuex와 같은 상태 관리 라이브러리가 등장했으며, 최근에는 Pinia가 더욱 간단하고 직관적인 API로 주목받고 있습니다.
Pinia는 Vue 3를 위해 설계된 차세대 상태 관리 라이브러리입니다. Vuex의 대안으로, 사용이 간단하고 Vue 3의 Composition API와 완벽하게 통합됩니다. Pinia는 다음과 같은 장점을 제공합니다:
npm install pinia
먼저, Vue 애플리케이션에 Pinia를 설정해야 합니다. main.js
또는 main.ts
파일에서 Pinia를 생성하고 Vue 애플리케이션에 추가합니다:
// main.js 또는 main.ts
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
const app = createApp(App);
const pinia = createPinia();
app.use(pinia);
app.mount('#app');
Pinia에서 상태 관리를 위해 스토어를 정의합니다. 예를 들어, 카운터 애플리케이션을 위한 counter
스토어를 생성한다고 가정해보겠습니다:
// stores/counter.js
import { defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0,
}),
actions: {
increment() {
this.count++;
},
decrement() {
this.count--;
},
},
getters: {
doubleCount: (state) => state.count * 2,
},
});
스토어를 사용하는 방법은 아래와 같습니다:
<script setup>
import { useCounterStore } from '@/stores/counter';
const counterStore = useCounterStore();
</script>
<template>
<div>
<p>Count: {{ counterStore.count }}</p>
<p>Double Count: {{ counterStore.doubleCount }}</p>
<button @click="counterStore.increment">Increment</button>
<button @click="counterStore.decrement">Decrement</button>
</div>
</template>
Pinia는 Vue 3 애플리케이션에서 상태 관리를 간소화하고, 더 나은 개발 경험을 제공합니다. 간단한 API, Vue Devtools와의 통합, 그리고 Typescript 지원 덕분에 Pinia는 현대 Vue 애플리케이션의 이상적인 선택입니다. 이제 Pinia를 사용하여 더 깔끔하고 유지보수하기 쉬운 코드를 작성해보세요!
[Vue] 네비게이션 가드 (1) | 2024.12.27 |
---|---|
[Vue] Props & Emit (0) | 2024.12.24 |
[Vue] 조건문&반복문 (v-if, v-for) (0) | 2024.12.23 |
[Vue] 데이터 바인딩(Data Binding) (0) | 2024.12.23 |
[Vue] 뷰 라우터(Vue Router) (2) | 2024.12.23 |
Vue.js는 컴포넌트 기반 프레임워크로, 컴포넌트 간의 데이터를 주고받기 위해 props
와 emit
을 사용합니다. 이 글에서는 props
와 emit
이 무엇인지, 그리고 이를 사용하는 방법을 Parent-Child 컴포넌트 예제를 통해 알아보겠습니다.
props
는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하기 위한 속성입니다. 부모 컴포넌트에서 데이터를 정의하고, 자식 컴포넌트에서 이를 받아서 사용할 수 있습니다.
emit
은 자식 컴포넌트가 부모 컴포넌트로 이벤트를 전달할 때 사용됩니다. 자식 컴포넌트에서 특정 작업이 완료되거나 이벤트가 발생했을 때 이를 부모 컴포넌트로 알릴 수 있습니다.
우리는 Parent.vue와 Child.vue 두 개의 파일로 구성된 간단한 예제를 만들 것입니다.
부모가 데이터를 자식으로 전달합니다.
<script setup>
import { ref } from 'vue';
import Child from './Child.vue';
// 부모 컴포넌트의 데이터
const parentMessage = ref('Hello from Parent!');
</script>
<template>
<div>
<h1>Parent Component</h1>
<p>Message to Child: {{ parentMessage }}</p>
<!-- 자식 컴포넌트 사용 -->
<Child :message="parentMessage"></Child>
</div>
</template>
<script setup>
import { defineProps } from 'vue';
// 부모로부터 전달받을 props 정의
const props = defineProps({
message: String,
});
</script>
<template>
<div>
<h2>Child Component</h2>
<p>Received from Parent: {{ message }}</p>
</div>
</template>
자식이 이벤트를 부모로 전달합니다.
<script setup>
import { ref } from 'vue';
import Child from './Child.vue';
// 부모 컴포넌트의 데이터
const childResponse = ref('');
// 자식 컴포넌트의 이벤트 처리 함수
const handleChildResponse = (message) => {
childResponse.value = message;
};
</script>
<template>
<div>
<h1>Parent Component</h1>
<!-- 자식 컴포넌트 사용 -->
<Child @response="handleChildResponse"></Child>
<p>Response from Child: {{ childResponse }}</p>
</div>
</template>
<script setup>
import { reactive } from 'vue';
import { defineEmits } from 'vue';
// 부모로 이벤트를 전달할 emit 정의
const emit = defineEmits(['response']);
// 자식 컴포넌트의 데이터
const childData = reactive({
inputMessage: '',
});
// 버튼 클릭 시 호출되는 함수
const sendResponse = () => {
emit('response', `Child says: ${childData.inputMessage}`);
};
</script>
<template>
<div>
<h2>Child Component</h2>
<input
v-model="childData.inputMessage"
placeholder="Type a response"
/>
<button @click="sendResponse">Send Response</button>
</div>
</template>
props
를 통해 데이터를 받습니다.emit
을 사용해 부모 컴포넌트로 메시지를 전달합니다.이처럼 props
와 emit
은 Vue.js 컴포넌트 간 데이터와 이벤트를 주고받는 데 매우 유용합니다. 이를 통해 컴포넌트 간의 역할을 명확히 나누고, 유지보수가 용이한 구조를 설계할 수 있습니다.
[Vue] 네비게이션 가드 (1) | 2024.12.27 |
---|---|
[Vue] Pinia (State Manager) (1) | 2024.12.26 |
[Vue] 조건문&반복문 (v-if, v-for) (0) | 2024.12.23 |
[Vue] 데이터 바인딩(Data Binding) (0) | 2024.12.23 |
[Vue] 뷰 라우터(Vue Router) (2) | 2024.12.23 |
Vue.js는 사용자 인터페이스를 효율적으로 구축할 수 있는 프레임워크로, 그 중 v-if
와 v-for
는 조건문과 반복문을 처리하는 데 사용됩니다. 이 글에서는 v-if
와 v-for
의 개념, 사용 방법, 그리고 응용 방법을 예제와 함께 자세히 알아보겠습니다.
v-if
는 조건에 따라 특정 DOM 요소를 렌더링할지 말지를 제어하는 디렉티브입니다. 조건이 true
이면 해당 요소가 DOM에 렌더링되고, false
이면 렌더링되지 않습니다.
<script setup>
import { ref } from 'vue';
const isLoggedIn = ref(false);
</script>
<template>
<div>
<p v-if="isLoggedIn">환영합니다!</p>
<p v-else>로그인해주세요.</p>
</div>
</template>
설명:
isLoggedIn
이 true
이면 "환영합니다!"가 렌더링됩니다.v-else
를 사용하여 조건이 false
일 때 다른 요소를 렌더링할 수도 있습니다.<script setup>
import { ref } from 'vue';
const userRole = ref('editor');
</script>
<template>
<div>
<p v-if="userRole === 'admin'">관리자 화면</p>
<p v-else-if="userRole === 'editor'">에디터 화면</p>
<p v-else>일반 사용자 화면</p>
</div>
</template>
설명:
v-else-if
로 연결해 다양한 결과를 처리할 수 있습니다.v-for
는 배열이나 객체를 반복하여 DOM 요소를 렌더링할 때 사용됩니다. Vue.js는 이를 통해 효율적으로 리스트를 생성합니다.
<script setup>
import { reactive } from 'vue';
const items = reactive(['사과', '바나나', '체리']);
</script>
<template>
<ul>
<li v-for="(item, index) in items" :key="index">
{{ index + 1 }}. {{ item }}
</li>
</ul>
</template>
설명:
items
배열의 각 항목이 <li>
요소로 렌더링됩니다.:key
속성은 Vue가 각 요소를 고유하게 식별할 수 있도록 돕습니다.<script setup>
import { reactive } from 'vue';
const user = reactive({
name: '홍길동',
age: 30,
job: '개발자',
});
</script>
<template>
<ul>
<li v-for="(value, key) in user" :key="key">
{{ key }}: {{ value }}
</li>
</ul>
</template>
설명:
v-if
와 v-for
를 함께 사용하는 것은 가능하지만, 성능과 코드 가독성을 고려하여 신중히 사용해야 합니다. Vue.js는 v-for
이 먼저 실행된 후 v-if
를 평가하므로, 불필요한 요소를 렌더링할 가능성이 있습니다.
<script setup>
import { reactive } from 'vue';
const items = reactive([
{ id: 1, name: '사과', show: true },
{ id: 2, name: '바나나', show: false },
{ id: 3, name: '체리', show: true },
]);
</script>
<template>
<ul>
<li v-for="item in items" v-if="item.show" :key="item.id">
{{ item.name }}
</li>
</ul>
</template>
문제점:
v-for
가 모든 항목을 반복한 뒤 v-if
를 평가하므로 성능에 부정적인 영향을 미칠 수 있습니다.v-if
조건을 배열 필터링으로 처리합니다.
<script setup>
import { reactive, computed } from 'vue';
const items = reactive([
{ id: 1, name: '사과', show: true },
{ id: 2, name: '바나나', show: false },
{ id: 3, name: '체리', show: true },
]);
const filteredItems = computed(() => {
return items.filter(item => item.show);
});
</script>
<template>
<ul>
<li v-for="item in filteredItems" :key="item.id">
{{ item.name }}
</li>
</ul>
</template>
장점:
<script setup>
import { reactive } from 'vue';
const users = reactive([
{ id: 1, name: '홍길동', active: true },
{ id: 2, name: '김철수', active: false },
{ id: 3, name: '이영희', active: true },
]);
const toggleActive = (id) => {
const user = users.find(user => user.id === id);
if (user) user.active = !user.active;
};
</script>
<template>
<div>
<h1>사용자 목록</h1>
<ul>
<li v-for="user in users" :key="user.id">
<span :class="{ active: user.active }">
{{ user.name }}
</span>
<button @click="toggleActive(user.id)">
{{ user.active ? '비활성화' : '활성화' }}
</button>
</li>
</ul>
</div>
</template>
<style scoped>
.active {
font-weight: bold;
color: green;
}
</style>
설명:
active
여부에 따라 동적으로 표시합니다.v-if
와 v-for
는 Vue.js 애플리케이션에서 중요한 역할을 하며, 이를 효과적으로 사용하면 효율적이고 가독성 높은 코드를 작성할 수 있습니다. 하지만 이 두 디렉티브를 결합할 때는 성능을 고려해야 합니다. 필터링이나 계산 속성을 사용해 효율성을 극대화하고, 유지보수를 쉽게 할 수 있는 구조를 선택하세요.
[Vue] Pinia (State Manager) (1) | 2024.12.26 |
---|---|
[Vue] Props & Emit (0) | 2024.12.24 |
[Vue] 데이터 바인딩(Data Binding) (0) | 2024.12.23 |
[Vue] 뷰 라우터(Vue Router) (2) | 2024.12.23 |
[Vue] Vite 프로젝트 생성 & 파일 용도 (0) | 2024.12.23 |
데이터 바인딩(Data Binding)의 이해와 사용법
Vue.js는 사용자 인터페이스를 구축하기 위한 JavaScript 프레임워크로, 데이터와 DOM(Document Object Model)을 효과적으로 연결하는 기능을 제공합니다. 이 연결을 데이터 바인딩(Data Binding)이라고 부르며, Vue의 핵심 개념 중 하나입니다. 데이터 바인딩을 통해 데이터 상태에 따라 뷰(View)를 동적으로 업데이트하거나, 사용자 입력에 따라 데이터 상태를 변경할 수 있습니다. 이 글에서는 Vue.js에서 데이터 바인딩이 무엇인지, 어떻게 사용하는지, 어떤 방법이 있는지 예제와 함께 살펴보겠습니다.
데이터 바인딩은 Vue 컴포넌트의 데이터와 HTML DOM 요소를 동기화하는 메커니즘입니다. Vue.js는 양방향 데이터 바인딩을 제공하므로, 데이터가 변경되면 화면이 자동으로 업데이트되고, 화면에서 사용자 입력이 발생하면 데이터에도 반영됩니다.
Vue.js에서 데이터 바인딩은 크게 아래 두 가지로 나눌 수 있습니다:
단방향 데이터 바인딩은 Vue의 v-bind
디렉티브 또는 Mustache 구문({{}}
)을 사용하여 데이터를 HTML 속성이나 콘텐츠에 바인딩합니다.
<script setup>
import { ref, reactive } from 'vue';
const message = ref('안녕하세요, Vue.js!');
</script>
<template>
<div>
<p>{{ message }}</p>
</div>
</template
<style scoped></scoped>
결과: message
값이 DOM에 출력됩니다.
v-bind
디렉티브 예제<script setup>
import { ref, reactive } from 'vue';
const imageUrl = ref('https://vuejs.org/images/logo.png');
</script>
<template>
<div>
<img v-bind:src="imageUrl" alt="Vue 로고">
</div>
</template>
<style scoped></style>
결과: imageUrl
값이 <img>
태그의 src
속성에 바인딩됩니다.
양방향 데이터 바인딩은 v-model
디렉티브를 사용하여 DOM 요소의 값과 Vue 데이터 객체를 동기화합니다.
v-model
예제<script setup>
import { ref, reactive } from 'vue';
const name = ref('');
</script>
<template>
<div>
<input v-model="name" placeholder="이름을 입력하세요">
<p>입력한 이름: {{ name }}</p>
</div>
</template>
<style scoped></style>
결과: 사용자가 입력 필드에 텍스트를 입력하면 name
데이터가 업데이트되고, 텍스트가 <p>
태그에 표시됩니다.
v-bind
를 사용하여 동적으로 속성을 설정할 수 있습니다.
<script setup>
import { ref, reactive } from 'vue';
const buttonClass = ref('primary-button');
</script>
<template>
<div>
<button v-bind:class="buttonClass">클릭하세요</button>
</div>
</template>
<style scoped></style>
v-if
)<script setup>
import { ref, reactive } from 'vue';
const isVisible = ref(true);
</script>
<template>
<div>
<p v-if="isVisible">이 문장은 조건적으로 렌더링됩니다.</p>
</div>
</template>
<style scoped></style>
v-for
)<script setup>
import { ref, reactive } from 'vue';
const items = reactive(
{ id: 1, name: '사과' },
{ id: 2, name: '바나나' },
{ id: 3, name: '체리' }
);
</script>
<template>
<div>
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</div>
</template>
<style scoped></style>
Vue.js에서 데이터 바인딩은 뷰와 데이터 간의 상호작용을 단순화하고, 코드의 가독성과 유지보수성을 높이는 중요한 도구입니다. 단방향 바인딩으로 데이터를 효율적으로 표시하고, 양방향 바인딩으로 사용자 입력을 처리하며, 필요에 따라 조건부 렌더링과 리스트 렌더링을 활용하면 강력한 사용자 인터페이스를 쉽게 구축할 수 있습니다. 데이터 바인딩의 다양한 방법을 적절히 사용하여 Vue 애플리케이션의 생산성을 극대화해보세요!
[Vue] Pinia (State Manager) (1) | 2024.12.26 |
---|---|
[Vue] Props & Emit (0) | 2024.12.24 |
[Vue] 조건문&반복문 (v-if, v-for) (0) | 2024.12.23 |
[Vue] 뷰 라우터(Vue Router) (2) | 2024.12.23 |
[Vue] Vite 프로젝트 생성 & 파일 용도 (0) | 2024.12.23 |
Vue Router는 Vue.js 애플리케이션에서 라우팅을 처리하는 공식 라이브러리입니다. 이를 사용하면 URL에 따라 컴포넌트를 렌더링하거나 SPA(Single Page Application) 내에서 페이지를 전환할 수 있습니다. 이 글에서는 Vue Router를 설정하는 방법을 예시와 함께 단계별로 설명하겠습니다.
Vue Router는 Vue.js에서 라우팅을 구현하기 위한 도구로, 다음과 같은 기능을 제공합니다:
SPA에서는 URL이 변경되더라도 전체 페이지를 다시 로드하지 않고 필요한 부분만 업데이트합니다. Vue Router는 이를 가능하게 하며, 간단하고 직관적인 방식으로 라우팅을 설정할 수 있도록 도와줍니다.
Vue Router를 사용하려면 설치 후 다음 파일을 생성하거나 수정해야 합니다:
npm install vue-router@4
Vue 프로젝트 경로 shell에서 Vue Router을 설치합니다.
src/router
디렉토리를 만들고, 그 안에 index.js
파일을 생성합니다. 이 파일은 라우터 설정을 정의하는 중심 파일입니다.
Vue 애플리케이션의 진입 파일인 src/main.js
에서 라우터를 애플리케이션에 등록해야 합니다.
각 라우트에 대응하는 컴포넌트를 생성합니다. 예를 들어, Home.vue
와 About.vue
를 만들어보겠습니다.
import { createRouter, createMemoryHistory } from 'vue-router';
import Home from '../components/Home.vue';
import About from '../components/About.vue';
const routes = [
{ path: '/', name: 'Home', component: Home },
{ path: '/about', name: 'About', component: About },
];
const router = createRouter({
history: createMemoryHistory(),
routes,
});
export default router;
이 코드는 Vue Router 인스턴스를 생성하고, 두 개의 라우트를 정의합니다.
/
경로: Home
컴포넌트를 렌더링./about
경로: About
컴포넌트를 렌더링.import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
const app = createApp(App);
app.use(router); // 라우터 등록
app.mount('#app');
라우터를 Vue 애플리케이션에 등록하여 사용할 수 있도록 설정합니다.
<script setup>
export default {
name: 'Home',
};
</script>
<template>
<div>
<h1>Home Page</h1>
<p>Welcome to the Home Page!</p>
</div>
</template>
<style scoped></style>
<script setup>
export default {
name: 'About',
};
</script>
<template>
<div>
<h1>About Page</h1>
<p>This is the About Page.</p>
</div>
</template>
<style scoped></style>
이제 Vue Router를 통해 두 페이지를 전환할 수 있습니다. 브라우저에서 /
또는 /about
경로로 이동하면 각각의 컴포넌트가 렌더링됩니다. 추가적으로, 네비게이션 바를 구현하여 라우팅을 쉽게 탐색할 수도 있습니다.
<template>
<nav>
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
</nav>
<router-view></router-view>
</template>
이렇게 하면 Vue Router를 이용한 기본적인 라우팅 설정이 완료됩니다. 더 복잡한 애플리케이션에서는 동적 라우트 매칭, 네비게이션 가드 등을 활용하여 확장된 기능을 구현할 수 있습니다. 시작하기 좋은 단계로 위의 과정을 따라해 보세요!
[Vue] Pinia (State Manager) (1) | 2024.12.26 |
---|---|
[Vue] Props & Emit (0) | 2024.12.24 |
[Vue] 조건문&반복문 (v-if, v-for) (0) | 2024.12.23 |
[Vue] 데이터 바인딩(Data Binding) (0) | 2024.12.23 |
[Vue] Vite 프로젝트 생성 & 파일 용도 (0) | 2024.12.23 |
Vue.js는 가볍고 빠른 성능을 가진 프론트엔드 프레임워크로, Vite는 현대적인 번들링 도구입니다. 이 두 가지를 조합하면 매우 효율적인 개발 환경을 구축할 수 있습니다. 이번 글에서는 Vite로 Vue 프로젝트를 생성하는 방법과 생성된 각 파일의 용도에 대해 알아보겠습니다.
먼저 Vite와 Vue를 사용해 새로운 프로젝트를 생성합니다. 다음은 단계별 과정입니다:
npm init vite [project name] --template vue
my-vue-app
은 프로젝트 이름으로 원하는 이름으로 변경 가능합니다.cd my-vue-app
npm install
npm run dev
이제 브라우저에서 http://localhost:5173을 열어 새 프로젝트를 확인할 수 있습니다!
my-vue-app
디렉터리에 생성된 파일과 폴더를 살펴보겠습니다.
src/
Vue 애플리케이션의 핵심 코드가 위치하는 폴더입니다.
src/main.js
import { createApp } from 'vue';
import App from './App.vue';
createApp(App).mount('#app');
createApp
함수로 Vue 인스턴스를 생성하고, App.vue
컴포넌트를 마운트합니다.#app
요소와 연결됩니다.src/App.vue
<template>
<h1>Hello Vite + Vue!</h1>
</template>
<script>
export default {
name: 'App',
};
</script>
<style>
h1 {
color: #42b983;
}
</style>
template
, script
, style
섹션을 포함하여 Vue의 컴포넌트 구조를 보여줍니다.src/assets/
정적 파일(이미지, 폰트 등)을 저장하는 폴더입니다.
Vue 컴포넌트를 관리하는 폴더입니다.
public/
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
<script type="module">
을 사용해 ES 모듈로 JavaScript 파일을 로드합니다.vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [vue()],
});
package.json
{
"name": "my-vue-app",
"version": "0.0.0",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.2.47"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.0.0",
"vite": "^4.0.0"
}
}
dev
: 개발 서버를 실행합니다.build
: 애플리케이션을 프로덕션 용도로 번들링합니다.preview
: 로컬에서 빌드된 애플리케이션을 미리 봅니다./node_modules/
/dist/
.env
[Vue] Pinia (State Manager) (1) | 2024.12.26 |
---|---|
[Vue] Props & Emit (0) | 2024.12.24 |
[Vue] 조건문&반복문 (v-if, v-for) (0) | 2024.12.23 |
[Vue] 데이터 바인딩(Data Binding) (0) | 2024.12.23 |
[Vue] 뷰 라우터(Vue Router) (2) | 2024.12.23 |