Как запустить оповещение при нажатии кнопки React.js

Я прошел через руководство по загрузке файла реакции и хочу добавить к нему. Я пытаюсь сделать так, чтобы когда пользователь нажимал на сообщение загрузки, браузер предлагал им сказать: «Ваш файл загружается». Я ни в коем случае не являюсь разработчиком внешнего интерфейса, поэтому, пожалуйста, простите меня, если этот вопрос супер-нуби. По какой-то причине, когда я использую этот код, если вы переходите на веб-страницу, код функции запускается один раз, а затем снова при нажатии. Мое предполагаемое использование - запускать только по щелчку, есть идеи, что я делаю не так?

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;

Попробуйте сменить <button onclick = "myFunction()"> на <button onClick = {myFunction}>.

EmmanuelB 31.10.2018 20:44

@byrdEmmanuel Когда я пытаюсь это сделать, я получаю новое сообщение об ошибке: Строка 48: 'myFunction' не определена no-undef

Vincent Morris 31.10.2018 20:51

Также попробуйте сделать это так, как вы разместили выше, просто заключив функцию в кавычки, не выдает ошибок, но будет предупреждать браузер о загрузке / обновлении страницы.

Vincent Morris 31.10.2018 20:53

Определите myFunction на том же уровне, что и handleUpdateImage, а не в теге <script>, он должен работать так.

EmmanuelB 31.10.2018 20:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
4
66 943
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Изменять

<form onSubmit = {this.handleUploadImage}>

К

<form onSubmit = {e => this.handleUploadImage(e)}>

Это вызовет handleUploadImage только при нажатии

Кажется, все еще выдает предупреждение при загрузке / обновлении страницы

Vincent Morris 31.10.2018 20:35

Хорошо, попробуйте изменить handleUploadImage (ev) {на handleUploadImage = ev => {

Hemadri Dasari 31.10.2018 20:44
Ответ принят как подходящий

Почему бы вам не переместить предупреждение в начало функции 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 не запускается до тех пор, пока форма не будет отправлена, что происходит при нажатии кнопки .... хорошо сделано. Это круто, спасибо за помощь !!!

Vincent Morris 31.10.2018 21:38

для всех, кому интересно, вот последний код после полученной мной помощи.

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;

Другие вопросы по теме