新闻中心
使用 Next.js 和 SWR 在按钮点击时触发数据请求

使用 Next.js 和 SWR 在按钮点击时触发数据请求
在 Next.js 应用中使用 SWR 进行数据获取非常方便,但直接在事件处理函数(如按钮点击事件)中使用 useSWR Hook 会导致 "Invalid hook call" 错误。这是因为 React Hooks 只能在函数组件或自定义 Hook 的顶层调用,而不能在条件语句、循环或嵌套函数中使用。
解决方案:利用 SWR 的条件请求
SWR 允许你通过传递 null 或 false 作为 key 来禁用请求。我们可以利用这个特性,结合一个状态变量来控制 useSWR 是否发起请求。
import useSWR from 'swr';
import { useState } from 'react';
const fetcher = async (url) => {
const res = await fetch(url);
if (!res.ok) {
const error = new Error('An error occurred while fetching the data.');
error.info = await res.json();
error.status = res.status;
throw error;
}
return res.json();
};
function MyComponent() {
const [shouldFetch, setShouldFetch] = useState(false);
const { data, error, isLoading } = useSWR(
shouldFetch ? '/api/data' : null, // 当 shouldFetch 为 true 时才发起请求
fetcher
);
const handleClick = () => {
setShouldFetch(true); // 点击按钮时将 shouldFetch 设置为 true
};
if (error) return <div>Failed to load: {error.message}</div>;
if (isLoading) return <div>Loading...</div>;
return (
<div>
<button onClick={h
andleClick}>Fetch Data</button>
{data && <div>Data: {JSON.stringify(data)}</div>}
</div>
);
}
export default MyComponent;代码解释:
- useState: 使用 useState 创建一个名为 shouldFetch 的状态变量,初始值为 false。
- useSWR: useSWR 的 key 依赖于 shouldFetch 的值。只有当 shouldFetch 为 true 时,才会发起 /api/data 的请求。否则,useSWR 不会执行任何操作。
- handleClick: 按钮的 onClick 事件处理函数 handleClick 将 shouldFetch 设置为 true,从而触发 useSWR 发起请求。
- fetcher: 一个异步函数,负责实际的数据获取。
替代方案:使用 fetch 或 axios 直接获取数据
如果不想使用 SWR 的缓存和自动重试功能,可以直接使用 fetch 或 axios 在事件处理函数中获取数据。
青泥AI
青泥学术AI写作辅助平台
360
查看详情
import { useState } from 'react';
function MyComponent() {
const [data, setData] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const handleClick = async () => {
setIsLoading(true);
try {
const res = await fetch('/api/data');
if (!res.ok) {
throw new Error('Failed to fetch data');
}
const jsonData = await res.json();
setData(jsonData);
setError(null);
} catch (err) {
setError(err);
setData(null);
} finally {
setIsLoading(false);
}
};
if (error) return <div>Failed to load: {error.message}</div>;
if (isLoading) return <div>Loading...</div>;
return (
<div>
<button onClick={handleClick}>Fetch Data</button>
{data && <div>Data: {JSON.stringify(data)}</div>}
</div>
);
}
export default MyComponent;代码解释:
- useState: 使用 useState 管理数据 (data)、加载状态 (isLoading) 和错误 (error)。
- handleClick: 按钮的 onClick 事件处理函数 handleClick 使用 fetch 发起 API 请求。
- 错误处理: 使用 try...catch 块来捕获请求过程中可能发生的错误,并更新 error 状态。
- 加载状态: 使用 setIsLoading 在请求开始前设置为 true,请求完成后设置为 false,以显示加载指示器。
注意事项:
- 确保你的 API 端点 /api/data 返回有效的 JSON 数据。
- 根据实际情况修改 fetcher 函数或 fetch 请求的配置,例如添加请求头、身份验证信息等。
- 如果需要更高级的错误处理,可以自定义错误对象并包含更多信息。
总结:
本教程介绍了两种在 Next.js 应用中,通过按钮点击事件触发数据请求的方法。第一种方法利用 SWR 的条件请求特性,避免了直接在事件处理函数中使用 Hook 的限制。第二种方法则直接使用 fetch 或 axios 发起请求,更加灵活,但需要手动处理缓存和重试等功能。选择哪种方法取决于你的具体需求和对 SWR 功能的依赖程度。
以上就是使用 Next.js 和 SWR 在按钮点击时触发数据请求的详细内容,更多请关注其它相关文章!
# 有何不同
# 网站seo关键词排名优化软件
# 武汉网站推广微馨hfqjwl
# 清溪服装网站推广报价
# 黄石seo排名技巧
# 芙蓉区微博营销推广公司
# 石家庄红酒公司网站建设
# 如何做京东网站推广
# qq代刷网推广免费网站520
# 阜新外贸网站推广哪家好
# 朝阳区电商网站推广分类
# 能在
# 两种
# 才会
# react
# 重试
# 如何实现
# 服务端
# 加载
# 设置为
# 自定义
# red
# 点击事件
# ios
# ai
# axios
# json
# js
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
2026春节假期时间安排 2026春节假日查询
抖音从哪里进入网页版_抖音官方入口链接
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
PDF文件体积过大处理_PDF压缩技巧详解
qq游戏大厅官方下载_qq游戏免费下载安装入口
如何在CSS中使用浮动制作导航栏_float实现水平菜单
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
谷歌google账号注册详细步骤 谷歌账号注册官方教程
网站内容防复制粘贴的实现策略与局限性
FullCalendar 自定义按钮样式定制指南
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
顺丰国际快递查询 国际件官方查询入口
win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】
自定义Bag-of-Words实现:处理带负号的词汇权重
sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
学习通网页版快速入口 学习通官网网页版直接打开
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
QQ官网正版登录链接 QQ在线登录入口最新
蛙漫移动版在线看 蛙漫手机浏览器直达入口
微信客户端如何收红包_微信客户端接收红包使用教程
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
Python实时数据流中的动态最值查找策略
红果短剧网页版官网入口 官方最新网址发布
qq游戏手机版下载安装_qq游戏移动端入口
mc.js免安装版 mc.js一键畅玩入口
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
深入理解J*a编译器的兼容性选项:从-source到--release
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
《主播少女的秘密账号迷宫》首支宣传片
优化Django表单:提交验证失败后保留用户输入
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
b站怎么取消点赞_b站点赞取消操作方法
163邮箱注册官网 免费申请163个人邮箱
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
Python getattr() 异常处理深度解析:避免程序意外退出
Python字典中优雅地迭代剩余元素的方法
Shopware订单对象中获取产品自定义字段的正确方法
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网


2025-10-08
浏览次数:次
返回列表
andleClick}>Fetch Data</button>
{data && <div>Data: {JSON.stringify(data)}</div>}
</div>
);
}
export default MyComponent;