useQS

news/2024/7/15 5:51:02 标签: react.js, javascript, 前端
import qs, { IParseOptions, IStringifyOptions } from "qs";
import { useCallback, useMemo, useRef } from "react";
import { NavigateOptions, useLocation, useNavigate } from "react-router-dom";

/**
 * 使用 qs 库配合 react router 来处理 url 查询参数
 *
 * @param def 查询参数的默认值
 * @param options qs配置
 * @param options.parseOptions qs 解析配置
 * @param options.stringifyOptions qs 序列化配置
 */
export default function useQs<T extends qs.ParsedQs>(
  def?: T,
  options: {
    parseOptions?: IParseOptions;
    stringifyOptions?: IStringifyOptions;
  } = {}
) {
  const optionsRef = useRef(options);
  const defaultQS = useRef(def);
  const location = useLocation();
  const navigate = useNavigate();

  /** 当前 url 的参数数据,使用 qs 解析 */
  const query: T = useMemo(() => {
    const queryStr = location.search.slice(1);
    const parsed = qs.parse(queryStr, optionsRef.current.parseOptions) as T;
    const merged = { ...defaultQS.current, ...parsed };

    return merged;
  }, [location.search]);

  /**
   * 一个用于路由的函数,传入任意对象,使用 qs 压缩字符串后,拼接到新的路由
   *
   * @param obj 一个对应,使用 qs 压缩后作为新路由的查询参数跳转
   * @param navOption 同 React Route V6 的 useNavigate 返回值的配置,用于路由跳转
   */
  const navQs = useCallback(
    (obj: T | ((t: T) => T), navOption?: NavigateOptions) => {
      const objToSerialize = typeof obj === "function" ? obj(query) : obj;
      const str = qs.stringify(objToSerialize, optionsRef.current.stringifyOptions);

      navigate({ search: str }, navOption);
    },
    [navigate, query]
  );

  return [query, navQs] as const;
}

useQs 文档

useQs hook 用来对 qs 库进行 hook 调用,并集成到 react router v6 当中。它提供很简单的方式来管理当前页面的查询参数。

其基础用处如下:

const [qsValue, setQsValue] = useQs({ defaultParam: "defaultValue" });

// 当你需要获取本页面的查询参数时
console.log(qsValue);

// 当你需要设置当前页面的查询参数并用 react router 跳转时
setQsValue({ defaultParam: "newValue" });

参数

useQs 接收两个参数:

useQs(def, qsOptions);

需要注意的是,这两个参数都使用 ref 一次性存储,不会依赖更新。

def

def 参数作为当前地址的默认查询参数。

例如地址 http://host.com/url,下面代码依旧能正常运行:

const [qs, setQs] = useQs({ currentPage: "1" });
console.log(qs); // { currentPage: "1" }

例如地址 http://host.com/url?currentPage=2&foo[bar]=baz,获取到的值就会发生变化:

const [qs, setQs] = useQs({ currentPage: "1" });
console.log(qs); // { currentPage: "2", foo: { bar: "baz" }}

默认值会被会被 url 上的查询参数进行逐一覆盖。

qsOptions

qsOptions 用于配置 qs 的解析和序列化配置

  • qsOptions.parseOptions:解析配置
  • qsOptions.stringifyOptions:序列化配置

上述配置参考 qs 文档

返回值

useQs 返回只有两个值的元组,类似 useState 一样:

const [qsValue, setQsValue] = useQs();
  • qsValue:是当前路由的查询参数经过 qs 库解析后的对象。

  • setQsValue:是用来设置新的查询参数的函数。

qsValue

qsValue 是一个缓存值,使用 qs 库对当前路由查询参数解析后,再覆盖默认值得到。

qsValue 依赖 react router 的 useLocation 更新。

setQsValue

setQsValue 用来更新当前路由,例如:

setQsValue({ foo: { bar: "baz" }, param: "1" }); // ?foo[bar]=baz&param=1

它还有第二个参数,用来设置 ReactRouterV6 路由的配置,例如:

// 这将重定向路由
setQsValue({ foo: "1" }, { replace: true });

http://www.niftyadmin.cn/n/86179.html

相关文章

筑基六层 —— 整型提升及实用调式技巧

目录 一.修炼必备 二. 整型提升 三.实用调式技巧 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 2.趁手武器&#xff1a;印象笔记/有道云笔记 3.修炼秘籍&…

iPhone更换电池和屏幕后提醒非原厂配件的操作办法

---开局一张图&#xff0c;内容全靠编系列&#xff01; 【图】 自从在iPhone系统iOS13开始支持原厂配件检测后&#xff0c;可以说苹果也动起了维修站商家利益的这块蛋糕。道理自然简单&#xff0c;卷嘛&#xff01;全球汽车行业也不是靠卖新车才赚钱的&#xff0c;各种交通事故…

互联网大厂神秘法器:OKR方法

互联网大厂“敏捷绩效管理法”&#xff1a;OKR方法 对抗组织官僚 对抗不确定时代 自下而上激发活力 趣讲大白话&#xff1a;不玩点花样都不好意思 【趣讲信息科技&#xff1a;82期】 *********** OKR&#xff08;Objectives and Key Results&#xff09; 即目标与关键成果法 OK…

xfstests-bld实战

使用 xfstests-bld 运行文件系统测试 总结 xfstests-bld是一个支持使用xfstests执行测试的工具。 运行冒烟测试启动命令行管理程序对要执行的测试的更改更改测试文件系统更改测试文件系统参数 背景 xfstests是用于文件系统回归测试的测试套件&#xff0c;支持文件系统包括…

9、GPT-1-2-3

GPT GPT系列即基于Transformer Decoder实现的预训练语言模型&#xff0c;在各类复杂的NLP任务中都取得了不错的效果&#xff0c;如文章生成、代码生成、机器翻译&#xff0c;Q&A等。 对于一个新的任务&#xff0c;GPT仅仅需要非常少的数据便可以理解该任务&#xff0c;并…

生物素点击试剂1884349-58-9,Alkyne-PEG3-Biotin Diazo,炔基PEG3生物素重氮

Diazo Biotin-PEG3-alkyne&#xff0c;Alkyne-PEG3-Biotin Diazo&#xff0c;重氮生物素-PEG3-炔烃&#xff0c;重氮生物素PEG3炔烃&#xff0c;炔基PEG3生物素重氮产品结构式&#xff1a;产品规格&#xff1a;1.CAS号&#xff1a;1884349-58-92.分子式&#xff1a;C39H53N7O9S…

ts知识点整理

1、ts 中的 any 和 unknown 有什么区别&#xff1f; any 和 unknown 都是顶级类型&#xff0c;但是 unknown 更加严格&#xff0c;不像 any 那样不做类型检查&#xff0c;反而 unknown 因为未知性质&#xff0c;不允许访问属性&#xff0c;不允许赋值给其他有明确类型的变量。…

Java 静态变量、静态方法、静态块

静态变量、静态方法、静态块 静态变量 在类中&#xff0c;对一个变量添加static关键字&#xff0c;这个变量就是静态变量 public static int count;一个类可以new多个对象&#xff0c;但是静态变量是属于类的&#xff0c;不属于某一个对象。 在下面的student类中&#xff0c;…