[Node.js] FileSaver でファイルを保存してみる | 心を無にして始める React


準備
FileSaver を使っていきます。
https://github.com/eligrey/FileSaver.js/
FileSaver のインストール
npm install file-saver
ダウンロードする(URLなし)
画面に表示している内容をテキストファイルとしてダウンロードしてみます。
いつものように App.js を編集して表示してみます。
import axios from 'axios';
import { saveAs } from 'file-saver';
import React, { useEffect, useState } from 'react';
import './App.css';
import Button from './components/Button';
import Table from './components/Table';
axios.defaults.headers.get['Content-Type'] = 'application/json';
axios.defaults.headers.get.Accept = 'application/json';
axios.defaults.baseURL = 'http://localhost:3000/';
const COLUMNS = ['id', 'name'];
function App() {
const [cats, setCats] = useState([]);
useEffect(() => {
axios.get('/cats').then(response => setCats(response.data));
}, []);
const handleClick = (cb) => {
const blob = new Blob([JSON.stringify(cats, null, 2)], { type: 'application/json' });
saveAs(blob, 'filename.json');
cb();
};
return (
<>
<div className="bg-dark" style={{ minHeight: '100vh' }}>
<div className="p-5">
<Table
bordered
hover
striped
variant="dark"
columns={COLUMNS}
rows={cats.map(cat => [cat.id, cat.name])}
/>
<div className="d-flex">
<Button className="ms-auto" onClick={handleClick}>Download JSON</Button>
</div>
</div>
</div>
</>
);
}
export default App;
動かしてみます。


はい、できました。
ダウンロードする(URLあり)
画像など、URLでアクセスできるファイルをダウンロードしてみます。
こっちは簡単です。
handleClick
を少し変更します。
const handleClick = (cb) => {
saveAs('/logo192.png', 'logo192.png');
cb();
};
URLがあるほうが簡単 (。-`ω-)
ここにコードがないコンポーネントは、過去の記事にあります ('◇’)ゞ