見出し画像

Vue.js勉強記録その25 Vue3を更にパワーアップしよう 5-2 ver2

こちらの書籍で勉強中です。
今回は、前回のルーティングの続きで、名前付きビューの話です。

また、パラメーターの扱いについても書いていきます。


■Vue Routerによるルーティング管理

・名前付きビュー

前回の記事で書いた、router-viewには、name属性をつけて、表示させるコンポーネントを指定することが出来る。

router.jsを以下の様に書き換える。

import { createRouter, createWebHistory } from 'vue-router'
import HelloWorld from "./components/HelloWorld.vue";
import HelloJSX from "./components/HelloJSX.jsx";

export const router = createRouter({
   history: createWebHistory(),
   routes: [
       {
           path: '/',
           name: 'index',
           components: {
               default: HelloWorld,
               first: HelloWorld,
               second: HelloJSX
           }
       },
       {
           path: '/jsx',
           name: 'jsx',
           components: {
               default: HelloJSX,
               first: HelloJSX,
               second: HelloWorld
           }
       }
   ]
})

componentsの書き方が、オブジェクトになっている。

components:{
    default:デフォルトのコンポーネント,
    名前:割り当てるコンポーネント,
    ・・・必要なだけ用意・・・
}

こんな感じで指定する。
router-viewで、name属性に上記の記述で書いた名前を書く。
name属性がない場合は、defaultの値が使われる。

components:{
    default:Normal,
    abc:ABC,
}
この場合、
////////////////////////

<router-view></router-view> これは、Normal

<router-view name="abc"></router-view> これはABC

今回のrouter.jsは、以下の様な内容になっている。

pathが/の時
default:HelloWorld
first:HelloWorld
second:HelloJSX

pathが/jsxの時
default:HelloJSX
first:HelloJSX
second:HelloWorld

お互いに互い違いになる感じに書かれている。


App.vue

<template>
 <div>
   <router-link to="/" class="btn btn-primary mx-2"> Go to Top </router-link>
   <router-link to="/jsx" class="btn btn-warning"> Go to JSX </router-link>
 </div>
 <hr />
 <h5>default view</h5>
 <router-view />
 <h5>A & B</h5>
 <router-view name="first"></router-view>
 <router-view name="second"></router-view>
</template>

<script>
export default {
 name: "App",
 data() {
   return {
     title: "Router",
   };
 },
};
</script>

router-viewは合計3つあり、名前なし、fitst、secondの順で書かれている。


パスが「/」の時

スクリーンショット 2022-03-14 21.27.22


パスが、「/jsx」の時

スクリーンショット 2022-03-14 21.27.25

こんな感じになる。

first、secondに割り当てたコンポーネントがパスによって変わるのがわかる。


・パラメーターの使用

urlにパラメーターを指定したい時。

Helloworld.vue
<h1>{{ data.title + "[" + name + "]" }}</h1>でnameパラメータを使用

<template>
 <div class="alert alert-primary">
   <h1>{{ data.title + "[" + name + "]" }}</h1>
   <p class="mt-3 h5">{{ data.msg }}</p>
 </div>
</template>

<script>
import { ref, reactive } from "vue";
export default {
 name: "HelloWorld",
 props: {
   name: String,
 },
 setup(props, context) {
   const data = reactive({
     title: "Router",
     msg: "This is HelloWorld component",
   });
   return { data };
 },
};
</script>


HelloJSX.jsx
<h1>{data.title}[{props.name}]</h1>で、name属性を使用

import { ref, reactive } from 'vue'

export default {
   name: 'HelloJSX',
   props: {
       name: String
   },
   setup(props) {
       const data = reactive({
           title: 'Router',
           msg: 'This is JSX component sample.'
       })
       return () => (
           <div class='alert alert-warning'>
               <h1>{data.title}[{props.name}]</h1>
               <p>{data.msg}</p>
           </div>
       )
   }
}


router.js

import { createRouter, createWebHistory } from 'vue-router'
import HelloWorld from "./components/HelloWorld.vue";
import HelloJSX from "./components/HelloJSX.jsx";

export const router = createRouter({
   history: createWebHistory(),
   routes: [
       {
           path: '/',
           redirect: '/index/taro'
       },
       {
           path: '/index/:name',
           name: 'index',
           component: HelloWorld,
           props: true
       },
       {
           path: '/jsx/:name',
           name: 'jsx',
           component: HelloJSX,
           props: true
       }
   ]
})

ルーターでパラメータを使用する方法

{
path: '/index/:name',
name: 'index',
component: HelloWorld,
props: true
},

こんな感じで、パスに、:パラメータ名をつける今回の場合は、nameがパラメータ。

/index/taro

このURLの場合、taroがパラメータになる。

なお、routerの設定の一番最初にある、
{
path: '/',
redirect: '/index/taro'
},
この部分は、リダイレクトになる。
ルートパスにアクセスしたら、/index/taroに飛ぶ様になる。

App.vueを以下に変更。上部のボタンのtoの値が変わっている

<template>
 <div>
   <router-link to="/index/taro" class="btn btn-primary mx-2">
     Go to Top
   </router-link>
   <router-link to="/jsx/hanako" class="btn btn-warning">
     Go to JSX
   </router-link>
 </div>
 <hr />
 <router-view></router-view>
</template>

<script>
export default {
 name: "App",
 data() {
   return {
     title: "Router",
   };
 },
};
</script>

/index/TAROにアクセスすると、以下の感じ

スクリーンショット 2022-03-14 21.37.50


jsx/HANAKOにアクセすると以下の感じ。

スクリーンショット 2022-03-14 21.37.54


なお、パラメータを複数設定したい時などは、以下の書き方が便利。

:to="{name:ルーターの名前,params:{パラメータ名:値,,,,,}}"

App.vue

<template>
 <div>
   <router-link
     :to="{ name: 'index', params: { name: 'TARO' } }"
     class="btn btn-primary mx-2"
   >
     Go to Top
   </router-link>
   <router-link
     :to="{ name: 'jsx', params: { name: 'HANAKO' } }"
     class="btn btn-warning"
   >
     Go to JSX
   </router-link>
 </div>
 <hr />
 <router-view></router-view>
</template>


■まとめ

今回でrouterに関してが終わりになります。

ページを読み込まないで遷移させる方法は、ぜひ習得したいので、しっかり復習したいです。

この記事が気に入ったらサポートをしてみませんか?