欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Vue項目中使用URL Query保存和恢復搜索條件的操作指南

 更新時間:2025年09月18日 10:28:39   作者:EMT  
在實際的前端開發(fā)中,我們經(jīng)常會遇到這樣的需求:用戶在列表頁輸入了一些搜索條件,點擊某一條數(shù)據(jù)進入詳情頁;當他返回列表頁時,希望搜索條件能被 記住,而不是重新初始化,本文給大家介紹了Vue使用URL Query保存和恢復搜索條件的操作指南,需要的朋友可以參考下

引言

在實際的前端開發(fā)中,我們經(jīng)常會遇到這樣的需求:
用戶在列表頁輸入了一些搜索條件,點擊某一條數(shù)據(jù)進入詳情頁;當他返回列表頁時,希望搜索條件能被 記住,而不是重新初始化。

常見的解決方案有三種:

  1. 使用 全局狀態(tài)管理(Vuex/Pinia) 保存搜索條件。
  2. 使用 keep-alive 緩存頁面組件。
  3. 使用 URL Query 參數(shù) 把搜索條件保存在地址欄中。

本文介紹的是第三種方式,通過封裝一個 useQueryStorage Hook,把對象序列化到 URL 的 querystring 中,從而實現(xiàn)搜索條件的記憶。

核心代碼

import { isEqual } from "lodash-es";
import { useRouter, useRoute } from "vue-router";

export const useQueryStorage = <T>(key: string = "savedQuery") => {
  const router = useRouter();
  const route = useRoute();

  // 把對象以 JSON 的格式存入到 URL 的 querystring 中
  const saveObjectToQueryString = (obj: T) => {
    const query = parseSavedObjectFromQueryString();
    if (!isEqual(query, obj)) {
      router.replace({
        query: {
          ...route.query,
          [key]: encodeURIComponent(JSON.stringify(obj)),
        },
      });
    }
  };

  // 從 URL 的 querystring 中解析出對象
  const parseSavedObjectFromQueryString: () => T | null = () => {
    let query = route.query[key];
    if (query && typeof query === "string") {
      query = JSON.parse(decodeURIComponent(query));
      return query as T;
    }
    return null;
  };

  return {
    getQ: parseSavedObjectFromQueryString,
    setQ: saveObjectToQueryString,
  };
};

代碼解析

1. 存儲對象到 URL

const saveObjectToQueryString = (obj: T) => {
  const query = parseSavedObjectFromQueryString();
  if (!isEqual(query, obj)) {
    router.replace({
      query: {
        ...route.query,
        [key]: encodeURIComponent(JSON.stringify(obj)),
      },
    });
  }
};

這里使用了 JSON.stringify 把對象轉(zhuǎn)成字符串,再用 encodeURIComponent 確保字符串在 URL 中不會出錯。

為什么要用 lodash.isEqual?

因為 Vue Router 的 replace 會更新 URL,如果我們每次都寫入同樣的對象,就會產(chǎn)生冗余的路由更新。用 isEqual 做深度比較,可以避免不必要的刷新。

2. 從 URL 解析對象

const parseSavedObjectFromQueryString: () => T | null = () => {
  let query = route.query[key];
  if (query && typeof query === "string") {
    query = JSON.parse(decodeURIComponent(query));
    return query as T;
  }
  return null;
};

這一段邏輯就是把 querystring 里的值取出來,做 解碼 + JSON 反序列化,還原成原來的對象。

3. Hook 的返回值

return {
  getQ: parseSavedObjectFromQueryString,
  setQ: saveObjectToQueryString,
};

對外提供兩個方法:

  • getQ():獲取保存的搜索條件。
  • setQ(obj):設置搜索條件并保存到 URL。

這樣調(diào)用方的代碼就會非常簡潔。

使用示例

在列表頁中:

const { getQ, setQ } = useQueryStorage<{ keyword: string; page: number }>();

// 初始化時恢復
const saved = getQ();
if (saved) {
  searchForm.keyword = saved.keyword;
  searchForm.page = saved.page;
}

// 用戶點擊搜索時保存
function handleSearch() {
  setQ({ keyword: searchForm.keyword, page: searchForm.page });
}

當用戶進入詳情頁再返回時,URL 中依然保存了搜索條件,頁面加載時會自動恢復。

