【问题标题】:Make an API call with react-csv使用 react-csv 进行 API 调用
【发布时间】:2021-07-08 00:16:30
【问题描述】:

我正在尝试在我的组件中添加一个选项以将数据下载为 CSV 文件。但是,下面的代码有时会打印一个垃圾字符,而在其他时候也可以。我不明白我在这里做错了什么。我尝试按照此处提供的示例进行操作:https://github.com/react-csv/react-csv#readme

这是我的代码

import React, { useState } from "react";
import axios from "axios";

import {
  Card,
  CardHeader,
  CardTitle,
  DropdownItem,
  DropdownMenu,
  DropdownToggle,
  Table,
  UncontrolledDropdown,
  Progress
} from "reactstrap";

import { MoreHorizontal } from "react-feather";
import { CSVLink } from "react-csv";

const Languages = () => {
  const [data, setData] = useState([]);
  return (
  <Card className="flex-fill w-100">
<CardHeader>
      <div className="card-actions float-right">
        <UncontrolledDropdown>
          <DropdownToggle tag="a">
            <MoreHorizontal />
          </DropdownToggle>
          <DropdownMenu right>
            <DropdownItem><CSVLink data={data} filename={'my-file.csv'} asyncOnClick={true}
              onClick={(event, done) => {
                    axios.get("http://localhost:9091/api/returnIndices", {
                      params: {
                        view: 'Series',
                        bucket: '3_7',
                        group: 'Ratings',
                        metric: 'Price Return',
                        download: true
                      }
                    }).then((response) => {
                      const data = response.data.payload;
                      console.log(data);
                      setData(JSON.parse(data));
                      done(false); // REQUIRED to invoke the logic of component
                  });
                }}>Download me</CSVLink></DropdownItem>
        </DropdownMenu>
        </UncontrolledDropdown>
      </div>
      <CardTitle tag="h5" className="mb-0">
        Languages
      </CardTitle>
    </CardHeader>
  </Card>
);
}

export default Languages;

【问题讨论】:

    标签: javascript reactjs reactstrap


    【解决方案1】:

    我最终关注了https://github.com/react-csv/react-csv/issues/189这里的帖子

    这就是我最终做的事情

    CsvExport.js

    import React, { useState, useEffect, useRef } from 'react';
    import { CSVLink } from 'react-csv';
    import axios from "axios";
    import { config } from '../../../config';
    
    const CsvExport = ({view, bucket, group, metric, startDateMs, endDateMs}) => {
      const [csvData, setCsvData] = useState(false);
      const csvInstance = useRef();
      useEffect(() => {
        if (csvData && csvInstance.current && csvInstance.current.link) {
          setTimeout(() => {
            csvInstance.current.link.click();
            setCsvData(false);
          });
        }
      }, [csvData]);
    
      return (
        <div type="button" tabIndex="0" role="menuitem" className="dropdown-item">
          <div
            onClick={async () => {
              const newCsvData = await axios.get(config.serviceHost + config.downloadPath, {
                params: {
                view: view,
                bucket: bucket,
                group: group,
                metric: metric,
                startDate: startDateMs,
                endDate: endDateMs,
                download: true
                }
            });
            //   console.log(newCsvData.data.payload);
            const filename = [view, bucket, group, metric, Date.now()].join('_') + '.csv';
              setCsvData({
                  data: JSON.parse(newCsvData.data.payload),
                  filename: filename
              });
            }}
          >
              Download as CSV
          </div>
          {csvData ?
            <CSVLink
              data={csvData.data}
              filename={csvData.filename}
              ref={csvInstance}
            />
          : undefined}
        </div>
    
      );
    };
    
    export default CsvExport;
    

    Languages.js

    <div className="card-actions float-right">
     <Dropdown isOpen={this.state.dropdownOpen} toggle={this.toggle}>
       <DropdownToggle tag="a">
         <MoreHorizontal />
       </DropdownToggle>
       <DropdownMenu right>
         <CsvExport metric={metric} view={view} bucket={bucket} group={group} startDateMs={this.convertToMs(this.props.startDate)} endDateMs={this.convertToMs(this.props.endDate)}/>
       </DropdownMenu>
     </Dropdown>
    </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-07
      • 2018-07-31
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2017-03-29
      • 2018-04-24
      相关资源
      最近更新 更多