最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在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保存和恢復搜索條件的資料請關注腳本之家其它相關文章!

相關文章

  • vue第三方庫中存在擴展運算符報錯問題的解決方案

    vue第三方庫中存在擴展運算符報錯問題的解決方案

    這篇文章主要介紹了vue第三方庫中存在擴展運算符報錯問題,本文給大家分享解決方案,通過結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Vue build過程取消console debugger控制臺信息輸出方法詳解

    Vue build過程取消console debugger控制臺信息輸出方法詳解

    這篇文章主要為大家介紹了Vue build過程取消console debugger控制臺信息輸出方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 對 Vue-Router 進行單元測試的方法

    對 Vue-Router 進行單元測試的方法

    這篇文章主要介紹了對 Vue-Router 進行單元測試的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • vue中使用hover選擇器無效的問題

    vue中使用hover選擇器無效的問題

    這篇文章主要介紹了vue中使用hover選擇器無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue中如何獲取本地IP地址

    vue中如何獲取本地IP地址

    這篇文章主要介紹了vue中如何獲取本地IP地址,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • el-form組件清除校驗提示正確方法(前端技能提升)

    el-form組件清除校驗提示正確方法(前端技能提升)

    el-form組件提供了表單驗證的功能,可以通過在el-form上綁定rules屬性,并在el-form-item上設置prop屬性來進行校驗,這篇文章主要給大家介紹了關于el-form組件清除校驗提示正確方法(前端技能提升)的相關資料,需要的朋友可以參考下
    2023-12-12
  • 在vue-cli項目中如何使用swiper

    在vue-cli項目中如何使用swiper

    這篇文章主要介紹了在vue-cli項目中如何使用swiper問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vant-list上拉加載onload事件觸發(fā)多次問題及解決

    vant-list上拉加載onload事件觸發(fā)多次問題及解決

    這篇文章主要介紹了vant-list上拉加載onload事件觸發(fā)多次問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 淺談vant組件Picker 選擇器選單選問題

    淺談vant組件Picker 選擇器選單選問題

    這篇文章主要介紹了淺談vant組件Picker 選擇器選單選問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue簡易注冊頁面+發(fā)送驗證碼功能的實現(xiàn)示例

    Vue簡易注冊頁面+發(fā)送驗證碼功能的實現(xiàn)示例

    本文主要介紹了Vue簡易注冊頁面+發(fā)送驗證碼功能的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

五大连池市| 尼勒克县| 金阳县| 临潭县| 连云港市| 邹城市| 长顺县| 广安市| 罗定市| 文山县| 钟山县| 宜兴市| 迁安市| 永善县| 南安市| 科技| 女性| 宣汉县| 张家港市| 连江县| 巩留县| 商丘市| 呼伦贝尔市| 凤阳县| 贵德县| 杂多县| 金寨县| 丹寨县| 休宁县| 拉萨市| 河津市| 昭平县| 灵武市| 隆安县| 波密县| 嫩江县| 翁源县| 江达县| 泊头市| 钟山县| 元谋县|