私は、ユーザーがファイルをウィンドウにドラッグしてファイル情報を表示できるように、react-dropzoneとReact-Reduxというノードパッケージモジュールを使用しています。ファイルアイテムがロードされた後でのみ、dataTransferからFileListをディスパッチする方法
react-dropzoneコンポーネントが私に標準event.dataTransfer.filesのFileListを与えています。
RedListストアにFileListをディスパッチすると、FileList配列にFileアイテムがまだロードされていないので、Fileデータを送出するときには、{"preview":"blob:file:///f30eafb8-8a77-4402-9111-379590b4a03f"}
が返されます。
ファイル項目をコンソールに記録すると、データが表示されるまでにデータが読み込まれるため、表示されますが、読み込まれた後にファイル情報をディスパッチする方法がわかりません。
FileList配列からFile項目の1つをコンソールに記録すると、次のような結果が表示されます。
{
lastModified: 1473709614000,
lastModifiedDate: Mon Sep 12 2016 12:46:54 GMT-0700 (PDT),
name: "test_image.jpg",
path: "/Users/mitchconquer/Desktop/test_image.jpg",
preview: "blob:file:///0fe69686-125d-464a-a0a8-a42e497d3808",
size: 41805,
type: "image/jpeg",
webkitRelativePath: ""
}
は、私はこの問題は、Fileオブジェクトが完全にロードされていないだけということであると信じていますが、データが完全にロードされたら、私は唯一のアクションを発射する方法を把握することはできません。誰かが正しい道を私に指摘することができますか?
は、ここで反応し、ドロップゾーンを使っている私のコンポーネントです:
// FileDrop.js
import React, { Component, PropTypes } from 'react';
import { Link } from 'react-router';
import styles from './Home.css';
import Dropzone from 'react-dropzone';
export default class FileDrop extends Component {
static propTypes = {
message: PropTypes.string.isRequired,
setFile: PropTypes.func.isRequired
};
onDrop(files, event) {
console.log({files});
this.props.setFile(files);
}
render() {
return (
<div>
<Dropzone onDropAccepted={this.onDrop.bind(this)} multiple={false} disablePreview={false}>
<div>{this.props.message}</div>
</Dropzone>
</div>
);
}
}
...と、ここで上記onDrop
方法で使われていますsetFile
方法を持っている私のアクションファイルです:
// actions/files.js
export const SET_FILE = 'SET_FILE';
// ACTION CREATORS
function _setFile(file) {
return {
type: SET_FILE,
file
};
}
// ACTION CREATOR CREATORS
export function setFile(file) {
return _setFile(file[0]);
}
..そして、そのアクションを扱っている減速機があります:
// reducers/files.js
import { SET_FILE } from '../actions/files';
export const initialState = [];
export default function files(state = initialState, action = {}) {
switch (action.type) {
case SET_FILE:
const newState = state.slice();
const file = action.file;
newState.push(file);
return newState;
default:
return state;
}
}
ロダッシュを使用している場合は、「_.toPlainObject(files [0])」を実行することもできます。 –