扫码关注官方订阅号
本文旨在解决在react应用中通过点击不同分类元素来触发动态api调用的常见问题。重点阐述了`
在现代Web应用中,根据用户的交互(例如点击不同的分类按钮)动态加载数据是一种非常常见的需求。在React中,结合状态管理(useState)、副作用处理(useEffect)和HTTP客户端(Axios),可以高效地实现这一功能。然而,在实现过程中,开发者有时会遇到一些关于HTML元素属性使用的误区,导致功能未能按预期工作。
在尝试通过点击
// 原始尝试 <li value="Seafood" onClick={onClickHandler}> Seafood </li>
以及对应的事件处理函数:
const onClickHandler = (e: any) => { setCategory(e.target.value); // 期望获取 "Seafood" };
这种做法的问题在于,
最直接且语义化的解决方案是使用元素来处理点击事件并传递值。元素专门设计用于用户交互,其value属性可以正确地存储并传递与按钮关联的值。
代码示例:
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 function CategoryFilter() { const [category, setCategory] = useState("Seafood"); // 初始分类 const [meals, setMeals] = useState([]); const [error, setError] = useState<string | null>(null); const [loading, setLoading] = useState(false); useEffect(() => { if (!category) return; // 如果没有分类,则不发起请求 setLoading(true); setError(null); axios .get(`${API_BASE_URL}${category}`) .then(function (response) { setMeals(response.data.meals || []); // 确保即使没有数据也设置为空数组 }) .catch(function (err) { console.error("API Error:", err); setError("加载数据失败,请稍后再试。"); setMeals([]); }) .finally(() => { setLoading(false); }); }, [category]); // category 改变时重新运行 effect const onClickHandler = (e: React.MouseEvent<HTMLButtonElement>) => { // 使用 e.currentTarget.value 获取 button 的值 setCategory(e.currentTarget.value); }; return ( <div> <h1>菜品分类</h1> <ul style={{ listStyle: 'none', padding: 0 }}> <li style={{ display: 'inline-block', margin: '0 10px' }}> <button value="Seafood" onClick={onClickHandler}> 海鲜 (Seafood) </button> </li> <li style={{ display: 'inline-block', margin: '0 10px' }}> <button value="Vegetarian" onClick={onClickHandler}> 素食 (Vegetarian) </button> </li> <li style={{ display: 'inline-block', margin: '0 10px' }}> <button value="Dessert" onClick={onClickHandler}> 甜点 (Dessert) </button> </li> </ul> {loading && <p>加载中...</p>} {error && <p style={{ color: 'red' }}>{error}</p>} {!loading && !error && meals.length === 0 && <p>未找到相关菜品。</p>} {!loading && !error && meals.length > 0 && ( <div> <h2>{category} 菜品:</h2> <ul> {meals.map((meal: any) => ( <li key={meal.idMeal}>{meal.strMeal}</li> ))} </ul> </div> )} </div> ); } export default CategoryFilter;
注意事项:
VALL-E是一种用于文本到语音生成 (TTS) 的语言建模方法
如果出于某种设计或结构上的考虑,你坚持要让
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 function CategoryFilterWithDataAttribute() { const [category, setCategory] = useState("Seafood"); // 初始分类 const [meals, setMeals] = useState([]); const [error, setError] = useState<string | null>(null); const [loading, setLoading] = useState(false); useEffect(() => { if (!category) return; setLoading(true); setError(null); axios .get(`${API_BASE_URL}${category}`) .then(function (response) { setMeals(response.data.meals || []); }) .catch(function (err) { console.error("API Error:", err); setError("加载数据失败,请稍后再试。"); setMeals([]); }) .finally(() => { setLoading(false); }); }, [category]); const onClickHandler = (e: React.MouseEvent<HTMLLIElement>) => { // 使用 e.currentTarget.getAttribute("data-value") 获取自定义数据 const clickedCategory = e.currentTarget.getAttribute("data-value"); if (clickedCategory) { setCategory(clickedCategory); } }; return ( <div> <h1>菜品分类 (使用 data-value)</h1> <ul style={{ listStyle: 'none', padding: 0 }}> <li data-value="Seafood" onClick={onClickHandler} style={{ cursor: 'pointer', display: 'inline-block', margin: '0 10px', padding: '5px 10px', border: '1px solid #ccc' }}> 海鲜 (Seafood) </li> <li data-value="Vegetarian" onClick={onClickHandler} style={{ cursor: 'pointer', display: 'inline-block', margin: '0 10px', padding: '5px 10px', border: '1px solid #ccc' }}> 素食 (Vegetarian) </li> <li data-value="Dessert" onClick={onClickHandler} style={{ cursor: 'pointer', display: 'inline-block', margin: '0 10px', padding: '5px 10px', border: '1px solid #ccc' }}> 甜点 (Dessert) </li> </ul> {loading && <p>加载中...</p>} {error && <p style={{ color: 'red' }}>{error}</p>} {!loading && !error && meals.length === 0 && <p>未找到相关菜品。</p>} {!loading && !error && meals.length > 0 && ( <div> <h2>{category} 菜品:</h2> <ul> {meals.map((meal: any) => ( <li key={meal.idMeal}>{meal.strMeal}</li> ))} </ul> </div> )} </div> ); } export default CategoryFilterWithDataAttribute;
在React应用中实现动态API调用时,选择正确的HTML元素和属性至关重要。
通过遵循这些最佳实践,你可以构建出更健壮、更易维护且用户体验更好的React应用。
以上就是React中动态点击分类触发Axios API调用的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部