javascript - 使用 React,如何将点击事件附加到类或 ID?
问题描述
我有一个包含数百个<circle>
元素的 SVG,我想将点击事件附加到这些元素上。使用 jQuery,这真的很容易:
$('circle').on('click', function(e) {
alert('clicked');
});
我如何在 React 中做到这一点?
通常我会直接将事件侦听器附加到元素:
<circle onClick={(e) => handleClick()} />
鉴于有数百个元素,这将是非常乏味的。有没有办法可以将单个事件侦听器附加到所有圆形元素?
我的工作解决方案使用 vanilla JS,但它涉及直接与 DOM 交互:
useEffect(() => {
const circles = document.querySelectorAll('circle');
for (const trigger of circles) {
trigger.addEventListener('click', (e) => {
alert('clicked');
});
}
}, []);
我没有收到任何错误,这确实有效,但感觉不像 React。我错过了什么吗?有更好的方法吗?
解决方案
我不认为在这种情况下你应该担心 vanilla JS DOM 操作,但如果你想让它反应式,你可以使用Context。
首先定义你的上下文:
const CircleContext = React.createContext();
然后包装您的应用程序(或将使用圆圈的应用程序的一部分)CircleContext.Provider
并将其值设置为所需的回调:
function App() {
return (
<CircleContext.Provider
value={e => {
console.log("Circle clicked!");
}}
>
<div className="App">
<Circle />
</div>
</CircleContext.Provider>
);
}
并在您的圆形组件中使用该上下文(我使用了useContext
钩子):
function Circle() {
const context = useContext(CircleContext);
return <button onClick={context}>My Button</button>;
}
通过这种实现,每个组件都将Circle
使用.onClick
CircleContext.Provider
示例代码。
推荐阅读
- c# - Visual Studio 2017 c# setup 项目配置文件路径
- scala - 泛型函数中的隐式转换
- php - 我想在 .htaccess 文件中重写一个 url
- python - Merge 2 pandas dataframe using similar data
- amazon-web-services - 用于微服务的私有子网 ecs 连接上负载均衡器的 AWS API 网关
- python - 使用 Python 正则表达式从面试记录中提取文本
- c++ - 通过名称 cpp 捕获特定异常
- networking - netlink_broadcast 失败,返回值 -3
- telegraf-output-plugins - Telegraf(刻度堆栈)
- php - 防火墙和网站上的 ssl 是否相互冲突