javascript - 在 react.js 中克隆后内联事件处理程序不起作用
问题描述
大家好,我在尝试克隆反应组件(克隆反应组件的父 div)时观察到一个问题,这使得内联事件处理程序以某种方式被禁用/删除,并且无法从克隆的组件中触发任何事件,但原始组件工作正常。据我搜索,javascript cloneNode 方法应该适用于内联事件处理程序,它也适用于纯 html 和 javascript,但不知何故我似乎无法让它在 react.js 中工作
index.js
import React from 'react';
import ReactDOM from 'react-dom';
class Football extends React.Component {
shoot() {
alert("Great Shot!");
}
render() {
return (
<button onClick={this.shoot}>Take the shot!</button>
);
}
}
ReactDOM.render(<Football />, document.getElementById('root'));
索引.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport"
content="width=device-width, initial-scale=1" />
<title>React App</title>
</head>
<body>
<div id="root"></div>
<button "onclick=CloneIt()">CloneIt</button>
<script>
function CloneIt(){
var elem=document.getElementById("mainComp").cloneNode(true);
document.body.appendChild(elem);
}
</script>
</body>
</html>
解决方案
React 实际上并没有创建内联事件,即使你是内联编写事件。
JSX 不是真正的 html,它只是React.createElement
被 babel 转换为 react 的语法糖。
所以你的内联 onClick 事件实际上变成props.onClick
了 props 对象的一个属性,作为第二个参数传递给 React.createElement。
内部反应使用addEventListener
.
当你克隆一个 React 元素并将其附加到 DOM 时,新附加的元素不会有任何指向反应组件的链接。因此,如果您希望 onClick 事件像与原始 DOM 一样工作,您需要使用 react 组件对元素进行水合。
var elem = document.getElementById("root").cloneNode(true);
document.body.appendChild(elem);
ReactDOM.hydrate(<Football />, elem);
推荐阅读
- java - 在另一个公共方法中调用同一类的公共方法两次
- quarkus - 本机模式下的 GraalVM Quarkus 语言环境
- apache-flink - flink作业执行过程中数据接收阶段是否需要很多时间?
- javascript - 如何使用滚动条将 div 与另一个 div 右对齐,以便第一个 div 与不包括滚动条的内容对齐
- azure - 如何更改任务的优先级?
- java - 如何将 JavaFX gradle 项目导出为独立的可执行文件进行部署?
- sql - 使用派生字段分组查询
- c++ - 如何为向量创建 getter 和 setter?
- python - 多任务学习 keras(将两个任务集成在一个多问一个中)
- node.js - SendGrid/Outlook 接收 50% 的电子邮件