另一種方式來做到這一點,而不必使用PropTypes,將渲染預覽圖像(下面的例子使用React 16+語法,只接受一個圖像文件發送給API;但是,通過一些小調整,還可以縮放到多個圖像和其他字段輸入:
個
renderDropZone.js(懸浮窗成分)
import map from 'lodash/map';
import React, { Fragment } from 'react';
import DropZone from 'react-dropzone';
const RenderDropZone = ({
errors,
handleOnDrop,
input,
imageFileToUpload,
label,
touched
}) => {
const renderImagePreview =() => {
map(imageFileToUpload, ({ name, preview, size }) => {
return [
<li key="imagePreview>
<img src={ preview } alt={ name } />
</li>,
<li key="imageDetails">
{ name } - { size } bytes
</li>
]
});
};
return [
<Fragment>
<DropZone
accept="image/jpeg, image/png, image/gif, image/bmp"
className="upload-container"
onDrop={handleOnDrop}
onChange={fileToUpload => input.onChange(fileToUpload)}
>
{imageFileToUpload.length > 0
? <ul className="uploaded-images-container">
{ renderImagePreview() }
</ul>
: <p>Click or drag image file to this area to upload.</p>
}
</DropZone>
{ touched && error && <div className="error-handlers">{ error }</div> }
<label className="form-label">{ label }</label>
</Fragment>
);
};
export default RenderDropZone;
UploadForm.js(Redux的表單組件)
import React, { Component } from 'react';
import { Form, Field, reduxForm } from 'redux-form';;
import RenderDropZone from './renderDropZone';
const imageIsRequired = value => ({ !value ? 'Required' : undefined });
class UploadForm extends Component {
state = { imageFileToUpload: [] };
handleOnDrop = newImage => this.setState({ imageFileToUpload: newImage });
render() {
const { handleSubmit, pristine, reset, submitting } = this.props;
return (
<div className="form-container col-xs-12">
<h1>Upload An Image</h1>
<hr />
<Form onSubmit={handleSubmit}>
<Field
name="imageToUpload"
component={({ input, meta: { error, touched } }) =>
<RenderDropZone
error={error}
handleOnDrop={this.handleOnDrop}
input={input}
imageFileToUpload={this.state.imageFileToUpload}
label="Upload Image"
touched={touched}
/>
}
type="file"
placeholder="Upload Image"
validate={[imageIsRequired]}
/>
<button
type="submit"
className="submit btn btn-primary"
disabled={submitting}
>
Submit
</button>
<button
type="button"
className="clear-values btn btn-danger"
disabled={pristine || submitting}
onClick={() =>
this.setState({ imageFileToUpload: [] });
reset();
}
>
Clear
</button>
</Form>
</div>
);
};
};
export default reduxForm({
form: 'UploadForm'
})(UploadForm);
renderUploadForm.js(從上面取一切和顯示的形式用戶;以及,捕捉提交Redux的表格道具)
import React, { Component } from 'react';
import { reduxForm } from 'redux-form';
import createFormData from './configFormData';
import UploadForm from './UploadForm';
const RenderUploadForm =() => {
const handleFormSubmit = formProps => {
const formData = createFormData(formProps);
/* create an AJAX POST request here with the created formData */
};
return <UploadForm onSubmit={formProps => handleFormSubmit(formProps)}/>
};
export default reduxForm({
form: 'UploadForm'
})(RenderUploadForm);
configFormData.js(從終極版形態道具創建FORMDATA爲API來根據AJAX POST請求最終讀取)
const createFormData = ({ imageToUpload }) => {
const fd = new FormData();
fd.append('imageFile', imageToUpload[0]);
/*
Examples of appending other inputs -- the specified name inside
the single quotes can be named anything, while the second
parameter MUST be the "name" specified in the Redux Form component:
<Field name='textinputName' type='text'>Example</Field>
fd.append('nameofTextInput', textinputName);
fd.append('nameofTextArea', textareaName);
fd.append('nameofCheckBox', checkboxName);
...etc
*/
return fd;
};
export default createFormData;
實施例: 實施例W /預覽:
我相信'onDrop'函數收到的文件需要先用'FileReader'讀取,然後才能發送到服務器。否則它是無用的。如果它有助於完全回答最初的問題,我可以在這裏舉一個例子。 –