如何通过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)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    Playwright:Web UI 自动化测试框架全面概述
    上一篇 2026年5月10日 10:30:17
    C++如何实现生产者消费者模型_C++ 生产者消费者实现方法
    下一篇 2026年5月10日 10:30:20

    相关推荐

    • 如何用HTML制作一个简单的图片轮播图?

      如何用HTML制作一个简单的图片轮播图?如何用HTML制作一个简单的图片轮播图?如何用HTML制作一个简单的图片轮播图?如何用HTML制作一个简单的图片轮播图?

      使用 HTML、CSS 和 JavaScript 创建一个图片轮播图,涉及以下步骤:HTML 结构:定义容器、图片列表和轮播项。CSS 样式:设置容器、图片布局和过渡动画。JavaScript 逻辑:使用定时器和元素定位控制图片轮播。 如何用HTML制作一个简单的图片轮播图? 这问题问得妙啊,看起来…

      2026年5月10日 用户投稿
      000
    • C++如何实现生产者消费者模型_C++ 生产者消费者实现方法

      生产者消费者模型通过互斥锁和条件变量协调线程,使用固定大小缓冲区实现数据的安全生产和消费,核心是利用条件变量等待非满非空状态并通知唤醒线程。 生产者消费者模型是多线程编程中的经典问题,用于解决生产数据和消费数据的速度不匹配问题。在C++中,通常使用互斥锁(std::mutex)、条件变量(std::…

      2026年5月10日
      000
    • Playwright:Web UI 自动化测试框架全面概述

      playwright是微软开发的web ui自动化测试框架。 它旨在提供一个跨平台、跨语言、跨浏览器的自动化测试框架,同时也支持移动浏览器。 如其官方主页所述: 自动等待、页面元素智能断言、执行追踪等功能,在处理网页不稳定方面非常有效。它在与运行测试的进程不同的进程中控制浏览器,消除了进程内测试运行…

      2026年5月10日
      000
    • 生日蛋糕蜡烛 – HackerRank 问题解决

      HackerRank 生日蛋糕蜡烛问题详解及解法 本文将讲解 HackerRank 上的“生日蛋糕蜡烛”算法题,该题考察循环和数组操作。我们将学习如何分析问题,并给出 Python 和 C 语言的解决方案。 问题描述 你需要为孩子准备生日蛋糕,蛋糕上每根蜡烛代表孩子一岁的年龄。孩子只能吹灭最高的蜡烛…

      2026年5月10日
      000
    • 浅谈使用HTML空链接的技巧

      这次给大家带来浅谈使用html空链接的技巧,使用html空链接的注意事项有哪些,下面就是实战案例,一起来看一下。 空链接: 就是没有目标端点的链接。 格式显示内容 空连接的作用 立即学习“前端免费学习笔记(深入)”; 1.设为首页 onclick=”this.style.behavior…

      用户投稿 2026年5月10日
      000
    • 在 Rails 应用中嵌入 PDF 文件指南

      在 Rails 应用中嵌入 PDF 文件指南在 Rails 应用中嵌入 PDF 文件指南在 Rails 应用中嵌入 PDF 文件指南在 Rails 应用中嵌入 PDF 文件指南

      本教程详细介绍了如何在 Ruby on Rails 应用程序中将 PDF 文件嵌入到网页中,而非仅仅提供下载。文章核心内容围绕使用 HTML 标签,并强调结合 Rails 的 asset_path 辅助方法来处理资产管道中预编译的文件名,同时提供硬编码路径的备选方案及其所需的配置。 理解需求:嵌入与…

      2026年5月10日 用户投稿
      000
    • Flet框架中正确显示AlertDialog的教程

      flet框架中,正确显示alertdialog的关键在于使用e.page.dialog属性配合await e.page.update_async()方法。本文将详细介绍如何创建并异步显示模态对话框,避免常见的显示问题,确保用户界面交互的流畅性和准确性,并通过示例代码演示其具体实现。 在Flet应用开…

      2026年5月10日
      100
    • JS如何实现元素呼吸效果 3种CSS动画打造呼吸式特效

      JS如何实现元素呼吸效果 3种CSS动画打造呼吸式特效JS如何实现元素呼吸效果 3种CSS动画打造呼吸式特效JS如何实现元素呼吸效果 3种CSS动画打造呼吸式特效JS如何实现元素呼吸效果 3种CSS动画打造呼吸式特效

      css实现元素呼吸效果有3种方法:1.使用scale动画,通过transform:scale()实现缩放;2.结合opacity动画,在缩放的同时改变透明度;3.用多关键帧控制更复杂的效果。调整速度可修改animation时间值,增大scale数值提升幅度。多数情况下css动画性能良好,但大量复杂动…

      2026年5月10日 用户投稿
      000
    • javascript的ES6是什么_它带来了哪些新特性?

      ES6是JavaScript的重大标准升级,核心特性包括:1. let/const提供块级作用域;2. 箭头函数简化语法且不绑定this;3. 模板字符串支持多行与变量插值;4. 解构赋值便捷提取数据;5. import/export实现模块化管理。 ES6(全称 ECMAScript 2015)是…

      2026年5月10日
      100
    • CSS技巧:在不移动内容的情况下实现字体加粗与徽章共存

      本文探讨了在web开发中,如何通过css技巧在不引起内容位移的情况下,实现点击元素时字体加粗效果,并同时优雅地集成一个徽章。核心策略是利用`color: transparent`和`::before`伪元素进行内容层的分离与切换,确保元素在不同状态下始终占据相同的空间,从而避免布局抖动。 背景问题:…

      2026年5月10日
      000
    • html网页缓存数据怎样手动删除_html网页缓存数据手动删除的实用方法

      清除浏览器缓存可解决网页加载异常问题,首先可通过浏览器设置中的“清除浏览数据”功能删除缓存文件;其次使用Ctrl+F5或Command+Shift+R快捷键强制刷新页面以绕过缓存;再者在开发者工具的Network选项卡中勾选“Disable cache”实现调试时禁用缓存;最后可手动删除系统中浏览器…

      2026年5月10日
      200
    • php查询代码怎么写_php数据库查询语句编写技巧与实例

      在PHP中进行数据库查询,最常用的方式是使用MySQLi或PDO扩展连接MySQL数据库。下面介绍基本的查询代码写法、编写技巧以及实用示例,帮助你高效安全地操作数据库。 1. 使用MySQLi进行查询(面向对象方式) 这是较为推荐的方式,适合大多数中小型项目。 // 创建连接$host = ‘loc…

      2026年5月10日
      000
    • 如何用JS动态创建和修改HTML路由视图_JS动态创建和修改HTML路由视图教程

      如何用JS动态创建和修改HTML路由视图_JS动态创建和修改HTML路由视图教程如何用JS动态创建和修改HTML路由视图_JS动态创建和修改HTML路由视图教程如何用JS动态创建和修改HTML路由视图_JS动态创建和修改HTML路由视图教程如何用JS动态创建和修改HTML路由视图_JS动态创建和修改HTML路由视图教程

      通过监听 URL 变化实现前端路由,使用 hashchange 事件或 History API 动态更新视图。定义路由映射表,根据路径渲染对应内容,支持 HTML 字符串插入或动态创建 DOM 元素。可扩展参数化路由,如匹配 #/user/123 提取用户 ID。初始化视图并处理默认路径与 404,…

      2026年5月10日 用户投稿
      000
    • php使用什么类进行HTTP请求_php使用Guzzle发送请求的示例

      使用Guzzle可简化PHP中HTTP请求操作。首先通过Composer安装Guzzle:composer require guzzlehttp/guzzle。接着创建客户端实例发送GET请求获取数据,如$client = new GuzzleHttpClient(); $response = $c…

      2026年5月10日
      000
    • html如何弄图片列表_制作HTML图片列表展示效果【展示】

      可通过HTML结合CSS用五种方法实现网页图片列表:一、无序列表+Flex/Float横向排列;二、定义列表配图文说明;三、表格严格对齐;四、Flexbox响应式换行;五、CSS Grid二维网格布局。 如果您希望在网页中以列表形式展示多张图片,可以通过HTML结合CSS实现整齐美观的图片列表效果。…

      2026年5月10日
      000
    • C++中的SFINAE是什么_C++模板编程高级技巧与SFINAE应用

      SFINAE允许模板替换失败时不报错,仅移除无效候选,支持编译期类型检测与重载选择,如通过decltype和enable_if实现条件编译,是模板元编程基础。 SFINAE 是 “Substitution Failure Is Not An Error” 的缩写,这是 C++…

      2026年5月10日
      000
    • 如何在Golang中实现服务降级_Golang 微服务降级处理技巧

      服务降级通过超时控制、熔断机制、备用逻辑和动态配置保障系统稳定性。在Golang中,使用context.WithTimeout防止阻塞,结合sony/gobreaker实现熔断,连续失败后自动切换降级逻辑;对非核心功能返回缓存数据或默认值,并通过配置中心动态开关降级策略,确保主流程可用。 服务降级是…

      2026年5月10日
      000
    • Go语言并发执行外部命令:构建高效协程池的最佳实践

      本文详细探讨了在Go语言中高效、可控地并发执行大量外部命令的策略。针对简单`go`关键字导致的问题和传统`WaitGroup`批处理的局限性,文章提出并详细阐述了基于工作池(Worker Pool)模式的解决方案,通过结合通道(channel)进行任务分发和`sync.WaitGroup`进行任务完…

      2026年5月10日
      000
    • Golang反射操作结构体标签与验证实践

      首先掌握结构体标签语法,其以键值对形式附加在字段后,如json:”name”;接着通过反射reflect.TypeOf获取类型信息,遍历字段并用field.Tag.Get(“key”)提取标签值;然后实现通用验证逻辑,根据validate标签的requ…

      2026年5月10日
      000
    • 使用 Laravel 通过链接播放数据库中的视频

      本文旨在指导开发者如何使用 Laravel 框架,通过点击链接播放存储在数据库中的视频。我们将创建一个新的路由来处理视频播放请求,并将视频 URL 传递给该路由,最终在一个新的 Blade 视图中使用 HTML5 的 标签来展示视频。 步骤 1:创建新的路由 首先,我们需要创建一个新的路由来处理视频…

      2026年5月10日
      000

    发表回复

    登录后才能评论
    关注微信