@guanriyue/decurl

@guanriyue/decurl 默认入口提供开箱即用的 React Router hooks。它们会在 hook 内部读取当前 React Router 的 locationnavigate,不需要手动放置 Provider。

import { useSearchValue, useSearchValues } from '@guanriyue/decurl';

默认 hooks 使用默认的单例 search store。对于一个应用只有一套 React Router runtime 的场景,通常直接使用即可。

这些 hooks 需要运行在 React Router 上下文内,例如 BrowserRouterRouterProvider 或其他 React Router runtime 内部。

如果需要显式提供 store、配置 store 行为,或者减少组件对 React Router useLocation 的直接依赖,见 @guanriyue/decurl/provided

useSearchValues

useSearchValues(searchFields) 读取和更新多个 search values。

useSearchValues(searchFields): [values, setValues]

参数:

参数说明
searchFields一组 Search Fields,通常来自 defineFields

返回值:

返回值说明
values从当前 URL search params decode 得到的 values object。
setValues更新多个字段的 setter。
import { useSearchValues } from '@guanriyue/decurl';

const SearchPanel = () => {
  const [values, setValues] = useSearchValues(searchFields);

  return (
    <button
      type="button"
      onClick={() => {
        setValues({ page: values.page + 1 });
      }}
    >
      Next page
    </button>
  );
};

setValues(patch, options?) 接收 patch。只会更新传入字段,未传入字段保持不变。默认使用 { replace: true } 写回 URL。

传入 nullundefined 表示删除对应字段的 URL key。如果写入值等于 field 的 defaultValue,默认也会删除对应 key;是否保留 default value 由 URLSearchParams codec 的 encode 规则决定。

如果把整个 patch 传为 undefined,会删除当前 searchFields 中所有字段对应的 URL key,并保留 searchFields 之外的 search params:

setValues(undefined);

patch 也可以是 updater:

setValues((previousValues) => ({
  page: previousValues.page + 1,
}));

如果 updater 返回 undefined,语义与 setValues(undefined) 相同。

useSearchValue

useSearchValue(codec) 读取和更新单个 field。传入的 codec 必须已经拥有确定的 name,通常来自 defineFields 的返回值。

useSearchValue(codec): [value, setValue]

参数:

参数说明
codec带有确定 name 的 field codec,通常来自 defineFields 的返回值。

返回值:

返回值说明
value从当前 URL search params decode 得到的单个 field value。
setValue更新单个字段的 setter。
import { useSearchValue } from '@guanriyue/decurl';

const PageButton = () => {
  const [page, setPage] = useSearchValue(searchFields.page);

  return (
    <button
      type="button"
      onClick={() => {
        setPage(page + 1);
      }}
    >
      Next page
    </button>
  );
};

setValue(patch, options?) 同样支持直接值或 updater。默认使用 { replace: true } 写回 URL。

传入 nullundefined 表示删除该 field 对应的 URL key。如果写入值等于 field 的 defaultValue,默认也会删除对应 key。

setPage((previousPage) => previousPage + 1);

Render behavior

默认 hooks 会在 hook 内部读取 React Router location。某些路由更新可能让组件跟随 React Router 重新渲染;如果你需要把 React Router 能力获取集中到独立组件,或观察相关渲染边界,可以阅读 @guanriyue/decurl/providedProvided Runtime

setter 的第二个参数会透传给 React Router navigate。Decurl 默认使用 replace: true,避免频繁的 search params 更新写入大量 history entries。

选项类型默认值说明
replacebooleantrue是否替换当前 history entry。
preventScrollResetbooleanReact Router 默认行为是否阻止滚动位置重置。它和 React Router navigate options 中的 preventScrollReset 是同一个概念。
setPage(1, { replace: true, preventScrollReset: true });

如果同一次 flush 前发生多次 setter 调用,会使用最后一次调用传入的 navigate options 覆盖默认值。

SearchProvider

SearchProvider 提供一份独立的 search store,并可以配置 store options。默认 hooks 会优先读取最近的 SearchProvider store;如果没有 Provider,则使用默认 global store。

import { SearchProvider } from '@guanriyue/decurl';

<SearchProvider flushDelay={80} flushMode="debounce">
  <App />
</SearchProvider>
Prop类型说明
flushDelaynumbersearch 写入 URL 前的延迟毫秒数。
flushMode'throttle' | 'debounce'flush 调度模式。

SearchProvider 只负责提供 store,不负责读取 React Router locationnavigate。默认 hooks 会自己读取 React Router 能力;provided hooks 则需要配合 SearchRuntimeConnector 使用。

Types

类型说明
SetSearchValues<TFields>useSearchValues setter 类型。
SearchValuesPatch<TFields>useSearchValues setter 接收的 patch 类型。
SetSearchValue<TCodec>useSearchValue setter 类型。
SearchValuePatch<TCodec>useSearchValue setter 接收的 patch 类型。
UseSearchValuesResult<TFields>useSearchValues 返回元组类型。
UseSearchValueResult<TCodec>useSearchValue 返回元组类型。