프로그래밍/vue

[vue] 레이아웃 컴포넌트

혀끄니 2023. 11. 24. 09:00
728x90
  • 레이아웃 컴포넌트

- 페이지의 레이아웃을 잡아주는 역할을 하는 컴포넌트

- App.vue를 그대로 안쓰고 메뉴만 모아놓은 header 컴포넌트, 고정적으로 쓰는 footer 컴포넌트를 template에 넣어서 사용한다.

- 뷰컴포넌트 이름은 반드시 2단어 이상 합쳐져서 만들어져야 한다.

- 함수에서 라우터 path 변경하는 방법은 this.$router.push({path:path})

App.vue

<template>
  <header-layout />
  <router-view />
  <footer-layout />
</template>
<script>
import HeaderLayout from '@/components/layouts/HeaderLayout.vue'
import FooterLayout from '@/components/layouts/FooterLayout.vue'
export default {
  components: { HeaderLayout, FooterLayout }
}
</script>
<style>
/* #app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;
}

nav a {
  font-weight: bold;
  color: #2c3e50;
}

nav a.router-link-exact-active {
  color: #42b983;
} */
</style>

 

HeaderLayout.vue

<template>
  <!-- <nav>
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link> |
    <router-link to="/databinding/string">String</router-link> |
    <router-link to="/databinding/html">Html</router-link>
  </nav> -->
  <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container-fluid">
      <a class="navbar-brand" href="#">oOpsDev</a>
      <button
        class="navbar-toggler"
        type="button"
        data-bs-toggle="collapse"
        data-bs-target="#navbarSupportedContent"
        aria-controls="navbarSupportedContent"
        aria-expanded="false"
        aria-label="Toggle navigation"
      >
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav me-auto mb-2 mb-lg-0">
          <li class="nav-item">
            <a
              class="nav-link active"
              aria-current="page"
              @click="goToMenu('/')"
              >Home</a
            >
          </li>
          <li class="nav-item">
            <a class="nav-link" @click="goToMenu('/about')">About</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" @click="goToMenu('/databinding/string')"
              >String</a
            >
          </li>
          <li class="nav-item">
            <a class="nav-link" @click="goToMenu('/databinding/html')">Html</a>
          </li>
        </ul>
        <form class="d-flex" role="search">
          <input
            class="form-control me-2"
            type="search"
            placeholder="Search"
            aria-label="Search"
          />
          <button class="btn btn-outline-success" type="submit">Search</button>
        </form>
      </div>
    </div>
  </nav>
</template>
<script>
export default {
  methods: {
    goToMenu(path) {
      this.$router.push({ path: path })
    }
  }
}
</script>

 

FooterLayout.vue

<template>
  <div class="container">
    <footer
      class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top"
    >
      <div class="col-md-4 d-flex align-items-center">
        <span class="mb-3 mb-md-0 text-muted">&copy; 2022 Company, Inc</span>
      </div>
    </footer>
  </div>
</template>

 

728x90