只用过传统搜索方式?来试试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");
}
相关推荐
d***9352 小时前
springboot3.X 无法解析parameter参数问题
android·前端·后端
n***84073 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
likuolei7 小时前
XSL-FO 软件
java·开发语言·前端·数据库
正一品程序员7 小时前
vue项目引入GoogleMap API进行网格区域圈选
前端·javascript·vue.js
j***89467 小时前
spring-boot-starter和spring-boot-starter-web的关联
前端
star_11128 小时前
Jenkins+nginx部署前端vue项目
前端·vue.js·jenkins
im_AMBER8 小时前
Canvas架构手记 05 鼠标事件监听 | 原生事件封装 | ctx 结构化对象
前端·笔记·学习·架构
JIngJaneIL8 小时前
农产品电商|基于SprinBoot+vue的农产品电商系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·农产品电商系统
Tongfront8 小时前
前端通用submit方法
开发语言·前端·javascript·react
可爱又迷人的反派角色“yang”8 小时前
LVS+Keepalived群集
linux·运维·服务器·前端·nginx·lvs