So setzen Sie die ReactJS-Dateieingabe zurück

Lesezeit: 4 Minuten

Benutzer-Avatar
Stepan Jakowenko

Ich habe Datei-Upload-Eingabe:

<input onChange={this.getFile} id="fileUpload" type="file" className="upload"/>

Und ich handhabe den Upload so:

getFile(e) {
    e.preventDefault();
    let reader = new FileReader();
    let file = e.target.files[0];
    reader.onloadend = (theFile) => {
        var data = {
            blob: theFile.target.result, name: file.name,
            visitorId:  this.props.socketio.visitorId
        };
        console.log(this.props.socketio);
        this.props.socketio.emit('file-upload', data);
    };
    reader.readAsDataURL(file);
}

Wenn ich dieselbe Datei zweimal hochlade, wird das Upload-Ereignis nicht ausgelöst. Wie kann ich das beheben? Für einfachen js-Code reichte es aus, Folgendes zu tun: this.value = null; im Changehandler. Wie kann ich das mit ReactJS machen?

  • onChange={this.getFile.bind(this)} oder getFile = (e) => {

    – Dmitrij Kowalenko

    12. Februar 2017 um 19:56 Uhr

Benutzer-Avatar
Einfrieren

Ich denke, Sie können den Eingabewert einfach so löschen:

e.target.value = null;

Die Dateieingabe kann nicht kontrolliert werden, dafür gibt es keine React-spezifische Möglichkeit.


Bearbeiten Für alte Browser (

Sehen http://jsbin.com/zurudemuma/1/edit?js, Ausgabe (getestet auf IE10 & 9)

  • genial… 🙂 es hat mir den Tag gerettet

    – Schmutzige Gedanken

    20. Dezember 2017 um 20:35 Uhr

  • Hinweis: Einstellung undefined in Chrome 79 löst diesen Fehler aus: Uncaught DOMException: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string.. Aber null löst den Fehler nicht aus.

    – Mathias

    12. Februar 2020 um 20:56 Uhr


  • Beachten Sie diesbezüglich Browser-Inkompatibilitäten: stackoverflow.com/questions/1703228/…

    – TJ Crowder

    20. August 2020 um 8:50 Uhr

  • Danke @TJCrowder, ich habe meine Antwort aktualisiert. Auch wenn die meisten Websites diese Browser nicht mehr unterstützen, existieren sie immer noch 🙂

    – Einfrieren

    23. August 2020 um 2:47 Uhr


  • für Typoskript ist ein // @ts-ignore erforderlich

    – TacB0sS

    4. Mai 2021 um 22:21 Uhr

Was für mich funktioniert hat, war das Einstellen von a key Attribut auf die Dateieingabe, und wenn ich es zurücksetzen musste, aktualisiere ich den Wert des Schlüsselattributs:

functionThatResetsTheFileInput() {
  let randomString = Math.random().toString(36);

  this.setState({
    theInputKey: randomString
  });
}

render() {
  return(
    <div>
      <input type="file"
             key={this.state.theInputKey || '' } />
      <button onClick={this.functionThatResetsTheFileInput()} />
    </div>
  )
}

Das zwingt React, die Eingabe von Grund auf neu zu rendern.

  • Um zu erklären, wie dies funktioniert, müssen Sie this.state.theInputKey aktualisieren, wenn Sie die Eingabe begrenzen möchten. Unter der Haube führt das Ändern des Schlüssels dazu, dass die Eingabe erneut gerendert wird, wodurch sie gelöscht wird.

    – Jaspal Singh

    6. Dezember 2017 um 21:54 Uhr

  • Ich mag diese Idee. Dann kann ich das Eingabefeld von anderen Funktionalitäten aus steuern, was ich jetzt brauche. Es funktioniert gut. Vielen Dank.

    – Alexander Falk

    5. September 2018 um 9:12 Uhr

  • Ich mag den Ansatz, aber ich wollte dies aus machen getDerivedStateFromPropsund glücklicherweise funktioniert es dort auch, weil wir immer noch Zugriff auf die haben state. 🙂

    – pescho hristov

    4. Februar 2019 um 12:39 Uhr

  • Dies funktionierte für mich, als ich versuchte, den React-CSV-Reader (kein Eingabe-Tag) für dasselbe Problem neu zu rendern. Vielen Dank.

    – Yasith Prabuddhaka

    2. September 2019 um 13:00 Uhr

  • Lief wie am Schnürchen. ich benutzte key={Date.now()}

    – Drusto

    16. Oktober 2019 um 11:22 Uhr

Das funktioniert für mich – ref={ref => this.fileInput = ref}

<input id="file_input_file" type="file" onChange={(e) => this._handleFileChange(e)} ref={ref=> this.fileInput = ref} />

dann in meinem Fall, sobald die Datei auf den Server hochgeladen wurde, lösche ich sie mit der folgenden Anweisung

 this.fileInput.value = "";

  • Ich mag den Ansatz, aber ich wollte dies aus machen getDerivedStateFromProps und leider wird es nicht funktionieren, da wir keinen Zugriff darauf haben this dort.

    – pescho hristov

    4. Februar 2019 um 12:38 Uhr

  • Dieser Ansatz funktioniert für mich. Ich habe dies in der funktionalen React-Komponente getan: const [fileInput_ref, setFileInputRef] = useState({}); und in der Eingabe selbst ref={(ref) => { setFileInputRef(ref) }} und dann löschen. Danke @Jozcar

    – Yogesh Koli

    10. März um 13:14 Uhr

Mit jedem Klick onClick man kann die eingabe zurücksetzen, damit sogar mit der gleichen datei onChange wird ausgelöst.

<input onChange={this.onChange} onClick={e => (e.target.value = null)} type="file" />

  • Das funktioniert wirklich gut. Erleichtert es auch, dem Benutzer benutzerdefiniertes Feedback zu geben. Zum Beispiel: Ich habe eine Zustandsvariable, die als Schlüssel fungiert (mit Date.now() und verwenden Sie eine andere Statusvariable – die daneben gesetzt wird -, um dem Benutzer eine Nachricht wie “erfolgreich hochgeladen um (Uhrzeit)” bereitzustellen.

    – Backslash

    10. Mai 2020 um 3:52 Uhr

  • Dies funktioniert gut, wenn Sie das Feld nicht löschen möchten, wenn Sie auf eine Schaltfläche klicken, aber sicherstellen möchten, dass das Feld leer ist, bevor Sie eine andere Datei hochladen.

    – Hervera

    15. September 2021 um 6:23 Uhr

Folgendes hat bei mir mit React Hooks funktioniert. Dies geschieht über einen sogenannten „Controlled Input“. Das heißt, die Eingänge sind kontrolliert nach Staat, oder ihre Quelle der Wahrheit ist der Staat.

TL;DR Das Zurücksetzen der Dateieingabe war ein zweistufiger Prozess, bei dem sowohl die useState() und useRef() Haken.

HINWEIS: Ich habe auch angegeben, wie ich eine Texteingabe zurücksetze, falls jemand anderes neugierig war.

function CreatePost({ user }) {
    const [content, setContent] = React.useState("");
    const [image, setImage] = React.useState(null); //See Supporting Documentation #1
    const imageInputRef = React.useRef(); //See Supporting Documentation #2

    function handleSubmit(event) {
        event.preventDefault(); //Stop the pesky default reload function
        setContent(""); //Resets the value of the first input - See #1

        //////START of File Input Reset
        imageInputRef.current.value = "";//Resets the file name of the file input - See #2
        setImage(null); //Resets the value of the file input - See #1
        //////END of File Input Reset
    }

    return (
    <div>
        <form onSubmit={handleSubmit}>
            <input 
            type="text" 
            placeholder="Add Post Content" 
            onChange={event => setContent(event.target.value)}
            value={content} //Make this input's value, controlled by state
            />
            <input 
            type="file"
            onChange={event => setImage(event.target.files[0])} //See Supporting Doc #3
            ref={imageInputRef} //Apply the ref to the input, now it's controlled - See #2
            />
            <button type="submit">Submit Form</button>
        </form>
    </div>
    )
};

Unterstützende Dokumentation:

  1. useState-Hook
    • Gibt einen zustandsbehafteten Wert und eine Funktion zum Aktualisieren zurück.
  2. useRef-Hook
    • Wenn Sie ein ref-Objekt an React übergeben, setzt React seine aktuelle Eigenschaft auf den entsprechenden DOM-Knoten, sobald sich dieser Knoten ändert.
  3. Verwenden von Dateien aus Web-Apps
    • Wenn der Benutzer nur eine Datei auswählt, muss nur die erste Datei der Liste betrachtet werden.

  • Dies sollte die akzeptierte Antwort sein, da dies eher eine React-Methode zum Zurücksetzen der Eingabe ist. Ich habe die Eingabe in einer anderen Komponente und ich könnte sie einfach mit useRef zurücksetzen. Ich musste weder den Eingang auswählen noch irgendwelche Ereignisse anhören.

    – Zihad Ul Islam

    6. Juli 2021 um 12:39 Uhr

Benutzer-Avatar
Stepan Jakowenko

import React, { useRef } from "react";

export default function App() {
  const ref = useRef();

  const reset = () => {
    ref.current.value = "";
  };

  return (
    <>
      <input type="file" ref={ref} />
      <button onClick={reset}>reset</button>
    </>
  );
}

  • Dies sollte die akzeptierte Antwort sein, da dies eher eine React-Methode zum Zurücksetzen der Eingabe ist. Ich habe die Eingabe in einer anderen Komponente und ich könnte sie einfach mit useRef zurücksetzen. Ich musste weder den Eingang auswählen noch irgendwelche Ereignisse anhören.

    – Zihad Ul Islam

    6. Juli 2021 um 12:39 Uhr

Benutzer-Avatar
IRTrapGott

Sie können dies auch in Ihr Eingabeelement aufnehmen, wenn Sie wissen, dass Sie den integrierten Dateieingabewert überhaupt nicht verwenden werden.

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

Auf diese Weise wird der Wert beim Rendern immer auf den leeren String zurückgesetzt und Sie müssen ihn nicht umständlich in eine onChange-Funktion einbinden.

1017690cookie-checkSo setzen Sie die ReactJS-Dateieingabe zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy