如何通过HTML数据属性在React中传递映射数组数据

如何通过html数据属性在react中传递映射数组数据

本文探讨了在React应用中,如何正确地将自定义数据附加到原生HTML元素(如`

`)并通过事件处理函数获取这些数据,而无需创建额外的React组件。核心解决方案是利用HTML5的`data`属性,它允许开发者在HTML元素上存储额外的信息,并通过`event.target.dataset`在JavaScript中安全、便捷地访问这些数据,同时避免了直接将JavaScript对象作为非标准属性传递的问题。

理解原生HTML元素与自定义属性的限制

在React中,当我们将组件渲染为原生HTML元素(例如div, ul, li等)时,我们必须遵守HTML规范。直接向这些原生元素添加非标准属性,如示例中尝试的airport={airport}、lat={airport.latitude}或name={airport.name},是无效的。浏览器会忽略这些非标准属性,或者即使在DOM中可见,也无法通过标准DOM API(如event.target.property)可靠地访问它们。因此,在事件处理函数中,尝试通过airport.target.lat等方式获取数据会失败,因为这些属性并未被正确地附加到DOM元素上。

使用HTML5 data 属性传递自定义数据

为了在原生HTML元素上存储自定义数据,并能在JavaScript事件处理函数中访问它们,HTML5引入了data属性。data属性以data-前缀开头,后跟自定义的名称,例如data-latitude、data-airport-id等。这些属性的值可以是任何字符串。

当一个元素具有data属性时,可以通过JavaScript中的HTMLElement.dataset属性来访问它们。dataset是一个DOMStringMap对象,其中包含了所有data-属性的键值对,键名是data-后面的部分(自动转换为驼峰命名法)。

立即学习“前端免费学习笔记(深入)”;

示例:正确传递并获取数据

让我们根据原有的问题,修改代码以使用data属性来传递机场信息。

import React, { useState } from 'react';import { TextField } from '@mui/material'; // 假设你正在使用MUI的TextFieldfunction AirportSelector({ airportsData }) { // 假设airportsData是传入的机场列表  const [first, setFirst] = useState('');  const [resultFirst, setResultFirst] = useState({ airports: airportsData }); // 假设数据源  const handleLiClickFirst = (event) => {    // 通过 event.target.dataset 访问 data 属性    const selectedLatitude = event.target.dataset.latitude;    const selectedLongitude = event.target.dataset.longitude;    const selectedName = event.target.dataset.name;    const selectedIata = event.target.dataset.iata;    // 如果需要完整的机场对象,可以从 data-airport 属性中解析    // 注意:如果 airport 对象很大,不建议直接存储整个对象    const airportDataString = event.target.dataset.airport;    const fullAirportObject = airportDataString ? JSON.parse(airportDataString) : null;    setFirst(selectedName); // 更新输入框显示名称    console.log('Selected Name:', selectedName);    console.log('Selected Latitude:', selectedLatitude);    console.log('Selected Longitude:', selectedLongitude);    console.log('Selected IATA:', selectedIata);    if (fullAirportObject) {      console.log('Full Airport Object:', fullAirportObject);    }  };  return (    
setFirst(e.target.value.toLocaleLowerCase())} />
    {resultFirst.airports?.map((airport) => (
  • {airport.name}
  • ))}
);}export default AirportSelector;

注意事项与最佳实践

访问方式: 在事件处理函数中,通过event.target.dataset对象来访问data属性。例如,data-latitude对应event.target.dataset.latitude。数据类型: data属性的值始终是字符串。如果需要存储非字符串类型(如数字、布尔值或对象),在设置时它们会被隐式转换为字符串。在读取时,如果需要原始类型,则需要手动进行类型转换(例如,parseInt(event.target.dataset.latitude))。传递复杂对象: 如果需要传递一个完整的JavaScript对象(如示例中的airport对象),必须先使用JSON.stringify()将其序列化为JSON字符串,然后在事件处理函数中通过JSON.parse()将其反序列化。

data-airport={JSON.stringify(airport)}
const fullAirportObject = JSON.parse(event.target.dataset.airport);

避免冗余数据: 尽量避免在data属性中存储过大或复杂的对象。这会增加HTML元素的DOM大小,可能影响性能,并且使HTML结构变得臃肿。如果只需要部分数据,只传递那部分数据。如果需要完整的对象,更好的做法是只传递一个唯一标识符(如airport.iata),然后在事件处理函数中根据这个ID从React的状态、Context或全局数据源中查找完整的对象。例如,只传递iata:

  • {airport.name}
  • 然后在处理函数中:

    const selectedIata = event.target.dataset.iata;const fullAirportObject = resultFirst.airports.find(a => a.iata === selectedIata);

    总结

    在React中,当需要将自定义数据附加到原生HTML元素上,并在事件处理函数中访问这些数据时,HTML5的data属性是标准且推荐的解决方案。通过data-attribute-name语法设置属性,并通过event.target.dataset.attributeName在JavaScript中获取数据,可以有效避免直接使用非标准属性带来的问题。同时,合理规划所存储的数据量和类型,尤其是在处理复杂对象时,以保持代码的性能和可维护性。

    以上就是如何通过HTML数据属性在React中传递映射数组数据的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1588532.html

    赞 (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    Cypress中Shadow DOM元素定位策略:解决元素查找失败问题
    上一篇 2025年12月23日 04:21:33
    CSS中多语言选择器的高效管理与SCSS实践
    下一篇 2025年12月23日 04:21:41

    相关推荐

    • vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程

      vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程vivo浏览器怎么添加书签到桌面_vivo浏览器网页快捷方式添加到桌面教程

      1、打开vivo浏览器进入目标网页,点击右上角三点菜单选择“添加到桌面”,系统自动创建快捷方式;2、若无此选项,可先将网页保存为书签,再通过书签管理长按条目选择“添加到桌面”生成图标;3、还可借助Nova Launcher等第三方启动器,通过添加网页链接小部件手动输入URL创建快捷方式。 如果您希望…

      2026年9月26日 • 用户投稿
      100
    • 谈谈你对Java平台的理解,什么是“一次编写,到处运行”?

      谈谈你对Java平台的理解,什么是“一次编写,到处运行”?谈谈你对Java平台的理解,什么是“一次编写,到处运行”?谈谈你对Java平台的理解,什么是“一次编写,到处运行”?谈谈你对Java平台的理解,什么是“一次编写,到处运行”?

      Java虚拟机(JVM)是实现“一次编写,到处运行”的核心,它通过将Java字节码翻译为特定平台的机器码,屏蔽了底层差异,实现跨平台兼容;同时JVM提供内存管理、垃圾回收和JIT编译等机制,保障程序的高效与稳定运行。尽管存在JNI依赖、UI差异、性能波动和环境配置等挑战,Java仍凭借其强大生态在企…

      2026年9月26日 • 用户投稿
      000
    • 新机遇、新体验、新服务,HarmonyOS 游戏领启未来

      新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来

      【中国,上海,2025年7月31日】2025年中国国际数字娱乐产业大会(cdec)高峰论坛顺利举行。华为终端云服务互动媒体bu总裁张思建在题为《技术赋能体验创新 harmonyos 游戏领启未来》的演讲中指出,随着harmonyos 5设备数量突破千万大关,鸿蒙系统5已成功通过大规模市场验证,整体用…

      2026年9月26日 • 用户投稿
      400
    • win8自带的录屏功能怎么用_Win8录屏功能使用方法

      win8自带的录屏功能怎么用_Win8录屏功能使用方法win8自带的录屏功能怎么用_Win8录屏功能使用方法win8自带的录屏功能怎么用_Win8录屏功能使用方法win8自带的录屏功能怎么用_Win8录屏功能使用方法

      可通过步骤记录器、QQ录屏或第三方软件实现Windows 8操作记录。首先,使用psr.exe可生成图文报告;其次,QQ快捷键Ctrl+Alt+R支持区域录屏并保存为MP4;最后,安装兼容的第三方工具如数据蛙录屏软件,可实现全屏/区域录制并同步系统声音与麦克风输入,满足高质量录屏需求。 如果您想在W…

      2026年9月26日 • 用户投稿
      200
    • 率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元

      率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元

      在人工智能技术迅猛发展的背景下,从大规模模型训练到广泛的边缘计算应用,数据以前所未有的速度不断产生。根据 idc 的预测,至 2028 年全球将生成高达 394zb 的数据,其中生成式 ai 贡献超过 100zb。面对如此庞大的数据体量,如何实现安全存储与高效管理,成为亟需解决的关键问题。对于承载数…

      2026年9月26日 • 用户投稿
      100
    • 抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程

      抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程抖音PC版如何使用直播功能_抖音PC版开启直播的详细教程

      首先下载安装抖音直播伴侣,然后通过手机扫码登录,接着配置场景、音视频设备及推流参数,最后填写标题并点击“开始推流”即可成功开启电脑直播。 如果您想在电脑上进行直播,以获得更好的画面质量、音效控制和互动体验,但不清楚如何操作,可以按照以下步骤在抖音PC版开启直播。 本文运行环境:联想拯救者Y9000P…

      2026年9月26日 • 用户投稿
      100
    • 豆包AI是否能生成代码 豆包代码生成功能及其适用范围分析

      本文将围绕豆包AI是否能生成代码这一问题展开探讨。我们将首先确认其代码生成能力,随后详细讲解如何有效利用此功能,并通过步骤拆解,帮助用户掌握操作过程。最后,会分析该功能的适用场景与潜在局限,以便用户能更全面地理解和运用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Deep…

      2026年9月26日
      100
    • 优化VSCode远程SSH开发体验与高性能扩展加载方案

      通过优化SSH连接复用、按需加载扩展、预启动远程服务及本地协同调优,可显著提升VSCode远程开发体验。具体包括:配置ControlMaster实现连接共享,减少重复认证;使用高效加密算法加快传输;通过extensionKind分离本地与远程扩展,降低远程负载;设置VSCODE_AGENT_FOLD…

      2026年9月26日
      000
    • 如何利用Nginx日志进行安全监控

      如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控

      保障网站和应用安全,Nginx日志安全监控至关重要。本文将详细介绍关键步骤和最佳实践。 一、Nginx日志配置与启用 默认配置: Nginx通常已启用访问日志和错误日志记录。请确保日志文件配置正确并妥善存储。日志格式: 建议使用标准日志格式,方便后续分析。例如: log_format main ‘$…

      2026年9月26日 • 用户投稿
      000
    • 构建健壮的Java用户输入:Scanner整数解析与异常捕获

      构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获

      本文深入探讨了Java Scanner在获取整数输入时,当用户输入非整数数据可能引发的InputMismatchException。我们将解释此异常的产生机制,并提供一种健壮的解决方案:通过结合try-catch语句有效捕获并处理该异常,从而避免程序崩溃,提升用户交互的稳定性与友好性。 1. Jav…

      2026年9月26日 • 用户投稿
      000
    • sublime怎么配置golang build system_sublime Golang Build System配置

      sublime怎么配置golang build system_sublime Golang Build System配置sublime怎么配置golang build system_sublime Golang Build System配置sublime怎么配置golang build system_sublime Golang Build System配置sublime怎么配置golang build system_sublime Golang Build System配置

      首先确保Go环境已安装并可用,然后在Sublime Text中创建自定义构建系统:通过Tools → Build System → New Build System添加支持go run、go build和gofmt的JSON配置,保存为Go.sublime-build至User目录;之后在.go文件…

      2026年9月26日 • 用户投稿
      100
    • 利好!TikTokShop欧洲市场入驻标准更新

      利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新

      近日,tiktokshop跨境电商针对欧洲市场释放利好信号!英国、西班牙、德国、意大利、法国欧洲五国跨境自运营(pop)模式,入驻标准更新及商家扶持新政策迎来官宣。 最新招商政策中,新商的调整核心在于,商家的第三方电商平台运营经验由【必填】调整为【选填】。同时,TikTokShop美区重点商家、有亚…

      2026年9月26日 • 用户投稿
      000
    • sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用

      sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用

      制作Sublime Text绿色版只需下载zip包并解压,然后在安装目录内创建“Data”文件夹,启动后所有配置和插件将自动存入该文件夹,实现便携化。 在Windows下制作Sublime Text的免安装绿色版,其实比你想象的要简单直接得多。核心思路就是让Sublime Text把它的所有配置、插…

      2026年9月26日 • 用户投稿
      100
    • VS Code工作台定制:活动栏与面板可见性配置指南

      隐藏活动栏可通过命令面板执行“View: Toggle Activity Bar Visibility”或设置”workbench.activityBar.visible”: false;2. 面板可用Ctrl+J切换显示,通过”workbench.panel.d…

      2026年9月26日
      000
    • 怎么让豆包AI生成Python数据可视化代码

      怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码

      明确需求、指定图表类型和库、提供数据结构或示例,能高效让豆包ai生成python可视化代码。1. 先说明要画什么图,如“柱状图”;2. 指定用哪个库,如matplotlib或seaborn;3. 提供数据结构或部分数据;4. 检查生成代码是否完整,必要时补充导入语句或显示命令。 ☞☞☞AI 智能聊天…

      2026年9月26日 • 用户投稿
      000
    • 京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

      京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

      “网购时绑定新银行卡会不会被盗刷?””信用卡在平台消费是否存在风险?”随着京东等电商平台支付场景的不断拓展,用户对支付安全的关注度持续攀升。本文深入剖析京东新卡支付与信用卡支付的安全机制,用技术逻辑和平台规则消除你的顾虑。 一、京东新卡支付安全机制解析 1. 什么是京东新卡支付? 当用户首次在京东使…

      2026年9月26日 • 用户投稿
      000
    • Tomcat日志中常见的性能瓶颈是什么

      在tomcat日志中,常见的性能瓶颈主要包括以下几个方面: 线程数配置不当: 问题描述:Tomcat的线程数配置不合理可能导致请求堆积或线程资源浪费。如果线程数过少,可能无法处理高并发请求,导致请求延迟增加。相反,线程数过多可能导致频繁的上下文切换和资源竞争,影响性能。解决方法:根据服务器的硬件资源…

      2026年9月26日
      000
    • 如何在Java中使用protected修饰符

      protected成员可在同类、同包及其他包的子类中访问,主要用于继承;子类不能通过父类实例访问其protected成员,只能继承访问。 在Java中,protected 是一种访问修饰符,用于控制类成员(字段、方法、构造器或内部类)的可见性。它比 private 更宽松,但比 public 更严格…

      2026年9月26日
      100
    • 360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

      360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

      360极速浏览器下载失败可尝试关闭下载加速模块、调整IE安全设置、切换默认下载工具、更新浏览器或使用IDM等第三方工具解决。 如果您在使用360极速浏览器下载文件时,发现下载任务频繁中断或直接失败,可能是由于浏览器设置、网络环境或安全策略限制所致。以下是针对此问题的详细排查与解决方法。 本文运行环境…

      2026年9月26日 • 用户投稿
      200
    • 雷神 911 主机如何测试 M.2 接口?带宽性能评估​

      雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​

      要测试雷神 911 主机 m.2 接口的带宽性能,首先确认其支持的协议(pcie 或 sata)及规格,可查阅主板说明书或使用硬件检测工具;准备 m.2 ssd、最新驱动、windows 10/11 系统及测试软件如 crystaldiskmark 和 as ssd benchmark;运行测试并记…

      2026年9月26日 • 用户投稿
      000

    发表回复

    登录后才能评论
    关注微信