From 87da9b881c1b3ca4cf4b3cba321049ba195fe1b5 Mon Sep 17 00:00:00 2001 From: xiaoxian521 <1923740402@qq.com> Date: Mon, 29 May 2023 11:30:53 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E9=A1=B5=E6=93=8D=E4=BD=9C-=E8=B7=AF=E7=94=B1=E4=BC=A0?= =?UTF-8?q?=E5=8F=82=E6=A8=A1=E5=BC=8F=E7=94=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/tabs/hooks.ts | 55 ++++++++++++++++++++------------ src/views/tabs/index.vue | 11 +++++-- src/views/tabs/params-detail.vue | 7 ++-- src/views/tabs/query-detail.vue | 7 ++-- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/views/tabs/hooks.ts b/src/views/tabs/hooks.ts index e4c6f1f27..08f26c362 100644 --- a/src/views/tabs/hooks.ts +++ b/src/views/tabs/hooks.ts @@ -1,54 +1,69 @@ +import { isString, isEmpty } from "@pureadmin/utils"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; -import { useRouter, useRoute } from "vue-router"; -import { onBeforeMount } from "vue"; +import { + useRouter, + useRoute, + type LocationQueryRaw, + type RouteParamsRaw +} from "vue-router"; export function useDetail() { const route = useRoute(); const router = useRouter(); - const id = route.query?.id ? route.query?.id : route.params?.id; + const getParameter = isEmpty(route.params) ? route.query : route.params; function toDetail( - index: number | string | string[] | number[], - model: string + parameter: LocationQueryRaw | RouteParamsRaw, + model: "query" | "params" ) { + // ⚠️ 这里要特别注意下,因为vue-router在解析路由参数的时候会自动转化成字符串类型,比如在使用useRoute().route.query或useRoute().route.params时,得到的参数都是字符串类型 + // 所以在传参的时候,如果参数是数字类型,就需要在此处 toString() 一下,保证传参跟路由参数类型一致都是字符串,这是必不可少的环节!!! + Object.keys(parameter).forEach(param => { + if (!isString(parameter[param])) { + parameter[param] = parameter[param].toString(); + } + }); if (model === "query") { // 保存信息到标签页 useMultiTagsStoreHook().handleTags("push", { path: `/tabs/query-detail`, name: "TabQueryDetail", - query: { id: String(index) }, + query: parameter, meta: { title: { - zh: `No.${index} - 详情信息`, - en: `No.${index} - DetailInfo` + zh: `No.${parameter.id} - 详情信息`, + en: `No.${parameter.id} - DetailInfo` }, + // 如果使用的是非国际化精简版title可以像下面这么写 + // title: `No.${index} - 详情信息`, // 最大打开标签数 dynamicLevel: 3 } }); // 路由跳转 - router.push({ name: "TabQueryDetail", query: { id: String(index) } }); - } else { + router.push({ name: "TabQueryDetail", query: parameter }); + } else if (model === "params") { useMultiTagsStoreHook().handleTags("push", { path: `/tabs/params-detail/:id`, name: "TabParamsDetail", - params: { id: String(index) }, + params: parameter, meta: { title: { - zh: `No.${index} - 详情信息`, - en: `No.${index} - DetailInfo` + zh: `No.${parameter.id} - 详情信息`, + en: `No.${parameter.id} - DetailInfo` } + // 如果使用的是非国际化精简版title可以像下面这么写 + // title: `No.${index} - 详情信息`, } }); - router.push({ name: "TabParamsDetail", params: { id: String(index) } }); + router.push({ name: "TabParamsDetail", params: parameter }); } } - function initToDetail(model) { - onBeforeMount(() => { - if (id) toDetail(id, model); - }); - } + // 用于页面刷新,重新获取浏览器地址栏参数并保存到标签页 + const initToDetail = (model: "query" | "params") => { + if (getParameter) toDetail(getParameter, model); + }; - return { toDetail, initToDetail, id, router }; + return { toDetail, initToDetail, getParameter, router }; } diff --git a/src/views/tabs/index.vue b/src/views/tabs/index.vue index d949b73df..4f488cb44 100644 --- a/src/views/tabs/index.vue +++ b/src/views/tabs/index.vue @@ -56,10 +56,17 @@ function onCloseTags() { class="m-2" v-for="index in 6" :key="index" - @click="toDetail(index, 'query')" + @click="toDetail({ id: index }, 'query')" > 打开{{ index }}详情页 + + 多个参数 + @@ -70,7 +77,7 @@ function onCloseTags() { class="m-2" v-for="index in 6" :key="index" - @click="toDetail(index, 'params')" + @click="toDetail({ id: index }, 'params')" > 打开{{ index }}详情页 diff --git a/src/views/tabs/params-detail.vue b/src/views/tabs/params-detail.vue index 2b9ad4a81..63d65a5fe 100644 --- a/src/views/tabs/params-detail.vue +++ b/src/views/tabs/params-detail.vue @@ -5,10 +5,13 @@ defineOptions({ name: "TabParamsDetail" }); -const { initToDetail, id } = useDetail(); +const { initToDetail, getParameter } = useDetail(); initToDetail("params"); - {{ id }} - 详情页内容在此(params传参) + + {{ getParameter.id }} - 详情页内容在此(params传参) + 当前页面参数为:{{ getParameter }} + diff --git a/src/views/tabs/query-detail.vue b/src/views/tabs/query-detail.vue index 5d817b1a8..0e965b7bb 100644 --- a/src/views/tabs/query-detail.vue +++ b/src/views/tabs/query-detail.vue @@ -5,10 +5,13 @@ defineOptions({ name: "TabQueryDetail" }); -const { initToDetail, id } = useDetail(); +const { initToDetail, getParameter } = useDetail(); initToDetail("query"); - {{ id }} - 详情页内容在此(query传参) + + {{ getParameter.id }} - 详情页内容在此(query传参) + 当前页面参数为:{{ getParameter }} +
当前页面参数为:{{ getParameter }}