首页 > 其他分享 >如何在本地给 vue-router4 扩展功能?

如何在本地给 vue-router4 扩展功能?

时间:2023-08-14 16:33:33浏览次数:34  
标签:vue const router4 callback 本地 router useRouter 页面

背景

前段时间给基于 vue3 的 H5 项目做一些优化,该项目经常会有一些页面间的通信,譬如选择地址、乘机人等信息后回填到上一个页面。对于这种简单、频繁的通信,实在不想搞成重火力(eg:pinia)。最好让使用者用完即走,不用操心除业务逻辑之外的任何事情。

路由控制页面通信

既然是页面间的通信,那么使用路由来控制是非常自然的,具体使用方式如下:

// A 页面跳转 B 页面时,传递 callback 回调函数
import { useRouter } from 'vue-router'
const router = useRouter()
router.push({
  path: '/some/page/b',
  callback: dataFromB => {
    handleData(dataFromB)
  }
})

// B 页面,在某个时机(提交时)调用 callback,再返回 A 页面
import { useRoute, useRouter } from 'vue-router'
const router = useRouter()
const route = useRoute()
const address = {}
const tapSubmit = () => {
  if (route.callback) route.callback(address)
  router.back()
}

可以看到,我们通过熟悉的回调函数方式实现了页面间的数据通信。对使用者来说,几乎没有增加心智负担。

唯一的限制是:A 页面必须被keepAlive显然这是合理的,难道阁下希望回到 A 页面时,数据全部重新渲染一次?

处理 vue-router 类型限制

vue-router 4版本通过typescript严格限制了其参数类型,callback可不在其参数类型声明里面。直接使用上述方案,只会得到红线警告以及编译错误

所以,我们要在【本地】扩展vue-router的接口。

首先增加 callback 参数类型

新建vue-router.d.ts类型声明文件,为接口RouteLocationNormalizedLoaded增加callback字段。

import 'vue-router'

declare module 'vue-router' {
  interface RouteLocationNormalizedLoaded {
    callback?: anyFn
  }
}

其次重写 vue-router

通过重写useRouteuseRouter,处理生产和消费callback的逻辑:

// src/lib/vue-router/index.ts
import { anyFn } from '@/@types'
import {
  useRouter as rawUseRouter,
  useRoute as rawUseRoute,
  useLink,
  RouteLocationRaw,
  createRouter,
  createWebHistory,
  onBeforeRouteLeave,
  onBeforeRouteUpdate,
  isNavigationFailure,
} from '../../../node_modules/vue-router'

export {
  useRouter,
  useRoute,
  useLink,
  createRouter,
  createWebHistory,
  onBeforeRouteLeave,
  onBeforeRouteUpdate,
  isNavigationFailure,
}

const map: Record<string, anyFn | undefined> = {}

function useRoute() {
  const route = rawUseRoute()

  route.callback = map[route.path]

  return route
}

function useRouter() {
  const router = rawUseRouter()
  const newRouter = {
    ...router,
    push(to: RouteLocationRaw) {
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
      const opts = to as any

      if (map[opts.path]) map[opts.path] = void 0
      if (typeof opts === 'object' && opts.callback) {
        map[opts.path] = opts.callback
      }

      return router.push(opts)
    },
  }

  return newRouter
}

最后更改项目解析vue-router的地址

一般情况下,我们在项目中这样导入:import {} from vue-router。当 vite 构建项目时,会将其引用地址解析到node_modules中。所以,我们还需要更改这个地址解析流程,使其能够解析到我们自建的src/lib/vue-router/index.ts文件中。

好在 vite 已经提供了这个能力:

// vite.config.ts

{
  resolve: {
    alias: [
      //... 其他配置
      {
        find: /^vue-router$/,
        replacement: pathResolve('src/lib/vue-router/index.ts'),
      },
    ]
  }
}

完。

