Vue Routerによる画面遷移の情報がrouter-link
を使うものが多かったので備忘録。
下準備
Vue.jsでプロジェクトを作成したらVue Routerをインストールする。
npm install vue-router@4
Vue Routerによるルーティング先の登録用のJSファイルを作成する。これが画面遷移の案内板となる。
//Vue Routerを使うためにインポート。
import { createRouter, createWebHistory } from 'vue-router'
import MainPage from 'MainPageの場所'
import OtherPage from 'OtherPageの場所'
export const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/',
name: 'main',
component: MainPage
//引数のないコンポーネントは上記3つで十分。
},
{
path: '/other',
name: 'other',
component: OtherPage,
props: route => ({id: route.params.id, text: route.params.text})
//引数がある場合はpropsを指定しておく。ここでは関数の書き方で引数を指定する。
}
]
})
上記で作成した案内板をmain.js
で登録し、アプリケーション全体で利用できるようにする。
(余談だがVue.js 3ではまだbootstrap-vueが使えないので普通のBootstrapを使う。)
import { createApp } from 'vue'
import { router } from 'router.jsの場所' //上記で作ったrouterをインポート
import App from 'App.vueの場所'
import 'bootstrap/dist/css/bootstrap.css'
const app = createApp(App)
app.use(router) //routerをアプリケーション全体で使えるようにする
app.mount('#app')
最後に画面遷移で切り替えたい箇所にrouter-view
を書く。
<template>
<!-- ここでrouterに登録したコンポーネントが切り替わる-->
<router-view></router-view>
</template>
<script>
export default {
name: 'App'
}
//その他処理を記載
</script>
<style>
/* CSSを記載 */
</style>
これで下準備は完了。
ボタンに画面遷移の処理を追加
routerに登録したコンポーネントにボタンを追加し、ボタン押下時の画面遷移先と渡す引数を設定する。
<template>
<button
type="button"
class="btn btn-primary"
@click="() => $router.push({ name: 'other', params: { id: userId, text: userText } })" >
Button Name
</button>
</template>
<script>
export default {
name: 'MainPage',
data() {
return {
userId: '12345',
userText: 'this is other page'
}
}
}
</script>
<style>
/*CSSを記載*/
</style>
@click
以下でボタン押下時のイベントを定義する。(@click
はv-on:click
でも可)
name
にはrouter.js
のname
に定義した名前を記載し、params
にはrouter.js
のprops
で定義した通りに引数を記載する。
router.push
はparams
がない場合はpath
を記載して遷移することも可能だが、params
がある場合はname
でなければ警告が出て動作しないので注意しよう。
<button
type="button"
class="btn btn-primary"
@click="() => $router.push({ path: '/other' })">
あとは遷移先の画面でprops
を使って引数を受け取れば遷移は無事完了。
<template>
<div>
<!-- 受け取った引数を表示 -->
<div>{{ id }}</div>
<div>{{ text }}</div>
</div>
</template>
<script>
export default {
name: 'OtherPage',
props: {
//ここで引数を受け取る
id: String,
text: String
}
}
</script>
<style>
/*CSSを記載*/
</style>
参考
Vue Router公式
https://router.vuejs.org/guide/essentials/passing-props.html#passing-props-to-route-components
https://router.vuejs.org/guide/essentials/navigation.html#programmatic-navigation