javascript - 如何通过 onChange 函数将值存储在全局变量中?
问题描述
我需要从 onChange 函数访问返回的值,但它没有读取任何内容,因为它显然没有正确存储。这是我的代码:
HTML:
<input type="file" accept="image/*" name="UploadBox" className="custom-file-input" id="UploadBox" onChange={this.onChange} />
JS:
onChange = (e) => {
this.setState({
selectedImage: e.target.files[0]
})
let files = e.target.files;
let file = e.target.files[0];
if (files.length > 0 && file) {
this.getBase64(files[0]);
}
}
getBase64(file) {
let reader = new FileReader();
console.log(file);
reader.onload = function () {
console.log(reader.result);
let binaryString = reader.result;
let btoaString = btoa(binaryString);
//console.log(btoaString);
return binaryString;
}
reader.readAsDataURL(file);
reader.onerror = function (error) {
console.log('Error: ', error);
}
}
进一步 On Down 这里是我需要在 imageBase64Function 变量中存储返回值的地方:
let imageBase64Function = this.getBase64();
当我执行 reader.result 的 console.log 时,我得到了正确的 base64 信息。但我需要将它存储在 imageBase64 变量中。我试过研究全局变量和赋值,但我知道我做错了什么。非常感谢任何帮助,谢谢!
编辑:在尝试 setState 并通过删除开头的元数据使用 base64 字符串后解决
constructor (props) {
super(props);
this.state = {
selectedImage: null,
errors: {}
}
this.onChange = this.onChange.bind(this);
this.getBase64 = this.getBase64.bind(this);
}
onChange = (e) => {
this.setState({
selectedImage: e.target.files[0]
})
let files = e.target.files;
let file = e.target.files[0];
if (files.length > 0 && file) {
this.getBase64(files[0]);
}
}
getBase64(file) {
let reader = new FileReader();
console.log(file);
reader.onload = function () {
console.log(reader.result);
let binaryString = reader.result;
let base64OrigString = binaryString.split('base64,');
let base64Split = base64OrigString[1];
//return binaryString;
this.setState({selectedImage: base64Split})
}.bind(this)
reader.readAsDataURL(file);
reader.onerror = function (error) {
console.log('Error: ', error);
}
}
解决方案
binaryString
您可以调用,而不是返回this.setState({ selectedImage: binaryString })
。正如您在测试中发现的那样,您需要 unbind(this)
以便this.setState
可以从嵌套函数中调用它。另一种可能的解决方案是保持绑定不变,但更改调用匿名reader.onload
函数的方式。这将保留外部this
并允许您this.state
从块内访问。
reader.onload = () => { … }
推荐阅读
- sql - PostgreSQL 更新未正确更新
- django - 发生 JSONSchemaValidationError 时,如何在 Django 管理中的模型字段上方显示自定义错误消息?
- cups - lp:不支持的文档格式“image/png”
- c# - 在 C# 桌面应用程序中使用 OpenVPN 实现拆分和隧道
- c# - 有没有一种解决方案可以在 C# 中同时由多个应用程序保存在一个文件上?
- typescript - 为什么具有通用参数的函数会破坏 Typescript 推断
- python - 如何在 statsmodels 中获取 VAR(1) 模型的方差?
- azure-active-directory - ADFS 灾难恢复计划
- bash - shell中IF语句中两个变量之间的正斜杠是什么意思?
- material-ui - 是否有计划在 Material UI xGrid 中实现多选(通过 Shift 单击)