关于前端:Day3-前端路由基础篇

3次阅读

共计 4353 个字符,预计需要花费 11 分钟才能阅读完成。

指标: 继续输入!每日分享对于 web 前端常见常识、面试题、性能优化、新技术等方面的内容。

次要面向群体:前端开发工程师(初、中、高级)、应届、转行、培训等同学

Day3- 今日话题

想必大家常常会在面试中或者工作生存中听到 前端路由 相干的问题或者话题,那么明天我将从以下几个方面聊聊前端路由:

1. 前端路由是什么?

前端路由是指在单页利用(SPA)中,通过在前端治理和管制页面之间的切换和导航的机制。它容许用户在不来到以后页面的状况下浏览不同的内容,提供了更晦涩、响应更快的用户体验。前端路由通过监听 URL 的变动,依据不同的门路渲染不同的视图组件,实现页面的无刷新切换。

2. 前端路由模式有哪些?

Hash 模式:在 URL 中应用 # 前面的哈希局部来示意页面门路,例如

http://example.com/#/home

哈希局部的变动不会导致浏览器向服务器发送申请,实用于没有服务器反对的场景。

History 模式:应用浏览器的 History API 来扭转 URL 门路,不再须要应用 #,例如

http://example.com/home

这种模式须要服务器反对,但相较于 Hash 模式,URL 更敌对

3. 路由守卫是什么?

路由守卫是一些钩子函数,用于在页面导航产生时执行特定的操作,例如验证用户权限、重定向、勾销导航等。它们确保用户在拜访页面时具备正确的权限和行为。

在 React 中,你能够应用 React-Router 提供的 Route 组件的 rendercomponentchildren 属性来实现路由守卫。通过在这些属性中编写逻辑,能够在渲染前进行验证或重定向操作。

<Route path="/profile" render={() => {if (userIsAuthenticated) {return <Profile />;} else {return <Redirect to="/login" />;}
}} />

<Route path="/dashboard" children={({match}) => {return match ? <Dashboard /> : <Redirect to="/login" />;}} />

在 Vue 中,你能够应用 Vue Router 提供的全局导航守卫和路由独享守卫来实现路由守卫。

vue 全局导航守卫:

  1. beforeEach: 在每次导航产生之前调用。这个守卫能够用来执行一些全局的权限验证、重定向或其余预处理操作。
  2. beforeResolve: 在每次导航确认之前调用。和 beforeEach 相似,但在 beforeEach 之前调用。在所有异步路由组件被解析之后触发。
  3. afterEach: 在每次导航实现之后调用。能够用来执行一些清理操作、发送统计信息等。没有 next() 办法,不会影响导航自身
  4. onError:
    在导航过程中呈现谬误时调用。能够用来解决导航谬误。
router.beforeEach((to, from, next) => {
  // 在每次导航之前执行
  console.log('Before each navigation');
  next();});

router.beforeResolve((to, from, next) => {
  // 在每次导航确认之前执行,和 beforeEach 相似
  console.log('Before resolve navigation');
  next();});

router.afterEach((to, from) => {
  // 在每次导航实现之后执行
  console.log('After each navigation');
});

router.onError((err) => {
  // 导航谬误时执行
  console.error('Navigation error:', err);
});

vue 路由独享守卫:

  1. beforeEnter
    在路由进入前调用,只会对以后路由起作用。能够在此进行验证、重定向等操作。
  2. beforeRouteUpdate
    在以后路由复用时(例如,同一个组件在不同路由间切换)调用,例如在参数变动时。此时,组件实例会被复用,因而你能够通过拜访 this 来获取组件实例。
  3. beforeRouteLeave
    在路由来到前调用,只会对以后路由起作用。用于确认是否容许来到以后路由,例如执行确认提醒操作。
  4. beforeRouteEnter
    在路由进入前调用,只会对以后路由起作用。但与其余守卫不同,这个守卫不会领有组件的实例,所以不能通过 this 拜访组件。能够通过回调函数 next(vm => {}) 获取组件实例。
