vue项目如何去掉URL中#符号的方法

Vue.js是一个采用渐进式开发的JavaScript框架,路由系统使用的是Vue Router,该路由系统默认使用URL中的 "#"(hash) 字符来控制页面的跳转。但是,在某些场景下,我们想要去掉URL中的 # 符号。这里提供两种去掉 URL 中 # 符号的方法。

方法一:使用HTML5 History模式

HTML5 History模式会使用HTML5 History API来操作路由,它通过修改URL中的路径来实现路由的切换,同时为了保证用户体验,在浏览器不支持HTML5 History API的情况下,自动降级为使用hash模式。在Vue.js中,我们可以通过配置Vue Router来开启HTML5 History模式。具体步骤如下:

1. 在router.js中配置mode为history模式

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'

Vue.use(Router)

export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    }
  ]
})

2. 为应用程序配置404页面

当进行页面跳转时,如果找不到对应的路由,则会进入到404页面。对于使用HTML5 History模式的Vue应用程序,需要配置404页面,否则直接通过URL访问路由时可能会直接返回404错误。可以在router.js文件中添加如下代码:

export default new Router({
  mode: 'history',
  routes: [
    // 添加404页面路由
    {
      path: '*',
      name: '404',
      component: () => import('@/views/404.vue')
    },
    ...
  ]
})

3. 配置服务器

需要确保在服务器上,无论用户访问的是哪个路由,在返回HTML文件时都要返回同一个文件,这就需要对服务器进行一下配置。

  • 对于Apache服务器,需要开启mod_rewrite扩展模块,并在.htaccess文件中添加如下规则:
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>
  • 对于Nginx服务器,需要在服务器配置文件中添加如下代码:
server {
  ...
  location / {
    try_files $uri $uri/ /index.html;
  }
  ...
}

方法二:修改默认Vue配置

我们还可以通过修改默认Vue配置来实现去掉URL中 # 符号的效果。

1. 在main.js中配置路由的默认后缀为html

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

// 配置路由的默认后缀为html
Vue.prototype.$routerReplace = function(to) {
  const found = String(router.history.basePath + to)
  window.location.replace(found.endsWith('.html') ? found : found + '.html')
}

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

2. 修改router.js中Router原型对象下的replace方法,调用Vue.prototype.$routerReplace来跳转路由

Vue.use(Router)

// 修改replace方法
Router.prototype.replace = function replace(location, onComplete, onAbort) {
  const lastRoute = this.currentRoute
  this.history.replace(location, onComplete, function onReady() {
    const route = this.currentRoute
    if (route.matched.length === 0) {
      // not_found页面,防止进入死循环
      this.replace(lastRoute.fullPath || '/')
    }
    // 调用Vue.prototype.$routerReplace来跳转路由
    Vue.prototype.$routerReplace(route.fullPath)
    onComplete && onComplete(route)
  }, onAbort)
}

3. 修改router.js中Router原型对象下的push方法,调用Vue.prototype.$routerReplace来跳转路由

Vue.use(Router)

// 修改push方法
Router.prototype.push = function push(location, onComplete, onAbort) {
  const lastRoute = this.currentRoute
  this.history.push(location, onComplete, function onReady() {
    const route = this.currentRoute
    if (route.matched.length === 0) {
      // not_found页面,防止进入死循环
      this.replace(lastRoute.fullPath || '/')
    }
    // 调用Vue.prototype.$routerReplace来跳转路由
    Vue.prototype.$routerReplace(route.fullPath)
    onComplete && onComplete(route)
  }, onAbort)
}

这样配置之后,就可以实现不需要 # 符号的URL路由效果。

示例

此处提供两个示例,一个采用HTML5 History模式,另一个是通过修改默认Vue配置来实现的。

采用HTML5 History模式

可以参考官方文档进行配置,具体步骤如下:

  1. 在router.js中配置mode为history模式
  2. 为应用程序配置404页面
  3. 配置服务器

修改默认Vue配置

可以在main.js和router.js中进行配置,具体步骤如下:

  1. 在main.js中配置路由的默认后缀为html
  2. 修改router.js中Router原型对象下的replace方法,调用Vue.prototype.$routerReplace来跳转路由
  3. 修改router.js中Router原型对象下的push方法,调用Vue.prototype.$routerReplace来跳转路由

