React问题:上传文件时,我尝试将文件数据设置为状态,但是它不起作用

时间:2019-05-13 09:05:52

标签: javascript reactjs file multipartform-data form-data

首先,我不是英国人。因此,我的句子在语法上可能是错误的,或者可能难以传达含义。

我有一个使用Laravel和Axios的React项目。我想在服务器上上传图像数据。因此,我尝试在上传文件时遵循this document的状态下设置文件数据,但是它不起作用。

我想知道为什么它不起作用。

这是我的一些代码。

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.

我在上传文件时将上传文件设置为状态,但文件未处于状态。

1 个答案:

答案 0 :(得分:1)

您已经在setState方法之后立即编写了console.log(),因为setState是一个异步方法,并且在Java脚本运行console.log时它会向您显示先前的状态,其中显然没有设置图像对象,为此,您应将控制台放在setState的第二个参数中,该参数是一个回调函数。

this.setState({[event.target.name]: event.target.files[0]},()=>console.log(this.state));