const routes = [
{
    path: '/home',
    component: Home,
    beforeEnter: (to, from, next) =>   {if (isUserAuthenticated()) {next(); // 容许导航
      } else {next('/login'); // 重定向到登录页面
       }
    }
},
{
    path: '/user/:id',
    component: UserProfile,
    beforeRouteUpdate: (to, from, next) => {
      // 在用户切换不同用户时,依据新的参数更新数据
      if (to.params.id !== from.params.id) {this.fetchUserData(to.params.id);
      }
      next();}
 },
    {
    path: '/edit/:id',
    component: EditPost,
    beforeRouteLeave: (to, from, next) => {if (this.isDirty) {if (confirm('You have unsaved changes. Do you really want to leave?')) {next();
        } else {next(false); // 勾销导航
        }
      } else {next();
      }
    }
  },
];
{
    path: '/profile/:id',
    component: UserProfile,
    beforeRouteEnter: (to, from, next) => {// 获取组件实例,并在数据筹备好后调用 next()
      fetchData(to.params.id, user => {
        next(vm => {vm.user = user;});
      });
    }
  },
4. 路由表是什么?

路由表由一个个路由配置对象组成,在一个简单的利用中,路由表能够更加具体,包含嵌套路由、动静路由参数、路由重定向等。例如:


const routes = [{ path: '/', component: Home},
  {
    path: '/products',
    component: Products,
    children: [{ path: 'shoes', component: Shoes},
      {path: 'clothes', component: Clothes}
    ]
  },
  {path: '/product/:id', component: ProductDetail},
  {path: '/contact', component: Contact},
  {path: '/404', component: NotFound},
  {path: '/:catchAll(.*)', redirect: '/404' }
];
5. 路由参数和查问参数

当构建前端单页利用时,路由参数和查问参数是两种常见的传递数据的机制。它们容许你在不同页面之间传递信息,但在传递形式、用处和实现上有一些区别。

路由参数:

  • 定义形式: 路由参数是间接嵌入在 URL 门路中,通常应用动静的门路片段进行定义。在门路中应用冒号 : 来批示一个参数。例如:/user/:id
  • 用处: 路由参数实用于标识性的信息,如用户 ID、商品 ID 等。在不同门路下,参数值会不同,但门路构造保持一致。
  • 在 Vue 我的项目中应用: 在 Vue 我的项目中,你能够通过 this.$route.params 来拜访路由参数的值。
  • 在 React 我的项目中应用: 在 React 我的项目中,你能够应用 useParams() 钩子来获取路由参数的值。

在 Vue 中的路由参数应用:

<template>
  <div>
    <router-link :to="'/user/' + userId">User Profile</router-link>
    <router-view></router-view>
  </div>
</template>

<script>
export default {data() {
    return {userId: 123};
  }
};
</script>

在 React 中的路由参数应用:

import {useParams} from 'react-router-dom';

function UserProfile() {const { id} = useParams();
  return <div>User Profile: {id}</div>;
}

查问参数:

  • 定义形式: 查问参数是通过 URL 的查问字符串传递的,以 ? 结尾,多个参数应用 & 分隔。例如:/search?q=keyword&page=1
  • 用处: 查问参数实用于传递附加信息,如搜寻关键字、分页页码等。不同页面间能够应用雷同的门路,通过不同的查问参数来实现不同的性能。
  • 在 Vue 我的项目中应用: 在 Vue 我的项目中,你能够通过 this.$route.query 来拜访查问参数的值。
  • 在 React 我的项目中应用: 在 React 我的项目中,你能够应用 useLocation() 钩子和 query-string 库来获取和解析查问参数的值。

在 Vue 中的查问参数应用:

<template>
  <div>
    <router-link :to="{path:'/search', query: { q:'keyword'}}">Search</router-link>
    <router-view></router-view>
  </div>
</template>

<script>
export default {// ...};
</script>

在 React 中的查问参数应用:

import {useLocation} from 'react-router-dom';
import queryString from 'query-string';

function SearchResults() {const location = useLocation();
  const queryParams = queryString.parse(location.search);
  const keyword = queryParams.q;
  
  return <div>Search Results for: {keyword}</div>;
}

总之,路由参数和查问参数都是用于在不同页面之间传递数据的形式。路由参数更实用于标识惟一资源,查问参数则实用于传递附加信息或选项。

下一篇文章将分享 路由预加载、懒加载,欢送点赞、关注、转发~

本文由 mdnice 多平台公布

正文完
 0