Introduction & Project setup

How to create advanced vue3 component with pinia?

How to setup project

Vue3 + VITE

https://vuejs.org/guide/quick-start.html#quick-start ๋ฅผ ์ฐธ๊ณ ํ•ด Vue3 ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Let's say you already have Vite + Vue3 project.

์ƒˆ๋กœ์šด Vue3 ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. Vite๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์œผ๋‹ˆ ๊ผญ Vite๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ƒ์„ฑํ•œ Vue3 ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์Šคํ‚ตํ•ฉ๋‹ˆ๋‹ค.

[optional] node ๋ฒ„์ „์€ 18.16.1

nvm use 18.16.1

Storybook ์„ค์น˜

pnpm dlx storybook@latest init

[์ฐธ๊ณ ] package.json์˜ storybook dependencies

"@storybook/addon-essentials": "^7.5.3",
"@storybook/addon-interactions": "^7.5.3",
"@storybook/addon-links": "^7.5.3",
"@storybook/blocks": "^7.5.3",
"@storybook/testing-library": "^0.2.2",
"@storybook/vue3": "^7.5.3",
"@storybook/vue3-vite": "^7.5.3",
"storybook": "^7.5.3"

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

pnpm storybook

Storybook ์„ค์ •

ui-test folder has *.vue and *.stories.js

๊ธฐ๋ณธ ํฌํŠธ๊ฐ€ 6006, localhost:6006์œผ๋กœ ์ ‘์†์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ์Šคํ† ๋ฆฌ๋“ค์ด ์ƒ๊น๋‹ˆ๋‹ค.

์ƒ์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์Šคํ† ๋ฆฌ๋ถ์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€ ํŒŒ์ผ์„ ํ•จ๊ป˜ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SFC (๋ทฐ ์ปดํฌ๋„ŒํŠธ)

<template>
  <div class="flex items-center p-2 bg-white rounded-lg shadow-sm hover:bg-gray-100">
    <img 
      v-if="userData && userData.avatar"
      :src="userData.avatar" 
      alt="User Avatar" 
      class="w-8 h-8 rounded-full"
    />
    <span v-if="userData" class="ml-3 text-sm font-medium text-gray-700">
      {{ userData.name }}
    </span>
    <span v-if="userData.loading" class="ml-3 text-sm font-medium text-gray-700">
      Loading...
    </span>
  </div>
</template>

<script setup>
import { storeToRefs } from 'pinia';
import { useUserStore } from '../../stores/user'
const userStore = useUserStore();
const { userData } = storeToRefs(userStore);
</script>

story

import UserProfile from './UserProfile.vue';
import { useUserStore } from '@/stores/user';

export const Base = {
  render: (args) => ({
    components: { UserProfile },
    setup() {
      const userStore = useUserStore();
      userStore.userData = {
        name: "John Doe",
        email: "[email protected]",
        id: 53,
        avatar: "https://api.dicebear.com/7.x/fun-emoji/svg"
      }
      return { args }
    },
    template: /* html */`
      <UserProfile 
        v-bind="args"
      />
    `,
  }),
  args: {
    alt: "storybook Profile"
  }
}

export default {
  component: UserProfile
}

๊ฐ™์ด ์„ค์น˜ํ•˜๋ฉด ์ข‹์„ vscode extension

์ฃผ์„ ์‚ฌ์šฉ์‹œ ๋งˆํฌ์—… ํ•˜์ด๋ผ์ดํŒ…์ด ๋˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Last updated