反应问题:我尝试在上传文件时设置文件数据状态,但它不起作用
React Problem : I tried file data set in state when upload file, but it isn't work
首先,我不是英语母语。所以,我的句子可能有语法错误或者难以表达意思。
我有一个带有 Laravel 和 Axios 的 React 项目。我想在我的服务器上上传图像数据。因此,我尝试在上传文件时将文件数据设置为跟随 的状态,但它不起作用。
我想知道它不起作用的原因。
这是我的一些代码。
import Axios from 'axios';
import React, { Component } from 'react';
class Register extends Component {
constructor() {
super();
this.state = {
name: '',
email: '',
password: '',
password_confirmation: '',
profile_picture: null,
errors: [],
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.hasErrorFor = this.hasErrorFor.bind(this);
this.renderErrorFor = this.renderErrorFor.bind(this);
}
handleChange(event) {
if(event.target.name.match('profile_picture')) {
// when input profile picture
this.setState({
[event.target.name]: event.target.files[0],
});
console.log(event.target.files[0]);
} else {
// when input text values
this.setState({
[event.target.name]: event.target.value,
});
}
console.log(this.state);
}
handleSubmit(event) {
// submit event
}
hasErrorFor(field) {
// detect error
}
renderErrorFor(field) {
// render error message
}
render() {
return (
<div className="container">
<div className="row justify-content-center">
<div className="col-md-8">
<div className="card">
<div className="card-header">Register</div>
<div className="card-body">
<form
action="/api/register"
method="post"
encType='application/x-www-form-urlencoded'
onSubmit={this.handleSubmit}
>
<div className="form-group">
// input name
</div>
<div className="form-group">
// input email
</div>
<div className="form-group">
// input password
</div>
<div className="form-group">
// input password confirmation
</div>
<div className="form-group">
<label htmlFor="profile_picture">Profile Picture</label>
<input
id="profile_picture"
type="file"
name="profile_picture"
className='form-control-file'
onChange={this.handleChange}
/>
{this.renderErrorFor('profile_picture')}
</div>
<button className="btn btn-primary">SUBMIT</button>
</form>
</div>
</div>
</div>
</div>
</div>
);
}
}
export default Register;
And here is result of this code.
我除了上传文件时设置了状态,但是文件没有设置状态。
您在 setState 方法之后立即编写了 console.log(),因为 setState 是一个异步方法,在 java 脚本运行您的 console.log 时,它将向您显示显然未设置图像对象的先前状态,为此您应该将控制台放在 setState 的第二个参数中,这是一个回调函数。
this.setState({[event.target.name]: event.target.files[0]},()=>console.log(this.state));
首先,我不是英语母语。所以,我的句子可能有语法错误或者难以表达意思。
我有一个带有 Laravel 和 Axios 的 React 项目。我想在我的服务器上上传图像数据。因此,我尝试在上传文件时将文件数据设置为跟随
我想知道它不起作用的原因。
这是我的一些代码。
import Axios from 'axios';
import React, { Component } from 'react';
class Register extends Component {
constructor() {
super();
this.state = {
name: '',
email: '',
password: '',
password_confirmation: '',
profile_picture: null,
errors: [],
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.hasErrorFor = this.hasErrorFor.bind(this);
this.renderErrorFor = this.renderErrorFor.bind(this);
}
handleChange(event) {
if(event.target.name.match('profile_picture')) {
// when input profile picture
this.setState({
[event.target.name]: event.target.files[0],
});
console.log(event.target.files[0]);
} else {
// when input text values
this.setState({
[event.target.name]: event.target.value,
});
}
console.log(this.state);
}
handleSubmit(event) {
// submit event
}
hasErrorFor(field) {
// detect error
}
renderErrorFor(field) {
// render error message
}
render() {
return (
<div className="container">
<div className="row justify-content-center">
<div className="col-md-8">
<div className="card">
<div className="card-header">Register</div>
<div className="card-body">
<form
action="/api/register"
method="post"
encType='application/x-www-form-urlencoded'
onSubmit={this.handleSubmit}
>
<div className="form-group">
// input name
</div>
<div className="form-group">
// input email
</div>
<div className="form-group">
// input password
</div>
<div className="form-group">
// input password confirmation
</div>
<div className="form-group">
<label htmlFor="profile_picture">Profile Picture</label>
<input
id="profile_picture"
type="file"
name="profile_picture"
className='form-control-file'
onChange={this.handleChange}
/>
{this.renderErrorFor('profile_picture')}
</div>
<button className="btn btn-primary">SUBMIT</button>
</form>
</div>
</div>
</div>
</div>
</div>
);
}
}
export default Register;
And here is result of this code.
我除了上传文件时设置了状态,但是文件没有设置状态。
您在 setState 方法之后立即编写了 console.log(),因为 setState 是一个异步方法,在 java 脚本运行您的 console.log 时,它将向您显示显然未设置图像对象的先前状态,为此您应该将控制台放在 setState 的第二个参数中,这是一个回调函数。
this.setState({[event.target.name]: event.target.files[0]},()=>console.log(this.state));