javascript - 在页面渲染后添加事件 React
问题描述
我有一种情况,在页面渲染后从服务器加载 SVG 之后,我需要向其元素添加某些事件。假设单击矩形后会显示警报。
import React, { useEffect, useState } from 'react';
import css from "./room-plan.module.css";
import { Button } from "../../components";
export default function RoomPlan({ svg }) {
useEffect(() => {
var elements = Array.from(document.querySelectorAll('svg rect'));
elements.forEach(function(el) {
el.addEventListener("click", alert("hello"));
})
}, [])
return (
<div>
<h2 className={css.labels}>Select desk</h2>
<div id={css.roomPlan} dangerouslySetInnerHTML={{__html: svg, }}></div>
<div className={css.bookingButtons}>
<Button>CANCEL</Button>
<Button>BOOK DESK</Button>
</div>
</div>
);
}
但它完全不起作用。只是没有在元素上添加任何事件。因为当它寻找所需的选择器时它还不存在。
解决方案
上面的答案是正确的,但是请确保在 useEffect 中包含一个返回函数, 以便在组件卸载期间进行清理
useEffect(() => {
var elements = Array.from(document.querySelectorAll('svg rect'));
const listener = () => alert("hello");
if(elements) {
elements.forEach(function(el) {
el.addEventListener("click", listener);
})
}
return function cleanup(){
if(elements) {
elements.forEach(function(el) {
el.removeEventListener("click", listener);
})
}
}
},[])
推荐阅读
- javascript - 如何在现有列表中显示搜索结果
- visual-studio-2019 - 服务结构未显示 .net core 3.1
- c++ - 同时使用多处理和多线程
- r - 在 Shinyapps.io 上发布时,Firefox Leaflet 在 Shiny App 默认页面中不显示地图形状(其他浏览器工作正常)
- android - 获取有关在较新的 Android 上使用 retrofit2 的数据的问题
- javascript - 从数组中获取对象标签并设置为 aria-label
- string - 使用while循环替换Powershell多个字符串
- javascript - Discord.js Music Bot:如何创建一个命令将整个歌曲播放列表添加到队列中
- javascript - 在 React Naive EXPO 中打印图像(屏幕截图)
- css - MaterialUI/CSS 创建这个盒子