扫码关注官方订阅号
本文探讨了在react应用中,通过点击不同分类按钮动态调用api的正确方法。针对`
在React应用中,根据用户点击不同的分类项来动态触发API调用并获取相应数据是一种常见的需求。例如,用户点击“海鲜”分类,则加载海鲜食谱;点击“甜点”分类,则加载甜点食谱。然而,在实现这一功能时,开发者有时会遇到一些陷阱,特别是在处理HTML元素的属性时。
一个常见的误区是尝试将自定义的分类值存储在
<li value="Seafood" onClick={onClickHandler}> Seafood </li>
并期望通过以下方式获取值:
const onClickHandler = (e: any) => { setCategory(e.target.value); // 期望获取 "Seafood" };
然而,这种做法会导致e.target.value返回null或空字符串。这是因为
在深入探讨解决方案之前,我们先明确动态API调用的核心React逻辑。这部分代码负责管理当前选中的分类状态,并在分类变化时触发API请求。
import React, { useState, useEffect } from 'react'; import axios from 'axios'; const API_BASE_URL = "https://www.themealdb.com/api/json/v1/1/filter.php?c="; // 示例API基础URL function CategoryFilter() { const [category, setCategory] = useState<string>(""); // 存储当前选中的分类 const [meals, setMeals] = useState<any[]>([]); // 存储API返回的菜品数据 const [loading, setLoading] = useState<boolean>(false); const [error, setError] = useState<string | null>(null); useEffect(() => { if (!category) return; // 如果没有分类,则不发起请求 setLoading(true); setError(null); axios.get(`${API_BASE_URL}${category}`) .then(function (response) { setMeals(response.data.meals || []); // 更新菜品数据,如果无数据则为空数组 console.log(`Fetched ${category} meals:`, response.data.meals); }) .catch(function (error) { console.error("API call error:", error); setError("Failed to fetch data. Please try again."); setMeals([]); // 清空数据 }) .finally(() => { setLoading(false); }); }, [category]); // 依赖项:当category变化时重新运行effect // onClickHandler的实现将在下面两种解决方案中给出 return ( <div> <h1>分类食谱</h1> {/* 分类按钮/列表将在这里渲染 */} {loading && <p>加载中...</p>} {error && <p style={{ color: 'red' }}>{error}</p>} {!loading && !error && meals.length === 0 && category && <p>未找到 {category} 分类的食谱。</p>} {!loading && !error && meals.length > 0 && ( <ul> {meals.map((meal: any) => ( <li key={meal.idMeal}>{meal.strMeal}</li> ))} </ul> )} </div> ); } export default CategoryFilter;
接下来,我们将介绍两种正确的解决方案来获取点击事件中的分类值。
最直接且符合语义化的解决方案是使用元素。按钮天生就是为用户交互设计的,并且其value属性可以很好地用于存储自定义值。
HTML/JSX 代码:
Fotor推出的AI图片放大工具
// 在 CategoryFilter 组件的 return 语句中 <div> <h1>分类食谱</h1> <nav> <button value="Seafood" onClick={onClickHandler}> Seafood </button> <button value="Dessert" onClick={onClickHandler}> Dessert </button> <button value="Vegetarian" onClick={onClickHandler}> Vegetarian </button> {/* 更多分类按钮 */} </nav> {/* ... 其他内容 (loading, error, meals 渲染) ... */} </div>
事件处理函数:
onClickHandler函数可以保持不变,因为e.target.value现在会正确地获取到按钮的value属性。
const onClickHandler = (e: React.MouseEvent<HTMLButtonElement>) => { setCategory(e.currentTarget.value); // 使用 currentTarget 确保获取到点击的按钮本身的值 };
优点:
如果出于布局或样式考虑,仍然希望使用
// 在 CategoryFilter 组件的 return 语句中 <div> <h1>分类食谱</h1> <nav> <ul> <li data-value="Seafood" onClick={onClickHandler}> Seafood </li> <li data-value="Dessert" onClick={onClickHandler}> Dessert </li> <li data-value="Vegetarian" onClick={onClickHandler}> Vegetarian </li> {/* 更多分类列表项 */} </ul> </nav> {/* ... 其他内容 (loading, error, meals 渲染) ... */} </div>
在这种情况下,你需要修改onClickHandler来从data-value属性中获取数据。
const onClickHandler = (e: React.MouseEvent<HTMLLIElement>) => { // 使用 getAttribute 获取 data-value 属性的值 setCategory(e.currentTarget.getAttribute("data-value") || ""); };
在React中实现点击不同分类调用API的功能时,关键在于正确地从点击事件中获取分类值。避免将自定义数据存储在
以上就是React中利用Axios实现动态分类API调用的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部