javascript - 如何通过 React 类中的动态元素调用原生 JS 函数?
问题描述
我正在创建一个带有图像上传组件的反应应用程序。该组件有一个文件输入字段,允许多个文件上传功能。我创建了一个函数来创建动态图像元素以在应用程序组件中显示每个上传的图像。我为此使用 FileReader()。
我为每个图像创建一个动态关闭按钮以删除图像。为此,我通过设置属性 onclick = "removeImage()" 创建动态关闭按钮,如下所示。问题是,当我单击关闭按钮时,控制台显示"removeImage is not defined
“
我该如何解决这个问题?
反应组件
//remove image element
function removeImage(domId) {
document.getElementById(domId).remove();
}
class CreatePost extends Component {
constructor(props) {
super(props);
this.state = {
postText: '',
}
}
getImage = (e) => {
for (let i = 0; i < e.target.files.length; i++) {
//create main div
var mainDiv = document.createElement("div");
mainDiv.setAttribute("class", "imgMain");
mainDiv.setAttribute("id", `image${i}`);
//create remove button
var closeButoon = document.createElement("span");
closeButoon.setAttribute("class", "closeImage");
//set removeImage function to onclick attribute
closeButoon.setAttribute("onClick", "removeImage(image"+i+")");
closeButoon.innerText="X";
mainDiv.appendChild(closeButoon);
//add file reader part
var file = e.target.files[i];
var reader = new FileReader();
if (fileType === "image") {
let imgDiv = document.createElement("img")
imgDiv.setAttribute("class", "imageOne")
if (file) {
reader.onload = function (e) {
imgDiv.setAttribute('src', e.target.result)
};
reader.readAsDataURL(file);
}
mainDiv.appendChild(imgDiv);
document.getElementById("imageLoader").appendChild(mainDiv)
}
}
}
render() {
return (
<>
<input
type="file"
id="inputImage"
name="inputImage"
accept="image/*"
onChange={this.getImage}
multiple
/>
<div className="imageLoader" id="imageLoader"></div>
</>
)
}
};
export default CreatePost;
解决方案
这是因为您将 onClick 处理程序设置为字符串的方式。该函数的范围是为了成像,需要当场引用。
closeButoon.onclick = () => removeImage(`image${i}`);
推荐阅读
- python-3.x - 如何在 MS Office 组织中找到“报告至”的电子邮件地址?
- flutter - 复杂的 JSON 映射
- xml - Google ExportSheetData:导出具有多个属性列的 XML
- unique - 八度音阶中唯一(符号)的问题
- mysql - MySQL按A分区行,在组内按B排序,然后按每组第一行的C对所有这些组进行排序
- json - 将参数解析为 jq 过滤器
- excel - 使用 For Each 结构对 UserForm 中的控件进行排序。排序结束时出错
- java - 带有特殊字符的 Liquibase MS SQL 插入
- c# - 无法从“Microsoft.AspNetCore.Identity.IdentityResult”转换为“GdscBackend.Authentication.User”
- elasticsearch - 使用累积过滤器设计 ElasticSearch 查询,但过滤器内的选项具有“或”条件