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
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.
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:
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}
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.
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>
)
};
Wenn Sie ein ref-Objekt an React übergeben, setzt React seine aktuelle Eigenschaft auf den entsprechenden DOM-Knoten, sobald sich dieser Knoten ändert.
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.
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
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.
10176900cookie-checkSo setzen Sie die ReactJS-Dateieingabe zurückyes
onChange={this.getFile.bind(this)}
oder getFile = (e) => {– Dmitrij Kowalenko
12. Februar 2017 um 19:56 Uhr