๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Project

[ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ์„ธํŒ…] ๋ ˆ์ด์•„์›ƒ & ๋ฉ”๋‰ด ์ ์šฉ ๋ฐ ๋ผ์šฐํ„ฐ ์ƒ์„ฑ

ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ์„ธํŒ…

5. [ํ”„๋ก ํŠธ์—”๋“œ] ๋ ˆ์ด์•„์›ƒ & ๋ฉ”๋‰ด ์ ์šฉ ๋ฐ ๋ผ์šฐํ„ฐ ์ƒ์„ฑ"


๋ ˆ์ด์•„์›ƒ ์ ์šฉ & ๋ผ์šฐํ„ฐ ์ƒ์„ฑ

๋ ˆ์ด์•„์›ƒ & ๋ฉ”๋‰ด ์ ์šฉ

๋ ˆ์ด์•„์›ƒ์€ vuetify์—์„œ ์ œ๊ณตํ•ด ์ฃผ๋Š” Pre Made Layouts ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ๋ ˆ์ด์•„์›ƒ ์ค‘ Baseline ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

Baseline์˜ ์ฝ”๋“œ ํŒฌ์— ์žˆ๋Š” html๊ณผ js ์ฝ”๋“œ๋ฅผ App.vue ํŒŒ์ผ๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค.

Baseline code pen ๋งํฌ

<v-list-item link router :to="{ name: 'home' }">
              <v-list-item-action>
                <v-icon>mdi-home</v-icon>
              </v-list-item-action>
              <v-list-item-content>
                <v-list-item-title>Home</v-list-item-title>
              </v-list-item-content>
            </v-list-item>

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ v-list ํ•˜๋‹จ์— ๋ฉ”๋‰ด๋“ค๋„ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

ํ˜„์žฌ๋Š” ํ™ˆ, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ, ํ”„๋กœํ•„ ๋ฉ”๋‰ด๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

<script>
import { mapState, mapMutations } from "vuex"
export default {
  name: "App",
  data: () => ({
    drawer: null
  }),
  computed: {
    ...mapState(["isLogin", "userInfo"])
  },
  methods: {
    ...mapMutations(["logout"])
  }
}
</script>

์ธ์ฆ ํ™•์ธ ๊ธฐ๋Šฅ์„ vuex๋กœ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฏธ๋ฆฌ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

์ ์šฉ๋œ ํ™”๋ฉด


app-bar์™€ footer์— ์›ํ•˜๋Š” ํƒ€์ดํ‹€ ๋ฐ ์„ค๋ช…์„ ์ ์–ด์ฃผ๊ณ  indigo ์ƒ‰์ƒ์„ ์ ์šฉ์‹œ์ผฐ๋‹ค.

๋ผ์šฐํ„ฐ ์ƒ์„ฑ

import Vue from "vue"
import VueRouter from "vue-router"
import store from "@/store"

Vue.use(VueRouter)

const rejectAuthUser = (to, from, next) => {
  if (store.state.isLogin === true) {
    alert("์ด๋ฏธ ๋กœ๊ทธ์ธ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.")
    next("/")
  } else {
    next()
  }
}

// const onlyAuthUser = (to, from, next) => {
//   if (store.state.isLogin === false) {
//     alert("๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.")
//     next("/login")
//   } else {
//     next()
//   }
// }

const routes = [
  {
    path: "/home",
    name: "home",
    component: () => import(/* webpackChunkName: "home" */ "../views/Home.vue")
  },
  {
    path: "/login",
    name: "login",
    beforeEnter: rejectAuthUser,
    component: () =>
      import(/* webpackChunkName: "login" */ "../views/Login.vue")
  },
  {
    path: "/register",
    name: "register",
    beforeEnter: rejectAuthUser,
    component: () =>
      import(/* webpackChunkName: "register" */ "../views/Register.vue")
  }
]

const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes
})

export default router

src ํ•˜์œ„์— router๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ index.js ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.

๊ทธ ๋’ค main.js์—๋„ router๋ฅผ ๋“ฑ๋กํ•ด ์ค€๋‹ค.

const rejectAuthUser = (to, from, next) => {
  if (store.state.isLogin === true) {
    alert("์ด๋ฏธ ๋กœ๊ทธ์ธ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.")
    next("/")
  } else {
    next()
  }
}

const onlyAuthUser = (to, from, next) => {
  if (store.state.isLogin === false) {
    alert("๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.")
    next("/login")
  } else {
    next()
  }
}

๊ณ„์ •์ด ์ธ์ฆ๋˜์—ˆ๋Š”์ง€ ์•ˆ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ์„ ํ•˜๊ณ  ํ•„ํ„ฐ๋ง์„ ํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

axios ์„ค์น˜

api์™€์˜ ํ†ต์‹ ์€ axios๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ axios๋ฅผ ์„ค์น˜ํ•ด ์ค€๋‹ค.

$ npm install axios

axios๋„ main.js์— ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

axios.defaults.baseURL = "http://localhost:5000/api"

๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์‚ญ์ œ

logo.png, logo.svg ๋“ฑ์˜ vuetify๋‚˜ vue.js์˜ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ํŒŒ์ผ,

HelloWorld.vue์™€ ๊ฐ™์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋“ค๋„ ๋‹ค ์‚ญ์ œํ•ด ์ค€๋‹ค.