Home >Web Front-end >Vue.js >How to use navigation guards in Vue3

How to use navigation guards in Vue3

PHPz
PHPzforward
2023-05-16 18:58:282244browse

    1. What is a navigation guard?

    As its name suggests, the navigation guard provided by vue-router is mainly used to guard navigation by jumping or canceling. There are many ways to build route navigation into it: globally, exclusive to a single route, or at the component level.

    Check the following situation:

    By default, clicking the homepage link can directly enter the specified interface, but this interface requires the user to log in before accessing, which is a problem

    How to use navigation guards in Vue3

    Navigation guards can be set up to detect whether the user is logged in. If he is logged in, he will enter the background page. If he is not logged in, he will force himself to enter the login page, as shown in the figure

    How to use navigation guards in Vue3

    2. What types of navigation guards are there?

    1. Global guards (3)

    Global front guard

    Every time a routing navigation jump occurs, the global front guard will be triggered. Therefore, in the global front guard, programmers can control the access rights of each route

    1. How to use

    You can router/index.js Use router.beforeEach((to, from, next) => {}) in the page to register a global front guard.

    2. Code:

    // router/index.js 页面
    
    router.beforeEach((to, from, next) => {
        console.log(to, from);
        next()
    });
    Global resolution guard
    1. Usage method
    You can use router.beforeResolve to register a global guard. This is similar to router.beforeEach in that it fires on every navigation, but ensures that the parsing guard is called correctly before the navigation is confirmed, and after all in-component guards and async route components are parsed.

    2. Code:

    // router/index.js 页面
    
    router.beforeResolve((to, from, next) => {
        console.log(to,from);
        next()
    })
    Global post-hook
    1. Usage
    You can also register a global post-hook, however Unlike guards, these hooks will not accept the next function nor change the navigation itself:

    2. Code:

    // router/index.js 页面
    
    router.afterEach((to, from) => {
        console.log(to,from);
    })

    They are useful for auxiliary functions such as analysis, changing page titles, and declaring pages. Useful for many other things.

    2. Route exclusive guard (1)

    1. Usage method

    You can define it directly in the routing configurationbeforeEnter Guard:

    2. Code:

    // router/index.js 页面(路由规则中)
    
    const routes = [
    	{
    	    path: '/home',
    	    name: 'Home',
    	    component: HomeView,
    	    beforeEnter: (to, from,next) => {
    	        console.log(to, from);
    	        next()
    	    },
    	}, 
    ]

    3. Guards within the component (3)

    Component There are three internal guards: beforeRouteEnter before the route enters, beforeRouteLeave when the route leaves, and beforeRouteUpdate when the page is updated

    beforeRouteEnter(to, from, next)

    1. How to use
    in the component Used in templates, written at the same level as methods: {}, component routing guards are routing guards written in each separate vue file

    2. Code:

    // vue 组件内使用
    
    onBeforeRouteUpdate((to, from) => {
      //当前组件路由改变后,进行触发
      console.log(to);
    });
    Note: in vue3 The beforeRouterEnter route guard cannot be used in the setup function.

    beforeRouteUpdate(to, from, next)

    1. Usage method
    Use in the component template, with methods: {} is written at the same level. The component route guard is the route guard written in each separate vue file

    2. Code:

    // vue 组件内使用
    
    onBeforeRouteUpdate((to, from) => {
      //当前组件路由改变后,进行触发
      console.log(to);
    });

    beforeRouteLeave(to, from, next)

    1. The usage method is used in the component template, which is written at the same level as methods: {}. The component routing guard is the routing guard written in each separate vue file

    2. Code:

    // vue 组件内使用
    
    onBeforeRouteLeave((to, from) => {
      //离开当前的组件,触发
      alert("我离开啦");
    });

    3. Three parameters of the navigation guard

    • to: The routing information object to be accessed

    • from: The one to be left Routing information object

    • next: Function

      Call next() to indicate release, allow this route navigation

      Call next(false) to indicate no release , this route navigation is not allowed

      Calling next({routerPath}) means navigating to this address. Generally, when the user is not logged in, he will navigate to the login interface

    Tip: This function can appear multiple times in the navigation guard, but can only be called once!!!

    How to use navigation guards in Vue3

    4. How to use beforeRouteEnter in vue3

    If you are using the combined API and setup functions to write components, you can add update and leave guards through onBeforeRouteUpdate and onBeforeRouteLeave respectively. Please refer to the Composition API section for more details.

    For details, please see the official documentation of vue-router
    Navigation Guard | Vue Router

    Method 1. We can use The beforeEnter method intercepts, that is, in router.js:

    {
    	path: '/',
    	name: 'home
    	component: () => import('@/xxx.vue'),
    	beforeEnter: (to, from) => {
    		// 可以在定义路由的时候监听from和to
    	}
    }

    Method 2. We can also use the vue2 writing method and use the optional api to use the beforeRouterEnter hook.

    <script>
    export default {
    	beforeRouteEnter(to, from) {
    		console.log(&#39;before router enter&#39;, to, from)
    	},
    	mounted() {
    		console.log(&#39;mounted&#39;)
    	},
    }

    Five. Simulated login registration case

    // 模拟是否登录(true为登录,false为未登录)
    let token = true
    router.beforeEach((to, from, next) => {
        // 判断有没有登录
        if (!token) {
        	// 如果没有登录,并且是跳转至登录页
            if (to.name == "Login") {
            	// 直接跳转
                next();
            } else {
            	// 否则直接强制跳转至登录页
                router.push(&#39;/login&#39;)
            }
        } else {
        	// 如果已经登录,并且不是跳转至登录页
            if (to.name !== "Login") {
            	// 直接跳转
                next();
            } else {
            	// 否则直接强制跳转至上一个页面
                router.push(from.path)
            }
        }
    });

    The above is the detailed content of How to use navigation guards in Vue3. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete