You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js用户查询场景数据获取:用useSWR还是fetch/axios搭配useEffect?

Next.js搜索场景useSWR用法说明

现有代码的正确性

你当前的写法属于useSWR的合法用法:useSWR默认会在传入的第一个参数(请求key/地址)为假值时自动跳过请求,你初始将address设为空字符串,仅在用户提交表单后才赋值合法接口地址,刚好匹配「提交后才触发查询」的业务逻辑,功能层面没有问题。

useSWR比fetch+useEffect更适配该场景

在Next.js客户端搜索场景下,useSWR的优势远大于手动封装fetch+useEffect:

  • 自带缓存能力:相同查询参数的重复搜索会直接读取本地缓存,不会重复发起网络请求,性能体验更好
  • 内置状态管理:不需要手动维护loading、error等状态变量,useSWR直接返回对应状态字段,减少冗余代码
  • 扩展能力更强:后续如果需要新增断网重试、后台刷新、防抖查询等能力,仅需修改useSWR配置即可,不需要额外手写逻辑

现有代码的优化建议

可以简化状态逻辑,避免维护多余的address变量,同时增加合法性校验和状态提示,优化后的参考代码如下:

export default function SearchBar() {
  const [query, setQuery] = useState("");
  // 单独维护提交后才生效的搜索参数,避免输入过程中触发无效请求
  const [validQuery, setValidQuery] = useState("");
  const fetcher = async (url) => await axios.get(url).then((res) => res.data);
  
  // 仅当validQuery有值时才发起请求
  const { data, error, isLoading } = useSWR(
    validQuery ? `https://jsonplaceholder.typicode.com/todos/${validQuery}` : null,
    fetcher
  );

  const handleSubmit = (e) => {
    e.preventDefault();
    const trimedQuery = query.trim();
    if(trimedQuery) setValidQuery(trimedQuery);
  };

  if (error) return <div>查询出错,请稍后重试</div>;

  return (
    <>
      <Form onSubmit={handleSubmit}>
        <Input
          type="text"
          onChange={(e) => setQuery(e.target.value)}
          value={query}
        />
        <SearchButton type="submit">搜索</SearchButton>
      </Form>
      {isLoading && <div>加载中...</div>}
      {/* 搜索结果渲染 */}
      {data && <div>查询结果:{JSON.stringify(data)}</div>}
    </>
  );
}

仅当满足以下条件时可考虑用fetch+useEffect

如果你的搜索场景极其简单,不需要缓存、不需要重试机制、后续也没有扩展交互的规划,且仅需要单次请求逻辑,才考虑用fetch+useEffect实现,否则长期维护成本远高于使用useSWR。

内容的提问来源于stack exchange,提问作者m_coulier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:09:10