标签:vue,const,router4,callback,本地,router,useRouter,页面
From: https://www.cnblogs.com/fayin/p/17629063.html

相关文章

  • [完结8章]程序员的 AI 启蒙课,ChatGPT 辅助开发 Vue3 项目
    点击下载:程序员的AI启蒙课:ChatGPT让你1人顶3人提取码:8zwd Vue是一款用于构建用户界面的JavaScript框,它基于标准的HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,用以帮助开发者高效地开发用户界面。目前,Vue3.0正式版也发布了两年的时间,越......
  • vue3+typescript中的props
     以上是子组件 以上是父组件<scriptsetuplangs="ts">letprops=defineProps(['info','money'])//父子组件的通信需要用到defineProps方法去接受父组件想要传递的数据console.info(props)</script>需要注意的就是:props可以实现父子组件的通信,但是props的......
  • Dify 基于 ChatGPT 构建本地知识库问答应用
    来源:https://blog.csdn.net/qq_43692950/article/details/131345124 一、Dify自从ChatGPT横空出世之后,其极高的语言理解和交互能力不仅让人惊呼,ChatGPT不仅能够处理事实性问题,还能理解和生成情感色彩更浓厚的对话内容,能够识别用户的情感倾向,并据此作出相应的回应。这么好的......
  • vue2和vue3中插槽写法区别
    一、slot是什么在HTML中slot元素,作为WebComponents技术套件的一部分,是Web组件内的一个占位符。该占位符可以在后期使用自己的标记语言填充。(我们可以理解为solt在组件模板中占好了位置,当使用该组件标签时候,组件标签里面的内容就会自动填坑(替换组件模板中slot位置),作为承......
  • 本地企业的SEO战略:从地方市场走向全球舞台
    导言:随着互联网的不断发展,本地企业在寻求更广阔市场时,搜索引擎优化(SEO)成为了不可或缺的一环。本文将深入探讨本地企业如何通过精细的SEO战略,从本地市场走向全球舞台,实现业务的扩展和品牌的提升。一、深入了解目标受众本地市场:首先要了解本地市场的需求、偏好和行为,确定本地关......
  • import.meta.globEager('./src/components/**/*.vue'); 遍历文件
    main.jsconstimportAll=(modules)=>{Object.keys(modules).forEach((key)=>{constcomponent=key.replace('/src/','@/').replace('.vue','');constcomponentName=key.split('/').slice......
  • Spring Boot + Vue3前后端分离实战wiki知识库系统<十二>--用户管理&单点登录开发一
    目标:在上一次https://www.cnblogs.com/webor2006/p/17533745.html我们已经完成了文档管理的功能模块开发,接下来则开启新模块的学习---用户登录,这块还是有不少知识点值得学习的,先来看一下整体的效果,关于效果官网有一个体验地址:wiki.courseimooc.com,如下:其效果也是人人熟知的,下面......
  • 问题排查Hive本地计算模式失败
    问题排查Hive本地计算模式失败查看hive.log后发现是javaspaceheap,也就是java内存溢出。解决方案:配置yarn集群的资源分配。由于是本地计算,因此container一定是申请在本地的,限制AM申请container容器资源的大小很重要。机器节点的资源可用通过配置NodeManager,所以第一步是......
  • 问题排查Hive本地计算模式失败
    问题排查Hive本地计算模式失败查看hive.log后发现是javaspaceheap,也就是java内存溢出。解决方案:配置yarn集群的资源分配。由于是本地计算,因此container一定是申请在本地的,限制AM申请container容器资源的大小很重要。机器节点的资源可用通过配置NodeManager,所以第一步是......
  • Auto-registering all your components in Vue 3 with Vite
    Auto-registeringallyourcomponentsinVue3withVite#vue#vitejs#componentsWhyauto-registercomponents?I'mactuallyabigfanofmanuallyimportingcomponentsinVueapplications.Itmakesitveryclearwhereeverycomponentcomesfrom,does......