【发布时间】:2018-10-12 20:43:55
【问题描述】:
我的传奇有问题,我不知道出了什么问题。我收到一个错误,比如 Actions must be plain objects。在使用 react redux 时使用自定义中间件进行异步操作。这是我的代码。
容器/index.js
class AppContainer extends Component {
componentDidMount() {
const { actions: { onFetchPhoto } } = this.props;
onFetchPhoto();
}
render() {
return (
<App />
);
}
}
const mapDispatchToProps = (dispatch) => ({
actions: {
onFetchPhoto: () => dispatch(fetchPhoto())
}
})
export default connect(null, mapDispatchToProps)(AppContainer);
actions/index.js
export const FETCH_PHOTO_REQUEST = "FETCH_PHOTO_REQUEST";
export const FETCH_PHOTO_SUCCESS = "FETCH_PHOTO_SUCCESS";
export const FETCH_PHOTO_FAILURE = "FETCH_PHOTO_FAILURE";
export function fetchPhoto(payload) {
return {
type: FETCH_PHOTO_REQUEST
}
}
export function fetchPhotoSuccess(payload) {
return {
type: FETCH_PHOTO_SUCCESS,
payload
}
}
export function fetchPhotoFailure(error) {
return {
type: FETCH_PHOTO_SUCCESS,
payload: {
error
}
}
}
sagas/index.js
function* fetchRandomPhoto() {
//yield put(fetchPhoto());
const {
response,
error
} = yield call(fetchRandomPhotoApi)
if (response) {
yield put(fetchPhotoSuccess(response))
} else {
yield put(fetchPhotoFailure(error))
}
}
function* watchLoadRandomPhoto() {
try {
while (true) {
yield takeLatest(FETCH_PHOTO_REQUEST, fetchRandomPhoto);
}
}
catch(error) {
console.error("error in saga", error)
}
}
export default function* rootSaga() {
yield fork(watchLoadRandomPhoto)
}
services/index.js
import axios from 'axios';
import {
URL,
PUBLIC_KEY
} from 'src/constants/config';
import {
schema,
normalize
} from 'normalizr'
export function fetchRandomPhotoApi() {
return axios({
url: `${URL}/photos/random`,
timeout: 10000,
method: 'get',
headers: {
'Autorization': `Client-ID ${PUBLIC_KEY}`
},
responseType: 'json'
})
.then((response) => {
const { data } = response.data;
console.log("d");
if (data) {
return ({
response: {
id: data.id,
url: data.urls.full,
title: data.location.title
}
})
}
})
.catch(error => error)
}
store/configureStore.js
import rootReducer from 'src/reducers/root';
import rootSaga from 'src/sagas';
export default function configureStore() {
const logger = createLogger();
const sagaMiddleware = createSagaMiddleware();
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
rootReducer,
compose(
applyMiddleware(
sagaMiddleware,
logger,
composeEnhancers
),
)
);
sagaMiddleware.run(rootSaga);
return store;
}
我浪费了 2 天时间来解决这个问题,但没有结果。 Chrome 向我显示了这个错误:
【问题讨论】:
标签: reactjs react-redux redux-saga