Почему, когда я добавляю событие onClick к своей кнопке, CSVLINK(реагировать-csv) больше не работает?

У меня есть Node.Js и я реагирую на интерфейс. У меня есть запрос в бэкэнде, который возвращает данные, основанные на названии категории, которые я ввожу в поле ввода. Прежде чем я добавлю событие onClick в кнопку, он вернул результаты в CSV и скачал их для меня. После добавления onClick к кнопке я вижу, что на бэкэнде у меня есть успешный запрос, но на фронте он не загружает мои результаты в файл csv. Я использую кнопку из Semantic UI React и CSVLINK из пакета "act-csv ".

Вот мой код (функция, которую я вызвал в onClick):

handleReportButton(e){

e.preventDefault();
const value = e.target.value;

fetch(`/reportOnAnswersCategory`,{
method: 'POST',
body: JSON.stringify({
  answer: value
}),
headers: {"Content-Type": "application/json"}
  })
.then(data => data.json())
.then((data) => {this.setState({report : data});})
.catch(err => console.error(err));
}

Это кнопка (я связал функцию раньше, и перед возвратом я сделал 'const { report } = this.state;'):

<Button onClick={this.handleReportButton}>
  <CSVLink data={report} >Download this report</CSVLink>
</Button>

Заранее спасибо за помощь

1 ответ

Чтобы загрузить файл в html5, вы можете установить тег привязки с атрибутом загрузки,

<a href="/reportOnAnswersCategory" download="data.csv" id="btnExport" >Export data into Excel</a>

И когда пользователь нажимает на ссылку, атрибут загрузки появляется в сохранении. В этом случае файл будет загружен как "data.csv"

Но чтобы передать 'answer:value' в API, вы можете изменить узел, чтобы он принимался как параметр запроса, и измените URL на href="/reportOnAnswersCategory?answer="+{value}Или ты можешь спрятать <a> используя стиль CSS,display:none и нажмите на кнопку, сделайте document.getElementById("btnExport").click()

Изменить: когда загрузка использует запрос POST,

fetch(service_url, {
    method: "POST",
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json",
    },

  }).then(response => response.blob())
    .then(response => {
  var blob=response
  var reader = new window.FileReader();
  reader.readAsDataURL(blob);
  reader.onloadend = function() {
  var base64data = reader.result;

      window.open(base64data);

  }
})
.catch(error => {
  console.error(error);
});
Другие вопросы по тегам