解决react项目中event对象打印的值为null

React合成事件详解
本文深入解析React中合成事件的工作原理,解释为何在控制台上显示的事件属性值为null,以及如何通过调用persist方法保留事件属性,便于调试。了解React事件处理机制,提升开发效率。

在做react项目的时候,发现event打印到控制台上的属性值均为null,如下图所示:

 

觉得挺奇怪的,怎么可能是null呢,但是在方法里面竟然又能获取到值,这样对调试很不利,有木有?

       其实真正的原因是因为React里面的事件并不是真实的DOM事件,而是自己在原生DOM事件上进行了封装与合成。
合成事件是由事件池来管理的,合成事件对象可能会被重用,合成事件的所有属性也会随之被清空。所以当在异步处理程序(如setTimeout等等)中或者浏览器控制台中去访问合成事件的属性,默认react 会把其属性全部设为null。
       如果就想在控制台输出打印结果怎么办?有没有解决方案呢?答案当然是有的!可以在console.log()前面添加event.persist()或者e..persist(),其实就是将当前的合成事件从事件池中移除了,所以能够继续保有对该事件的引用以及仍然能访问该事件的属性。

### 如何在 React 前端项目中集成 ui.Perfetto #### 集成方法与实现路径 将 `ui.Perfetto` 嵌套到 React 项目中,可以通过以下方式实现功能模块化和交互设计。 #### 数据导入与解析 React 项目可以提供文件上传组件以支持用户导入 trace 文件。通过使用 HTML 的 `<input type="file">` 元素结合 React 状态管理,可以读取并解析 JSON 或 Protocol Buffers 格式的 trace 数据[^1]。 ```javascript import React, { useState } from 'react'; function TraceUploader({ onTraceLoaded }) { const [file, setFile] = useState(null); const handleFileChange = (event) => { const selectedFile = event.target.files[0]; if (selectedFile) { const reader = new FileReader(); reader.onload = (e) => { try { const jsonData = JSON.parse(e.target.result); onTraceLoaded(jsonData); } catch (error) { console.error("Failed to parse JSON:", error); } }; reader.readAsText(selectedFile); } }; return ( <div> <input type="file" onChange={handleFileChange} /> </div> ); } ``` #### SQL 查询功能集成 为了支持 SQL 查询功能,可以在 React 中创建一个输入框组件用于接收用户的查询语句,并通过后端服务或直接在前端解析数据来执行查询。例如,使用 JavaScript 实现简单的 SQL 解析逻辑,筛选出符合条件的事件并按耗时降序排列。 ```javascript function SqlQuery({ data, onQueryResult }) { const [query, setQuery] = useState(""); const handleQueryChange = (event) => { setQuery(event.target.value); }; const executeQuery = () => { const filteredData = data.filter((item) => item.name === "ParallelMLP.forward" && item.subEvent === "RowParallelLinear.forward" ).sort((a, b) => b.duration - a.duration); onQueryResult(filteredData); }; return ( <div> <textarea value={query} onChange={handleQueryChange} /> <button onClick={executeQuery}>Execute Query</button> </div> ); } ``` #### Timeline 渲染 利用 React 和 D3.js 的结合,可以动态生成 timeline 图表。将筛选后的数据传递给 timeline 组件,并根据时间轴渲染各个事件节点[^1]。 ```javascript import * as d3 from "d3"; function Timeline({ data }) { const svgRef = useRef(null); useEffect(() => { const svg = d3.select(svgRef.current), margin = { top: 20, right: 20, bottom: 30, left: 50 }, width = +svg.attr("width") - margin.left - margin.right, height = +svg.attr("height") - margin.top - margin.bottom; const x = d3.scaleTime().range([0, width]), y = d3.scaleLinear().range([height, 0]); svg.append("g") .attr("transform", `translate(${margin.left},${margin.top})`) .call(d3.axisLeft(y)); svg.selectAll(".node") .data(data) .enter() .append("rect") .attr("class", "node") .on("mouseover", (event, d) => highlightNode(d.id)); }, [data]); return <svg ref={svgRef} />; } ``` #### 跨平台兼容性与优化 确保项目在不同浏览器和设备上的兼容性,可以通过使用响应式设计和性能优化技术(如懒加载、代码分割等)提升用户体验[^1]。 ### 示例代码整合 以下是一个完整的示例代码片段,展示如何将上述功能模块化并整合到 React 项目中: ```javascript import React, { useState } from 'react'; import TraceUploader from './TraceUploader'; import SqlQuery from './SqlQuery'; import Timeline from './Timeline'; function PerfettoApp() { const [traceData, setTraceData] = useState(null); const [queryResult, setQueryResult] = useState([]); const handleTraceLoaded = (data) => { setTraceData(data); }; const handleQueryResult = (result) => { setQueryResult(result); }; return ( <div> <h3>Perfetto Integration in React</h3> <TraceUploader onTraceLoaded={handleTraceLoaded} /> {traceData && <SqlQuery data={traceData} onQueryResult={handleQueryResult} />} {queryResult.length > 0 && <Timeline data={queryResult} />} </div> ); } export default PerfettoApp; ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值