代码之家  ›  专栏  ›  技术社区  ›  sir-haver

Nextjs useSearchParams未正确更新

  •  -1
  • sir-haver  · 技术社区  · 9 月前

    我创建了一个简单的React钩子来更新搜索参数:

    import { useSearchParams, usePathname, useRouter } from "next/navigation";
    
    export const useParams = () => {
      const searchParams = useSearchParams();
      const router = useRouter();
      const pathname = usePathname();
    
      const setParams = (key: string, value: string) => {
        const params = new URLSearchParams(searchParams);
        params.set(key, value);
        router.replace(`${pathname}?${params}`);
      };
    
      return { setParams };
    };
    

    然后我在客户端组件中使用它:

    export const Pagination = () => {
      const { setParams } = useParams();
    
      const handleChangePageSize = (size: number) => {    
        setParams("pageSize", size.toString());
      };
    
      const handleSetPage = (pageNumber: number) => {
        setParams("pageNumber", pageNumber.toString());
      };
    // ... More code
    

    我的问题是 handleChangePageSize 被调用,并且 pageSize param设置了一个值,当以后 handelSetPage 被调用,它不知道 页面大小 ,已设置。更准确地说,钩子滞后一个变化。如果我删除 router.replace 在钩子内部(用于测试),如果我调用 句柄更改页面大小 两次,例如值为3,然后为6,然后当我调用 handleSetPage ,params的值将为3,因此它滞后1。

    为什么它会滞后?我该如何纠正我的勾手?

    1 回复  |  直到 9 月前
        1
  •  1
  •   DMabulage    9 月前

    尝试创建一个状态来跟踪参数

    import { useState } from "react";
    import { useSearchParams, usePathname, useRouter } from "next/navigation";
    
    export const useParams = () => {
      const searchParams = useSearchParams();
      const router = useRouter();
      const pathname = usePathname();
    
      const [params, setParamsState] = useState(new URLSearchParams(searchParams));
    
      const setParams = (key: string, value: string) => {
        const updatedParams = new URLSearchParams(params);
        updatedParams.set(key, value);
        setParamsState(updatedParams);
        router.replace(`${pathname}?${updatedParams.toString()}`);
      };
    
      return { setParams };
    };
    

    第.tsx页

     const { setParams } = useParams();
    
      const handleChangePageSize = (size: number) => {
        setParams('pageSize', size.toString());
      };
    
      const handleSetPage = (pageNumber: number) => {
        setParams('pageNumber', pageNumber.toString());
      };
    
    
    <button
            onClick={() => {
              handleChangePageSize(Math.floor(Math.random() * 100));
            }}
          >
            Set Page Size
          </button>
    
          <button
            onClick={() => {
              handleSetPage(Math.floor(Math.random() * 100));
            }}
          >
            Set Page
          </button>