LoginSignup
1
1

More than 3 years have passed since last update.

Nuxt.jsをVue.jsに解体するTips(Layout編)

Last updated at Posted at 2020-05-21

背景

  • Nuxt.jsで動いているSPAアプリをVue.jsに解体してほしい的な話があり、部分部分をTipsとして投稿します。
  • APIはLaravel(6.x)です。なおLaravelとNuxt.jsは同一リポジトリです(なぜ)
  • Nuxt.jsは2.9。Vueは2.6.10
  • 今回はLayout編です。

Layoutを分けたい

nuxt/pages/~~.vue
<script>
export default {
  layout: 'noauth',
  • 認証に見れるとLayoutと非認証時に見れるLayoutを分けた時があります。そういった時Nuxt.jsは上記のように簡単にできますが、Vue.jsだとコツが必要です。

Layoutをそれぞれ作成する

認証用のLayout

resources/js/layouts/default.vue
<template>
  <div>default
    <router-view />
  </div>
</template>

非認証時に見れるレイアウト

resources/js/layouts/noauth.vue
<template>
  <div>noauth
    <router-view />
  </div>
</template>

resources/js/router.jsの編集

Routerでmeta layoutを定義する

resources/js/router.js
import Vue from 'vue'
import Router from 'vue-router'
import Index from '~/pages/index'

Vue.use(Router)

const router = new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'Index',
      meta: { layout: 'default' },
      component: Index,
    },
    {
      path: '/noauth',
      name: 'NoAuth',
      meta: { layout: 'noauth' },
      component: Index,
    },
  ],
});

resources/js/App.vueの編集

メタフィールドをみてLayoutを変更

resources/js/App.vue
<template>
  <div id="app">
    <component v-bind:is="layout" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      defaultLayout: "default"
    };
  },
  computed: {
    layout() {
      return (this.$route.meta.layout || this.defaultLayout) + "-layout";
    }
  }
};
</script>

Layout用のコンポーネントを定義

resources/js/app.js
import Vue from "vue";
import router from '~/router'
import App from '~/App.vue'

import DefaultLayout from '~/layouts/default'
import NoAuthLayout from '~/layouts/noauth'

Vue.component('default-layout', DefaultLayout)
Vue.component('noauth-layout', NoAuthLayout)

new Vue({
  router: router,
  render: h => h(App),
}).$mount('#app')

参考

関連リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1