只用过传统搜索方式?来试试url持久化搜索

本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~

具体博文介绍: 开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘金

传统搜索方式

从搜索框拿到数据后直接传给后端查询

typescript 复制代码
import { NextResponse } from 'next/server';

export async function POST(request: Request) {
  const { search } = await request.json();
  // 在这里实现实际的搜索逻辑
  return NextResponse.json({ results: [`搜索结果:${search}`] });
}

url持久化搜索

这里就是将q?={search}放在了当前页面的url后面,若search值为abc及当前q?=abc

typescript 复制代码
// URL参数持久化方式
export function URLSearch() {
  const [search, setSearch] = useSearchParams("q");
  const [value, setValue] = useState(search || "");

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    setSearch(value);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        value={value}
        onChange={(e) => setValue(e.target.value)}
        placeholder="URL搜索"
      />
      <button type="submit">更新URL</button>
    </form>
  );
}

url持久化有什么好处?

  1. 将搜索值存放在url结合hash模式使用可以保持状态持久化:
    • 页面刷新不丢失搜索状态
    • 复制分享链接对方能直接看到相同搜索结果
  2. seo友好
    • 搜索引擎可直接抓取搜索内容
  3. 可跨组件抓取搜索参数

通过实战教你如何使用url持久化搜索

首先封装一个hooks,这里用到了nuq库我的版本是 "nuqs": "^2.2.3"

/hooks/use-search-params.tsx

typescript 复制代码
//封装nuqs的useQueryState
import { parseAsString, useQueryState } from "nuqs";

export const useSearchParams = (key:string) => {
  return useQueryState(
    key, 
    parseAsString  // 1. 类型约束(强制字符串类型)
      .withDefault("")  // 2. 默认值
      .withOptions({
        clearOnDefault:true  // 3. 自动清理机制
      })
  );
};

然后在search组件导入

这样我们就可以通过setValue来修改搜索内容,此处会以search?={value}的形式放在当前页面url

javascript 复制代码
import { useSearchParams } from "@/hooks/use-search-params";
export const SearchInput=(){
  const [value, setValue] = useSearchParams("search");
}

之后我们就可以在需要使用的地方取出这个value然后进行之后的一系列操作

typescript 复制代码
import { useSearchParams } from "@/hooks/use-search-params"
export const mainPage=(){
  const [value] = useSearchParams("search");
}
相关推荐
计算机魔术师6 分钟前
OpenAI 发布 GPT-6 Astra:多项基准刷新纪录, cybersecurity 能力达 Critical 阈值
前端
xy34537 分钟前
Axure9.0中继器遮罩实现方法
前端·ui·html·axure·原型·产品设计
风骏时光牛马14 分钟前
智能任务自动化协同AI工作流
前端
IT_陈寒23 分钟前
Python的多线程居然是个假把式?搞清GIL让我少熬三天夜
前端·人工智能·后端
宿67424 分钟前
vue3-config
前端·javascript·vue.js
明月_清风25 分钟前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
明月_清风33 分钟前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法
非凡ghost2 小时前
AI修图不“造假“,摄影师的出片效率加速器
服务器·前端·人工智能·电脑
2601_951615202 小时前
网页设计模板源码 web前端模板网页源码下载
前端
mmsx2 小时前
osmdroid 地图实战 03|地图的"分层世界":离线方案、图层模型与 Overlay 体系
android·前端