優(yōu)點總結(jié)

  1. 刷新不丟失
    因為狀態(tài)存放在 URL 里,刷新后依然可以恢復。
  2. 可分享鏈接
    用戶可以直接復制 URL,別人打開時能看到相同的搜索條件。
  3. 解耦全局狀態(tài)
    不依賴 Vuex/Pinia,邏輯簡單清晰。

缺點是:如果搜索條件非常復雜,URL 會變長,可能不太美觀。

總結(jié)

useQueryStorage 是一個非常實用的小 Hook,通過 encodeURIComponentJSON.stringify 將對象持久化到 URL 的 query 參數(shù)中,結(jié)合 lodash.isEqual 避免重復寫入,能很好地解決 列表頁返回時記住搜索條件 的問題。

以上就是在Vue項目中使用URL Query保存和恢復搜索條件的操作指南的詳細內(nèi)容,更多關于Vue URL Query保存和恢復搜索條件的資料請關注腳本之家其它相關文章!

相關文章

  • vue3+vite項目中顯示SVG圖片的實現(xiàn)

    vue3+vite項目中顯示SVG圖片的實現(xiàn)

    vite-plugin-svg-icons是一個Vite插件,其作用是將SVG圖標文件轉(zhuǎn)換為Vue組件,本文主要介紹了vue3+vite項目中顯示SVG圖片的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • el-table 動態(tài)給每行增加class屬性的示例代碼

    el-table 動態(tài)給每行增加class屬性的示例代碼

    這篇文章主要介紹了el-table 動態(tài)給每行增加class屬性的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-03-03
  • Vue-cli3.x + axios 跨域方案踩坑指北

    Vue-cli3.x + axios 跨域方案踩坑指北

    這篇文章主要介紹了Vue-cli3.x + axios 跨域方案踩坑指北,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • vue路由守衛(wèi)及路由守衛(wèi)無限循環(huán)問題詳析

    vue路由守衛(wèi)及路由守衛(wèi)無限循環(huán)問題詳析

    這篇文章主要給大家介紹了關于vue路由守衛(wèi)及路由守衛(wèi)無限循環(huán)問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • vue?el-date-picker?日期回顯后無法改變問題解決

    vue?el-date-picker?日期回顯后無法改變問題解決

    這篇文章主要介紹了vue?el-date-picker?日期回顯后無法改變問題解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Vue監(jiān)聽屬性和計算屬性

    Vue監(jiān)聽屬性和計算屬性

    這篇文章主要介紹了Vue監(jiān)聽屬性和計算屬性,基本用法添加watch屬性,值為一個對象。對象的屬性名就是要監(jiān)視的數(shù)據(jù),屬性值為回調(diào)函數(shù),每當這個屬性名對應的值發(fā)生變化,就會觸發(fā)該回調(diào)函數(shù)執(zhí)行,下面來看詳細內(nèi)容,需要的朋友也可以參考一下
    2021-12-12
  • Vue Router組件內(nèi)路由鉤子的使用

    Vue Router組件內(nèi)路由鉤子的使用

    本文主要介紹了Vue Router組件內(nèi)路由鉤子的使用,用于權限驗證、數(shù)據(jù)預加載、防止數(shù)據(jù)丟失等場景,具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • 關于vue自適應布局(各種瀏覽器,分辨率)的示例代碼

    關于vue自適應布局(各種瀏覽器,分辨率)的示例代碼

    這篇文章主要介紹了vue自適應布局(各種瀏覽器,分辨率),主要使用了flex布局的flex:1屬性和自適應的css+vh+百分比這種方式,開局設置overflow:hidden,主體main部分要設置:overflow:auto,需要的朋友可以參考下
    2022-09-09
  • vue2實現(xiàn)無感刷新token的方式詳解

    vue2實現(xiàn)無感刷新token的方式詳解

    在Web應用中,用戶需要通過認證和授權才能訪問受保護的資源,為了實現(xiàn)認證和授權功能,通常需要使用Token來標識用戶身份并驗證其權限,本文給大家介紹了vue2實現(xiàn)無感刷新token的方式,需要的朋友可以參考下
    2024-02-02
  • Vue.js 中的 $watch使用方法

    Vue.js 中的 $watch使用方法

    本篇文章中主要介紹了Vue.js 中的 $watch使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論