vue-router ナビゲーション ガードを使用してトークン ログイン ページ ジャンプを実装する

何かわからないことがあれば、個別にメッセージを送ってください!!!

1 はじめに

要件の紹介

今回は、複数のページにジャンプする簡易ログインページを実現する手順ですが、ジャンプページには、 1.
ログインするたびにトークンを保存する
2. ログインとログアウトするたびにトークンをクリアする という条件もあります
。 3. URL の変更を防止します。ハッシュ パラメーターは、バックエンド ホームページにアクセスするために使用されます。ナビゲーション ガード beforeEach は、ローカル ストレージにトークンがあるかどうかを検出するために使用されます。トークンがあれば、バックエンド ホームページにアクセスできます。 . そうでない場合はできません。

2つの主要な知識ポイント

2.1 ナビゲーションガード

ルーティング ナビゲーション ジャンプが発生するたびに、グローバル プレガードがトリガーされます。仮パラメータは 3 つあります
A->C
1. to 関数は、アクセスされるルーティング オブジェクト C です。
2. from 関数は、ルーティング オブジェクト A です。 3.次へ
リリースを示す機能

   // 只要发生了路由的跳转 必然会触发beforeEach指定的function回调函数
   router.beforeEach((to,from,next)=>{
    
    
   	//需要检查是否登录的白名单
   	const pathArr=[
   	'/home',
   	'/home/yonghu',
   	'/home/quanxian',
   	'/home/shangpin',
   	'/home/dingdan',
   	'/home/xitong',
   	'/home/userinfo'
   ]
   
   	// A->C
   // to函数是将要访问的路由对象 C
   // from函数是将要离开路由对象   A
   // next函数表示放行
   // 分析
   // 1.要拿到用户将要访问的hash地址
   // 2.判断hash地址是否等于/Main
   // 2.1.如果等于/Main.证明要登录之后,才能访问成功
   // 2.2.如果不等于/Main,则不需要登录,直接放行next()
   // 3.如果访问的地址时/Main,则需要读取localStorage中的token值
   // 3.1如果有token,则放行
   // 3.2如果没有token,则强制跳转到/login登录页
   
   	// 要是多个页面都需要token检测
   	// 找to.path在不在这个pathArr数组里面,要是等于-1就是不在,不等于-1就是在
   	if(pathArr.indexOf(to.path) !== -1){
    
    
   		// 要访问后台主页,需要判断是否有token
   		const token=localStorage.getItem('token')
   		if(token){
    
    
   			next()
   		}else{
    
    
   			next('/login')
   		}
   	}else{
    
    
   		next()
   	}
   })

2.2 ストレージ設定トークン

ログイン時にクリックイベントを通じて submit メソッドを呼び出します。

		submit(username,password){
    
    
			console.log(username);
			console.log(password);
			if(username=='123' && password=='123'){
    
    
				// 登录成功存储设置token
				localStorage.setItem('token','whl 123123')
				console.log('登录成功');
				this.$router.push('/home')
			}else{
    
    
				// 登陆失败清除toekn
				localStorage.removeItem('token')
				console.log('登录失败');
			}
		},

2.3 クリアトークン

	localStorage.removeItem('token')

2.4 トークンの取得

	const token=localStorage.getItem('token') //获取之后,用token变量进行接收
	console.log(token)

その他の 3 つの重要な知識ポイント

3.1 プログラムによるナビゲーション API

ブラウザーでは、API メソッドを呼び出してナビゲーションを実装する方法をプログラム ナビゲーションと呼びます。例:
⚫ 通常の Web ページで新しいページにジャンプするために location.href を呼び出すメソッドは、プログラム ナビゲーションに属します。
⚫ vue-router は、多くのプログラム ナビゲーション API を提供します。その中で、最も一般的に使用されるナビゲーション API は次のとおりです。

	⚫ 跳转到指定 hash 地址,并增加一条历史记录
	this.$router.push('hash地址') //这里的hash地址就是router文件夹下index.js跟组件的对应关系
	⚫ 跳转到指定的 hash 地址,并替换掉当前的历史记录
	this.$router.replace('hash地址')
	⚫ 实现导航历史前进、后退
	this.$router.go(数值 n)
	//在实际开发中,一般只会前进和后退一层页面。因此 vue-router 提供了如下两个便捷方法:
	⚫ 在历史记录中,后退到上一个页面
	this.$router.back()
	⚫ 在历史记录中,前进到下一个页面
	this.$router.forward()

3.2 ネストされたルーティング

ここに画像の説明を挿入します
1.router-view: vue-router がプロジェクトにインストールされ構成されている限り、vue-router コンポーネント (プレースホルダー) を使用できます。

	<router-view></router-view>

2.router-link: vue-router をインストールした後、リンクの代わりに router-link を使用できます。

	<a href="#/movie">电影</a>
	<router-link to="/movie">电影</router-link>

