[英]How to integrate FileReader in Redux?
我評論說我正在閱讀官方文檔,我完全理解這個的概念和功能。 問題是在現實中應用它會花費我多一點。 所以我開始練習,我遇到了令我困惑的事情,我想創建一個加載圖像的按鈕並顯示它的預覽。 但是,這包括一些步驟,如;
這看起來像這樣:
onImageChange(event) {
if (event.target.files && event.target.files[0]) {
let reader = new FileReader();
let file = event.target.files[0];
reader.onloadend = () => {
this.setState({
imageFile: file,
imageName: file.name
});
}
reader.readAsDataURL(file)
}
}
我試圖創建一個動作,有效載荷是圖像名稱和imageFile但我不知道在哪里放讀者...
這是我目前的組件:
import React, { Component } from "react"; import ImageModalForm from "../../../Commons/components/ImageModalForm"; import { connect } from "react-redux"; import { bindActionCreators } from "redux"; import { loadImage } from "../../actions"; const faceImage = require("../../../../img/face5.gif"); class ThumbnailComp extends Component { onImageChange(event) { if (event.target.files && event.target.files[0]) { let reader = new FileReader(); let file = event.target.files[0]; reader.onloadend = () => { this.setState({ imageFile: file, imageName: reader.result }); }; reader.readAsDataURL(file); } } render() { return ( <ImageModalForm imageFile={this.props.imageFile} imageName={this.props.imageName} onImageChange={this.onImageChange} /> ); } } function mapStateToProps(state) { return { image: state.image }; } function mapDispatchToProps(dispatch) { return bindActionCreators({ loadImage }, dispatch); } export default connect(mapStateToProps, mapDispatchToProps)(ThumbnailComp);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
歡迎任何更正...謝謝!
我有類似的問題,我會這樣做。 但我不確定......
action.js
function loadImage(event){
if (event.target.files && event.target.files[0]){
let file = event.target.files[0];
let fileName = file.name
}
return {
type: LOAD_IMAGE,
payload: { imageFile: file, imageFileName: fileName }
}
}
為什么不將結果從FileReader傳遞給動作創建者?
onImageChange(event) {
if (event.target.files && event.target.files[0]) {
let reader = new FileReader();
let file = event.target.files[0];
reader.onloadend = () => {
this.props.loadImage(reader.result)
};
reader.readAsDataURL(file);
}
}
// action creator
const loadImage = (result) => ({ type: LOAD_IMAGE, result })
旁注 - 當SyntheticEvents無效時,您無法將事件傳遞給redux。
但是,如果你想在組件之外做這個,你需要在動作創建器中進行 - 不要在reducer中這樣做,因為它們需要是純凈的而沒有任何副作用。 你還需要一些中間件才能做到這一點 - 最簡單的就是redux-thunk - 它允許你從你的動作創建者那里返回一個函數:
onImageChange(event) {
if (event.target.files && event.target.files[0]) {
let file = event.target.files[0];
this.props.loadImage(file)
}
}
// action creator
const loadImage = file => dispatch => {
let reader = new FileReader();
reader.onloadend = () => {
dispatch({
type: 'SET_IMAGE_IN_REDUCER',
image: reader.result
});
};
reader.readAsDataURL(file);
}
// example reducer
const initialState = { image: null };
function reducer(state = initialState, action) {
switch(action.type) {
case 'SET_IMAGE_IN_REDUCER':
return { ...state, image: action.image }
...
default:
return state;
}
}
它以這種方式為我工作。 我必須導入store
才能在promise中使用dispatch
。
行動創造者
import store from '../store/index';
export const UPLOAD_FILE = 'UPLOAD_FILE';
export function uploadTextFile(file) {
new Promise((resolve, reject) => {
let reader = new FileReader();
reader.onloadend = () => { resolve(reader.result) };
reader.readAsText(file);
}).then(result => store.dispatch({
type: UPLOAD_FILE,
payload: result}
));
}
商店
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from '../reducers/index';
const store = createStore(rootReducer, applyMiddleware(thunk));
export default store;
組件(部分代碼,redux綁定)
// ...
function mapDispatchToProps(dispatch) {
return bindActionCreators({ uploadTextFile }, dispatch);
}
export default connect(null, mapDispatchToProps)(YourComponentName);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.