在setup中获取$route,$router的三种方式
摘抄自:
方法一:在当前.vue中引入vue-router的useRoute, useRouter
import { useRoute, useRouter } from 'vue-router'
setup() {
let $route=useRoute()
let $router = useRouter()
console.log($route.query, $router);
}
方法二:通过const { proxy } = getCurrentInstance()获取当前实例
特别注意:
1. 在ts下会报错报错:...类型“ComponentInternalInstance | null”,两种解决方法:
1.1. 在前面添加 // @ts-ignore 忽视
1.2. 报错原因是因为getCurrentInstance()可能是ComponentInternalInstance或者null类型,那么我们给它断言,说它就是ComponentInternalInstance。
let { proxy } = getCurrentInstance() as ComponentInternalInstance 或者通过 obj?.attr 的形式(如果没有该属性就算了)
let { proxy } = getCurrentInstance()
console.log(proxy?.$router)
2. const { ctx } = getCurrentInstance()是错误用法,这里ctx打包后在生产环境下是获取不到的
setup() {
// @ts-ignore
let { proxy } = getCurrentInstance()
console.log(proxy.$route.query);
}
方法三:考虑到在获取上下文和全局挂载实例的时候会用到这个getCurrentInstance,那我们来新建 hooks\useCurrentInstance.ts(在方法二上的拓展)
useCurrentInstance.ts
import { ComponentInternalInstance, getCurrentInstance } from 'vue'
export default function useCurrentInstance() {
const { appContext } = getCurrentInstance() as ComponentInternalInstance
const globalProperties = appContext.config.globalProperties //这是在访问全局变量,全局变量里包含路由$route, $router
return {
globalProperties
}
}
xxx.vue
// 先引入文件
import useCurrentInstance from "@/hooks/useCurrentInstance";
...
// 在setup 中使用处理
setup() {
const { globalProperties } = useCurrentInstance()
console.log(globalProperties.$route.query);
}