3. ここで注意すべきは、最初のルータービューと 2 番目のルータービューには関係がないということであり、最初のルータービューは親コンポーネントにあり、2 番目のルータービューは子コンポーネントにあり、それらは接続されていることがわかります。 router-link を呼び出して、router-view を使用して別のコンテンツを表示します。

	<router-link to="/about">tab1</router-link>  //children的path为空,叫做默认子路由,{path:'',component:Tab1}
	<router-link to="/about/tab2">tab2</router-link>
	<hr>
	<router-view></router-view>
	//src.router.index.js是当前项目的路由模块
	
	// 1.导包
	import Vue from 'vue'
	// VueRouter是构造函数,要new实例
	import VueRouter from 'vue-router'
	import Home from '@/components/Home.vue'
	import Movie from '@/components/Movie.vue'
	import About from '@/components/About.vue'
	import Tab1 from '@/components/tabs/Tab1.vue'
	import Tab2 from '@/components/tabs/Tab2.vue'
	
	
	//2.调用vue.use()给vue装插件,把VueRouter安装为vue插件
	Vue.use(VueRouter)
	
	// 3.创建路由的实例对象
	const router=new VueRouter({
    
    
		// routes是一个数组,作用定义"hash地址"与"组件"之间的关系
		routes:[
			//路由规则
			// 当用户访问 / 的时候,通过redirect跳转到/home对应的路由规则
			{
    
    path:'/',redirect:'/home'},
			{
    
    path:'/home',component:Home},
			{
    
    path:'/movie',component:Movie},
			{
    
    
				//about页面的路由规则(父级路由规则)
				path:'/about',
				component:About,
				// 通过children嵌套声明子级路由的规则
				children:[
					//默认子路由:如果children数组中,某个路由的规则的path空值
					// 为空字符串,则这条路由规则,叫做”默认子路由“
					{
    
    path:'',component:Tab1},
					{
    
    path:'tab2',component:Tab2}
				]
			},
		]
	})
	
	// 4.向外共享路由的实例对象
	export default router

3.3 動的ルーティング

ハッシュアドレスの可変部分をパラメータ項目として定義し、ルールの再利用性を向上

たとえば、このプロジェクトでは、製品と製品の詳細ページを開発できます。詳細ボタンをクリックすると、製品の詳細ページにジャンプします。このとき、ダイナミック ルーティングが使用されます。シンプルで使いやすいことに加えて、より大きな役割を果たします。ページが異なる ID を取得するため、各商品詳細ページは異なる商品データを取得します。

	{
    
    path:'/movie/:id',component:Movie},

ここに画像の説明を挿入します

3.3.1 ルーターへのデータ転送

	<a href="#" @click.prevent="xiangqing(item.id)">详情</a>
		
	xiangqing(id){
    
    
		this.$router.push('/home/userinfo/'+id)
	}	
	

3.3.2 ルーターは次の経由で受信します:id

	const router = new VueRouter({
    
    
		// path里面的hash地址不能够是大写
		routes:[
			// redirect重定向/login,再指向component的
			// Login渲染到router-view
			{
    
    path:'/',redirect:'/login'},
			{
    
    path:'/login',component:Login},
			{
    
    	
				path:'/home',
				component:Home,
				redirect:'/home/yonghu',
				children:[
					// 要是子路由中,某个path为空值,默认子路由(默认展示)
					// children不需要添加/
					{
    
    path:'yonghu',component:MyUsers},
					{
    
    path:'quanxian',component:MyRights},
					{
    
    path:'shangpin',component:MyGoods},
					{
    
    path:'dingdan',component:MyOrders},
					{
    
    path:'xitong',component:MySettings},
					// :id主要租用就是;因为是详情,就通过id来进行区分
					{
    
    path:'userinfo/:id',component:MyUserDetail,props:true},
				]
			},
		
		]
	})

3.3.2 $routeパラメータオブジェクトの取得

3.3.2.1 this.$route.params

対応するメソッドの直下で使用します

	{
    
    {
    
    this.$route.params.id}} //1,2,3
3.3.2.2 小道具を介してパラメータを渡す

前提:ルーター対応でprops:trueをonにして上記のコードを書いている必要があります。

	props:['id'] //进行注册
	{
    
    {
    
    id}} //使用
	props:true //router对应关系中一定要开启

4 インデックスの

IndexOf はナビゲーション ガードで使用されます

4.1 配列呼び出し

条件が満たされない場合は、-1 が返されます。

	let food= ["1", "2", "3", "4"];
	let a = food.indexOf("4");
	console.log(a) // 3
	let b= food.indexOf("5");
	console.log(b) // -1

4.2 文字列呼び出し

大文字と小文字を区別して、文字列内で最初に出現した指定された文字列値を返します。

	let str="Hello world!";
	console.log(str.indexOf("Hello"));//0
	console.log(str.indexOf("world"));//6
	console.log(str.indexOf("World") );//-1

5 つのレンダリング

ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_62496369/article/details/127498147