How to reset ReactJS file input

后端 未结 10 985
傲寒
傲寒 2020-12-29 00:55

I have file upload input:


And I handle upload t

相关标签:
10条回答
  • 2020-12-29 01:49

    You can also include this in your input element if you know you are not going to be using the built-in file input value at all.

    <input value={""} ... />
    

    This way the value is always reset to the empty string on render and you don't have to include it awkwardly in an onChange function.

    0 讨论(0)
  • 2020-12-29 01:51

    I think you can just clear the input value like this :

    e.target.value = null;
    

    File input cannot be controlled, there is no React specific way to do that.


    Edit For old browsers (<IE11), you can use one of the following techniques.

    See http://jsbin.com/zurudemuma/1/edit?js,output (tested on IE10 & 9)

    0 讨论(0)
  • 2020-12-29 01:52

    Here is my solution using redux form

    class FileInput extends React.Component {
      constructor() {
        super();
    
        this.deleteImage = this.deleteImage.bind(this);
      }
    
      deleteImage() {
        // Just setting input ref value to null did not work well with redux form
        // At the same time just calling on change with nothing didn't do the trick
        // just using onChange does the change in redux form but if you try selecting
        // the same image again it doesn't show in the preview cause the onChange of the
        // input is not called since for the input the value is not changing
        // but for redux form would be.
    
        this.fileInput.value = null;
        this.props.input.onChange();
      }
    
      render() {
        const { input: { onChange, value }, accept, disabled, error } = this.props;
        const { edited } = this.state;
    
        return (
          <div className="file-input-expanded">
            {/* ref and on change are key properties here */}
            <input
              className="hidden"
              type="file"
              onChange={e => onChange(e.target.files[0])}
              multiple={false}
              accept={accept}
              capture
              ref={(input) => { this.fileInput = input; }}
              disabled={disabled}
            />
            {!value ?
              {/* Add button */}
              <Button
                className="btn-link action"
                type="button"
                text="Add Image"
                onPress={() => this.fileInput.click()}
                disabled={disabled}
              />
              :
              <div className="file-input-container">
                <div className="flex-row">
                  {/* Image preview */}
                  <img src={window.URL.createObjectURL(value)} alt="outbound MMS" />
                  <div className="flex-col mg-l-20">
                    {/* This button does de replacing */}
                    <Button
                      type="button"
                      className="btn-link mg-b-10"
                      text="Change Image"
                      onPress={() => this.fileInput.click()}
                      disabled={disabled}
                    />
                    {/* This button is the one that does de deleting */}
                    <Button
                      type="button"
                      className="btn-link delete"
                      text="Delete Image"
                      onPress={this.deleteImage}
                      disabled={disabled}
                    />
                  </div>
                </div>
                {error &&
                  <div className="error-message"> {error}</div>
                }
              </div>
            }
          </div>
        );
      }
    }
    
    FileInput.propTypes = {
      input: object.isRequired,
      accept: string,
      disabled: bool,
      error: string
    };
    
    FileInput.defaultProps = {
      accept: '*',
    };
    
    export default FileInput;
    
    0 讨论(0)
  • 2020-12-29 01:55

    I do it by updating key inside my file input. This will force a re-render and previously selected file will go away.

    <input type="file" key={this.state.inputKey} />
    

    Changing the state inputKey will re-render the component. One way to change the inputKey will be to always set it to Date.now() on click of a button which is supposed to clear the field.

    0 讨论(0)
提交回复
热议问题