0

0

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

心靈之曲

心靈之曲

发布时间:2025-10-18 11:01:00

|

638人浏览过

|

来源于php中文网

原创

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(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) => {
        // 使用 e.currentTarget.value 获取 button 的值
        setCategory(e.currentTarget.value);
      };
    
      return (
        

    菜品分类

    {loading &&

    加载中...

    } {error &&

    {error}

    } {!loading && !error && meals.length === 0 &&

    未找到相关菜品。

    } {!loading && !error && meals.length > 0 && (

    {category} 菜品:

      {meals.map((meal: any) => (
    • {meal.strMeal}
    • ))}
    )}
    ); } export default CategoryFilter;

    注意事项:

    如此AI员工
    如此AI员工

    国内首个全链路营销获客AI Agent

    下载
    • 在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(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) => {
        // 使用 e.currentTarget.getAttribute("data-value") 获取自定义数据
        const clickedCategory = e.currentTarget.getAttribute("data-value");
        if (clickedCategory) {
          setCategory(clickedCategory);
        }
      };
    
      return (
        

    菜品分类 (使用 data-value)

    • 海鲜 (Seafood)
    • 素食 (Vegetarian)
    • 甜点 (Dessert)
    {loading &&

    加载中...

    } {error &&

    {error}

    } {!loading && !error && meals.length === 0 &&

    未找到相关菜品。

    } {!loading && !error && meals.length > 0 && (

    {category} 菜品:

      {meals.map((meal: any) => (
    • {meal.strMeal}
    • ))}
    )}
    ); } export default CategoryFilterWithDataAttribute;

    注意事项:

    • 在HTML中,data-*属性的命名规则是data-前缀后跟自定义名称(如data-value)。
    • 在JavaScript中,你可以通过元素的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应用。

  • 相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    557

    2023.06.20

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    394

    2023.07.04

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    754

    2023.07.04

    js删除节点的方法
    js删除节点的方法

    js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

    478

    2023.09.01

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    454

    2023.09.04

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    1051

    2023.09.04

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    658

    2023.09.12

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    554

    2023.09.20

    Golang 性能分析与pprof调优实战
    Golang 性能分析与pprof调优实战

    本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

    0

    2026.01.22

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    PHP课程
    PHP课程

    共137课时 | 9.1万人学习

    JavaScript ES5基础线上课程教学
    JavaScript ES5基础线上课程教学

    共6课时 | 9.6万人学习

    PHP新手语法线上课程教学
    PHP新手语法线上课程教学

    共13课时 | 0.9万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号