这两种方法都可以实现去掉URL中 # 符号的效果,具体选择哪种方法要根据实际情况来决定。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue项目如何去掉URL中#符号的方法 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 如何在 Vue 中使用 Axios 异步请求API

    下面我来详细讲解一下如何在 Vue 中使用 Axios 异步请求 API 的完整攻略。 1. 安装 Axios 在使用 Axios 之前,我们需要先安装它。可以通过 npm 安装: npm install axios –save 或者通过 yarn 安装: yarn add axios 2. 在 Vue 中使用 Axios 在 Vue 中使用 Axios …

    Vue 2023年5月28日
    00
  • 详解Vue的sync修饰符

    Vue的sync修饰符是一个用于实现双向绑定的语法糖,它能够将一个组件的数据状态同步到父组件中,并且在修改子组件数据时,自动更新父组件的状态。 什么是Vue的sync修饰符 sync修饰符是一个特殊的写法,它可以简化我们在组件通信过程中使用v-on和v-bind的写法。 我们都知道,在Vue中,子组件不能直接修改父组件的状态,这是为了保证整个应用程序的稳定性…

    Vue 2023年5月28日
    00
  • vue中如何将日期转换为指定的格式

    当我们在使用 Vue 开发应用时,有时需要将日期格式化成特定的格式,例如“YYYY-MM-DD hh:mm:ss”等等。Vue 在这方面提供了非常方便的功能,并且在格式化日期时使用的是第三方库 moment.js。下面是具体操作: 步骤一:安装 moment.js 库 要使用 moment.js 库,需要将其安装到项目中,可以使用 npm 或 yarn: n…

    Vue 2023年5月27日
    00
  • vue3+ts使用APlayer的示例代码

    下面是详细的“vue3+ts使用APlayer的示例代码”的攻略: 准备工作 安装vue-cli:打开终端,执行命令 npm install -g @vue/cli 创建vue项目:执行命令 vue create vue-aplayer-demo 安装APlayer插件:执行命令 npm install aplayer –save 安装TypeScript…

    Vue 2023年5月27日
    00
  • 精读《Vue3.0 Function API》

    精读《Vue3.0 Function API》攻略 什么是Vue3.0 Function API Vue3.0 Function API 是 Vue3.0 中新添加的一种 API 范式,它是建立在组合式 API 之上的,旨在提高我们在编写 Vue 应用时的代码 风格及组件复用率等方面的优化。 如何使用Vue3.0 Function API 安装 Vue3.0…

    Vue 2023年5月27日
    00
  • TDesign在vitest的实践示例详解

    TDesign在vitest的实践示例详解 简介 TDesign是一种基于消息传递的测试方法,能够快速而准确地发现系统中的错误和缺陷。本文将结合vitest实践,详细讲解如何使用TDesign进行测试,包括两条实例说明。 TDesign测试过程 步骤1:分析系统 在进行TDesign测试之前,需要对系统进行分析,了解其功能模块、交互方式和可能存在的问题。针对…

    Vue 2023年5月28日
    00
  • Vue学习之常用指令实例详解

    Vue学习之常用指令实例详解 一、指令的概念 Vue中的指令是Vue提供的一种特殊的属性,用于指定DOM节点的行为。指令以 v- 开头,后面跟着指令的名称,如 v-if、v-for、v-bind 等。通过指令,我们可以将Vue实例中的数据绑定到DOM元素上,实现数据的动态显示和交互效果。 二、常用指令实例详解 1. v-text v-text指令用于在DOM…

    Vue 2023年5月27日
    00
  • 解决vue数组中对象属性变化页面不渲染问题

    下面是针对“解决vue数组中对象属性变化页面不渲染问题”的完整攻略: 问题背景 使用Vue的开发者肯定知道,当我们在vue组件中有一个数组,其中包含多个对象,而对象的属性发生变化时,页面并不会自动渲染。这是因为Vue根据需求,只会追踪到绑定的属性,而不会追踪到对象本身。 比如我们有如下示例代码: <template> <div> &l…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部