新闻中心

React中动态点击分类触发Axios API调用的最佳实践

2025-10-18
浏览次数:
返回列表

React中动态点击分类触发Axios API调用的最佳实践

本文旨在解决在react应用中通过点击不同分类元素来触发动态api调用的常见问题。重点阐述了`

  • `元素`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;

    注意事项:

    AI Surge Cloud AI Surge Cloud

    低代码数据分析平台,帮助企业快速交付深度数据

    AI Surge Cloud 87 查看详情 AI Surge Cloud
    • 在onClickHandler中,我们使用e.currentTarget.value来获取按钮的值。currentTarget指的是事件监听器所绑定的元素,而target可能是事件实际发生的元素(例如,如果按钮内有文本,target可能是文本节点)。对于按钮,两者通常相同,但currentTarget在处理事件委托时更可靠。
    • 将button嵌套在li中是完全符合语义的,因为li代表列表项,而button是列表项中的一个可交互元素。

    解决方案二:使用 data-* 属性(如果必须使用

  • 如果出于某种设计或结构上的考虑,你坚持要让

  • 元素本身作为可点击项,并且需要传递自定义数据,那么HTML5的data-*属性是理想的选择。data-*属性允许你在标准HTML元素上存储自定义数据,而不会影响其语义或行为。

    代码示例:

    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;

    注意事项:

    • 在HTML中,data-*属性的命名规则是data-前缀后跟自定义名称(如data-value)。
    • 在J*aScript中,你可以通过元素的dataset属性(e.currentTarget.dataset.value)或getAttribute()方法(e.currentTarget.getAttribute("data-value"))来访问这些数据。dataset属性提供了一个更方便的DOMStringMap接口,将data-value转换为dataset.value。
    • 被用作可点击元素时,为了提高用户体验和可访问性,建议为其添加cursor: pointer样式,并考虑添加键盘导航支持。

    总结

    在React应用中实现动态API调用时,选择正确的HTML元素和属性至关重要。

    1. 首选 当你需要一个可点击的交互元素来触发动作并传递值时,
    2. *`data-属性作为备选:** 如果你必须使用非表单元素(如
    3. 、等)作为可点击项,并且需要关联自定义数据,那么data-*`属性是最佳方案。它允许你在不违反HTML语义的前提下存储额外信息。
    4. 避免误用
    5. 的value属性:
    6. 记住
    7. 的value属性仅用于指定有序列表中的序数值,不应用于存储自定义字符串数据。
    8. 通过遵循这些最佳实践,你可以构建出更健壮、更易维护且用户体验更好的React应用。

  • 以上就是React中动态点击分类触发Axios API调用的最佳实践的详细内容,更多请关注php中文网其它相关文章!


    # react  # javascript  # java  # php  # 再试  # 保定seo方案  # 请稍后  # 未找到  # 不匹配  # 肇庆seo快速优化软件  # 广告视频网站推广怎么做  # 遂平网络营销推广服务商  # 伤感歌曲关键词排名榜  # 郑英明seo熊掌号  # 杜琪峰电影网站建设  # 莆田优惠的全屏营销推广  # seo编辑培训培训  # 营销推广物料分类标准  # 中不  # 加载  # 你在  # 你可以  # 菜品  # 自定义  # 常见  # ios  # axios  # html5  # go  # json  # js  # html 


    相关栏目: 【 科技资讯46185 】 【 网络学院92790


    相关推荐: c++20的std::jthread是什么_c++可中断线程与RAII式管理  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  Go语言中动态执行代码字符串的策略与实践  Go语言中JSON数据解码与字段访问指南  Composer如何在生产环境安全地执行composer update  b站怎么取消点赞_b站点赞取消操作方法  如何仅使用CSS更改登录界面背景图像图标的颜色  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  狙击外星人小游戏开始_狙击外星人小游戏立即开始  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  铃兰之剑为这和平的世界希里技能组及加点推荐  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  创客贴用户入口官网登录 创客贴网页版电脑版系统  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  C++如何比较两个字符串_C++ string compare函数与操作符对比  微信网页版扫码登录入口 微信网页版二维码登录入口  利用Bokeh CustomJS动态控制DataTable列可见性  动漫岛观看全网网 动漫岛在线正版动漫入口  微信客户端如何收红包_微信客户端接收红包使用教程  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  如何在Promise链中优雅地中断后续then执行  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  UC浏览器网页版登录入口官网 电脑版网址入口  Eclipse怎么运行工程_Eclipse工程运行配置说明  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  Tailwind CSS line-clamp 布局问题解析与修复指南  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Node.js中HTML按钮与J*aScript函数交互的正确姿势  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程 

    搜索