vue3.0+ts+element-plus多页签应用模板:vue-router与vuex

系列文章

一、安装vue-router

因为我们是给vue3安装vue-router,所以需要指定4以上的版本号:

npm i vue-router@4 --save

安装成功后,在src目录下新建文件夹router,并创建route.ts

import { RouteRecordRaw } from 'vue-router'

// 使用require.context()自动获取模块
const modules: RouteRecordRaw[] = []
const moduleFiles = require.context('./modules', false, /\.ts$/)
moduleFiles.keys().forEach((key) => modules.push(moduleFiles(key).default))
modules.sort((moduleA, moduleB) => {
  const orderA = moduleA.meta!.order as number
  const orderB = moduleB.meta!.order as number
  return orderA - orderB
})

const routes: RouteRecordRaw[] = [...modules]

export default routes

然后在router目录下新建modules目录,用来存放路由模块。为什么这里要使用模块化的路由呢?主要有两个原因:首先第一个是因为,当项目越来越大的时候,随之而来的是越来越多的路由,如果将这么多路由全都一股脑的写在一个文件里的话,后期维护会十分困难。另外一个,是因为我们要将路由与侧边菜单关联起来,做到增添路由时,侧边菜单也同步渲染。

然后我们在router目录下创建入口文件index.ts,输入以下代码:

import { createRouter, /*createWebHistory*/, createWebHashHistory } from 'vue-router'
import routes from './routes'

const router = createRouter({
  // history: createWebHistory(),   // history模式
  history: createWebHashHistory(),  // hash模式
  routes
})

export default router

这里我使用的是hash路由模式,也就是在URL中使用#哈希值来切换路由的方式。但是这种方式的URL很丑陋。所以我们也可以选择history模式。在history模式下。URL中的#会被消除,只有干干净净的路径。但是,history由于没有了哈希值,每次跳转路由都会请求完整的URL地址,这就需要在服务器端配置一下,否则当你刷新页面,或者直接访问某个非主页路由的时候,会出现404。这里使用nginx举个例子:

location / {
  root       /usr/local/html/multi-tabs;
  index      index.html;
  try_files  $uri $uri/ /index.html;
}

这样配置之后,服务器会按照try_files后面的参数依次去匹配root中对应的文件或文件夹。如果匹配到的是一个文件,那么将返回这个文件;如果匹配到的是一个文件夹,那么将返回这个文件夹中index指令指定的文件。而$uri参数将作为前面没有匹配到的fallback。$uri是nginx中的变量,比如我访问的网址是http://localhost:8080/home那么它代表的就是/home

此外,我们还需要在vue.config.js中配置一下publicPath属性:

const options = { publicPath: '/' }

详细了解可以去这篇文章看看Vue Router history模式的配置方法及其原理

到这里,vue-router的引入就完成了。关于路由模块的写法,到后面侧边栏章节的时候再详述。

二、安装vuex

因为我们是给vue3安装vuex,所以需要指定4以上的版本号:

npm i vuex@4 --save

安装成功后,在src目录下新建文件夹store,并创建文件index.ts,然后输入以下代码:

import { createStore, useStore as rawUseStore } from 'vuex'

// 使用require.context()自动获取模块
const moduleFiles = require.context('./modules', false, /\.ts$/)
const modules = moduleFiles.keys().reduce((modules: ModuleTree<RootStateProps>, modulePath) => {
  const moduleName = Utils.getFileName(modulePath, 'Module')
  const value = moduleFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})

const store = createStore({ modules })

// 创建vuex-key,用于获取类型提示
export const key: InjectionKey<Store<RootStateProps>> = Symbol('vue-store')
// 导出可自动导入key的useStore方法
export const useStore = () => rawUseStore(key)
export default store

之后,同目录下创建modules文件夹,用于存放各个模块的全局状态。

三、改写main.ts

安装并配置好vue-router和vuex后,我们需要在main.ts中引入:

import router from './router'
import store, { key } from './store'
app.use(router)
app.use(store, key)

至此,vue-router和vuex就正式引入到项目中了

下一篇预告:vue3.0+ts+element-plus多页签应用模板:element-plus

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W先生-SirW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值