Я прошел через руководство по загрузке файла реакции и хочу добавить к нему. Я пытаюсь сделать так, чтобы когда пользователь нажимал на сообщение загрузки, браузер предлагал им сказать: «Ваш файл загружается». Я ни в коем случае не являюсь разработчиком внешнего интерфейса, поэтому, пожалуйста, простите меня, если этот вопрос супер-нуби. По какой-то причине, когда я использую этот код, если вы переходите на веб-страницу, код функции запускается один раз, а затем снова при нажатии. Мое предполагаемое использование - запускать только по щелчку, есть идеи, что я делаю не так?
import React, { Component } from 'react'
import { Alert } from 'react-alert'
class Main extends React.Component {
constructor(props) {
super(props);
this.state = {
imageURL: '',
};
this.handleUploadImage = this.handleUploadImage.bind(this);
}
handleUploadImage(ev) {
ev.preventDefault();
const data = new FormData();
data.append('file', this.uploadInput.files[0]);
data.append('filename', this.fileName.value);
fetch('http://localhost:8000/upload', {
method: 'POST',
body: data,
}).then((response) => {
response.json().then((body) => {
this.setState({ imageURL: `http://localhost:8000/${body.file}` });
});
});
}
render() {
return (
<form onSubmit = {this.handleUploadImage}>
<div>
<input ref = {(ref) => { this.uploadInput = ref; }} type = "file" />
</div>
<div>
<input ref = {(ref) => { this.fileName = ref; }} type = "text" placeholder = "Enter the desired name of file" />
</div>
<br />
<div>
<button onclick = "myFunction()">Upload</button>
<script>
function myFunction() {
alert("Your file is being uploaded!")
}
</script>
</div>
<img src = {this.state.imageURL} alt = "img" />
</form>
);
}
}
export default Main;
@byrdEmmanuel Когда я пытаюсь это сделать, я получаю новое сообщение об ошибке: Строка 48: 'myFunction' не определена no-undef
Также попробуйте сделать это так, как вы разместили выше, просто заключив функцию в кавычки, не выдает ошибок, но будет предупреждать браузер о загрузке / обновлении страницы.
Определите myFunction на том же уровне, что и handleUpdateImage, а не в теге <script>, он должен работать так.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Изменять
<form onSubmit = {this.handleUploadImage}>
К
<form onSubmit = {e => this.handleUploadImage(e)}>
Это вызовет handleUploadImage только при нажатии
Кажется, все еще выдает предупреждение при загрузке / обновлении страницы
Хорошо, попробуйте изменить handleUploadImage (ev) {на handleUploadImage = ev => {
Почему бы вам не переместить предупреждение в начало функции loadImage дескриптора?
handleUploadImage(ev) {
alert("Your file is being uploaded!")
....
}
и вместо
<div>
<button onclick = "myFunction()">Upload</button>
<script>
function myFunction() {
alert("Your file is being uploaded!")
}
</script>
</div>
у тебя будет
<div>
<button type = "submit">Upload</button>
</div>
Боже да! В этом есть смысл. Ух ты, столько потраченных циклов на это .... Спасибо. Это полностью работает, потому что код handleUploadImage не запускается до тех пор, пока форма не будет отправлена, что происходит при нажатии кнопки .... хорошо сделано. Это круто, спасибо за помощь !!!
для всех, кому интересно, вот последний код после полученной мной помощи.
import React, { Component } from 'react'
import { Alert } from 'react-alert'
class Main extends React.Component {
constructor(props) {
super(props);
this.state = {
imageURL: '',
};
this.handleUploadImage = this.handleUploadImage.bind(this);
}
handleUploadImage(ev) {
alert("Your file is being uploaded!")
ev.preventDefault();
const data = new FormData();
data.append('file', this.uploadInput.files[0]);
data.append('filename', this.fileName.value);
fetch('http://localhost:8000/upload', {
method: 'POST',
body: data,
}).then((response) => {
response.json().then((body) => {
this.setState({ imageURL: `http://localhost:8000/${body.file}` });
});
});
}
render() {
return (
<form onSubmit = {this.handleUploadImage}>
<div>
<input ref = {(ref) => { this.uploadInput = ref; }} type = "file" />
</div>
<div>
<input ref = {(ref) => { this.fileName = ref; }} type = "text" placeholder = "Enter the desired name of file" />
</div>
<br />
<div>
<button type = "submit">Upload</button>
</div>
<img src = {this.state.imageURL} alt = "img" />
</form>
);
}
}
export default Main;
Попробуйте сменить
<button onclick = "myFunction()">на<button onClick = {myFunction}>.