blog

ビュー・ルーター

1.パーミッション制御を実装したいインデックスのルーティングコンポーネントにmetaを追加し、その中にtrueに設定するカスタム属性を追加します。...

Dec 22, 2020 · 4 min. read
シェア

ログイン操作にグローバルガードを使用

インデックスのルートに対応するルーティングコンポーネントを記述します。

 {
 path:'/notes',
 name:'notes',
 component:() => import('@/views/Notes')
 },
 {
 path:'/login',
 name:'login',
 component:() => import('@/views/Login')
 }

新しいログインページとメモページのビューと簡単な書き込み

main.jsのimport以下にglobal guard router.beforeEachを記述します。

localStorage.getItem('user')を使ってローカル情報のuserの値を取得

この値があればそのまま、なければnext('/login')でログイン画面へ。

//グローバル・ガード
router.beforeEach((to, from, next) => {
 // console.log(to); 現在のルート情報を表示する
 // ユーザーが/notesにアクセスした
 if(to.path === '/notes'){
 //ログイン情報を取得する
 const user = JSON.parse(localStorage.getItem('user'));
 if(user){
 //ユーザーがログインしている
 next();
 }else{
 //ユーザーがログインしていない ログイン画面に飛ぶ
 next('/login');
 }
 }
 next();
})

ログインビューを書く

簡単なログイン画面を書く

<template>
 <div>
 <h2>ページにログインする</h2>
 <input type="text" v-model='user'>
 <input type="password" v-model='pwd'>
 <button @click = 'handleLogin'> </button>
 </div>
</template>

データ属性の書き込み、ユーザー情報の取得、localStorage.setItem()によるユーザー情報のローカル保存、ノートページへのジャンプ

export default {
 data() {
 return {
 user: '',
 pwd:''
 }
 },
 methods: {
 handleLogin() {
 //1.ユーザー名とパスワードを取得する
 //2.バックエンドとやりとりする
 setTimeout(() => {
 let data = {
 user:this.user
 }
 //ユーザー情報をローカルに保存する
 localStorage.setItem('user',JSON.stringify(data.user));
 //メモのページに飛ぶ
 this.$router.push('/notes')
 }, 1000);
 }
 },
 }

コンポーネント内部のガード

コンポーネント内部には3つの内部ガードがあります。

beforeRouterEnter(to,from,next){}

追記: thisを呼び出すことはできません。呼び出すと未定義になりますが、このメソッドはインスタンスを取得するコールバック関数を提供します。

beforeRouterUpdate(to,from,next){}

beforeRouterLeave(to,from,next){}

許可制御を実装するためのメタメタ情報

許可制御を実装する必要があるルーティングコンポーネントのインデックスにmetaを追加し、それをtrueに設定するカスタム属性を追加します。

{
 path:'/blog',
 name:'blog',
 component:() => import('@/views/Blog'),
 meta:{
 //検証対象リストに追加する
 requireAuth:true
 }
}

main.jsにグローバルガードを設定します。

to.matched.someメソッドで検証すべき条件があるかどうかの判断

必要な認証情報があるかどうかの判断

もしログイン情報がなければ、次の方法でログインページにジャンプします。

router.beforeEach((to, from, next) => {
 //sometrue recordがメソッド内のカスタムフォーマル・パラメーターかどうかを判断する
 if(to.matched.some(record => record.meta.requireAuth)){
 //パーミッションが必要
 if(!localStorage.getItem('user')){
 next({
 path:'/login',
 //ログインした後に、ログインしたばかりのページにジャンプして開くために使う。
 query:{
 redirect: to.fullPath
 //フルパス
 }
 });
 }else{
 next();
 }
 }
 next();
})

最後に、ログインルートでログインに成功すれば、今ページにジャンプできます。

 setTimeout(() => {
 let data = {
 user:this.user
 }
 //ユーザー情報をローカルに保存する
 localStorage.setItem('user',JSON.stringify(data.user));
 //メモのページに飛ぶ
 this.$router.push({
 path:this.$route.query.redirect
 })

ルーティングコンポーネント内のデータ取得

つはナビゲーションが完了する前にデータを取得する場合、もう1つはナビゲーションが完了した後にデータを取得する場合です。

プロジェクトディレクトリに新しいvue.config.jsを追加します。

アナログバックエンドがデータを送信するように設定します。

module.exports = {
 devServer:{
 before:(app,serve) => {
 app.get('/api/post',(req,res) => {
 res.json({
 title:'Vue-Routerデータ取得」を行う,
 body:'1.ナビゲーション完了後にデータを取得する
 }) })
 } } }

main.jsが導入され、Vueのプロトタイプチェーンに追加されます。

import axios from 'axios'
Vue.prototype.$http = axios;

ポストルーティングコンポーネントの紹介でインデックスを作成し、新しいポストビューを作成します。

ポストへの書き込み.vue

作成時のカスタムメソッドの呼び出し
メソッド内でasyncを使ったカスタムメソッドの呼び出し
データの作成
ページの書き込み
時計によるデータ取得のためのリスニング
<template>
 <div class='post'>
 <div v-if='loading' class='loading'>
 Loading...
 </div>
 <div v-if='error' class='error'>{{error}}</div>
 <div v-if='post'>
 <h3> {{post.title}}</h3>
 <h4> {{post.body}}</h4>
 </div>
 </div>
</template>
<script>
 export default {
 data() {
 return {
 post: null,
 error:null,
 loading:false
 }
 },
 created () {
 console.log(this.$http);
 this.getPostData();
 },
 //データ取得をリスンする
 watch: {
 //ルーティングデータが変更されたらデータをリクエストする
 $route:'getPostData'
 },
 methods: {
 async getPostData() {
 try {
 this.loading = true;
 const {data} = await this.$http.get('/api/post');
 this.loading = false;
 this.post = data;
 } catch (error) {
 this.error = error.toString();
 }
 }
 },
 }
</script>
<style lang="scss" scoped></style>
Read next

フロントエンドキャッシュメカニズムのまとめ

キャッシュ入門\nウェブキャッシュはウェブサーバーとクライアントコピーの間に存在するウェブリソースです。\nキャッシングはパフォーマンス最適化の一形態と考えることができます。 サーバーへのリクエストを開始するとき、優れたキャッシング戦略は、サーバーに送信されるリクエストの数を減らすのに役立ちます。

Dec 21, 2020 · 8 min read