asynの呼び出しがreact-reduxでどのように機能するかの重要なステップ/コンセプトがありません。API呼び出し後にアプリケーションの状態が更新されない
現在、私はapi呼び出しを行うことができます(chrome-dev-toolsを介して返されるデータを見ることもできます)。しかし、応答データはアプリケーション状態に反映されません( )。デフォルトでは空のオブジェクトであるクイズオブジェクトの状態は更新されません。
私の期待は、asyn呼び出しが解決すると、私はquizReducerの応答を解析し、応答データを反映する新しい状態(変化した状態ではない)を返します。
しかし、呼び出しが行われるたびに、更新された状態は空のクイズオブジェクト(初期状態)を返します。
私は何かが不足していることを知っていますが、私は何を理解できません。本当にいくつかのポインタ/説明を感謝します。ありがとう
アプリのようになります初期状態/プリロード状態だった:
import initialState from './initialState';
import quizConstants from '../constants/quizConstants';
const actionTypes = quizConstants.actions
// when app loads, user has not selected any quiz therefore
// initialState is an empty object
// here action is the payload we get when a quiz is selected (see QUIZ_SELETED action creator)
export default function quiz(state=initialState.quiz, action) {
switch(action.type){
// when a quiz is selected, return new state
case actionTypes.SELECT_QUIZ:
return Object.assign(
{},
state,
{
id: action.quiz.id,
name: action.quiz.name,
completed: action.quiz.completed,
selected: !action.quiz.selected,
fetching: action.quiz.fetching,
fetched: action.quiz.fetched,
questions: action.quiz.questions
}
)
case actionTypes.REQUEST_QUIZ:
return Object.assign(
{},
state,
{
id: action.quiz.id,
name: action.quiz.name,
completed: action.quiz.completed,
selected: !action.quiz.selected,
fetching: !action.quiz.fetching,
fetched: action.quiz.fetched,
questions: action.quiz.questions
}
)
case actionTypes.RECEIVE_QUIZ:
return Object.assign(
{},
state,
{
id: action.quiz.id,
name: action.quiz.name,
completed: action.quiz.completed,
selected: !action.quiz.selected,
fetching: action.quiz.fetching,
fetched: !action.quiz.fetched,
quiz: action.quiz.questions
}
)
default:
return state
}
};
index.js(rootreducer):
問題の減速のためのexport default {
quizzes: [
{id: 0, name: "quiz_name2", completed: false, selected: false},
{id: 1, name: "quiz_name2", completed: false, selected: false}
],
quiz: { questions: {} }
};
セットアップをimport { combineReducers } from 'redux';
import { routerReducer } from 'react-router-redux';
import quizzes from './quizzesReducer'
import quiz from './quizReducer';
export default combineReducers({
quizzes,
quiz,
routing: routerReducer
});
import { combineReducers } from 'redux';
import { routerReducer } from 'react-router-redux';
import quizzes from './quizzesReducer'
import quiz from './quizReducer';
export default combineReducers({
quizzes,
quiz,
routing: routerReducer
});
QuizActionCreators
あなたのQuizActionCreator
で
import quizConstants from '../constants/quizConstants';
import { quizzesEndPoint } from '../constants/appConstants';
import axios from 'axios';
const actionTypes = quizConstants.actions
// select a quiz
export const selectQuiz = (quiz) => {
return {
type: actionTypes.SELECT_QUIZ,
quiz
}
};
const receiveQuiz = (quiz, data) => {
return {
type: actionTypes.RECEIVE_QUIZ,
quiz,
data
}
};
// call when componentWillMount
export const fetchQuiz = (quiz) => {
console.log("Make an api request here")
const url = quizzesEndPoint.concat(quiz.name)
axios.get(url)
.then(response => response.data)
.then(data => receiveQuiz(quiz, data))
}
export default { selectQuiz, fetchQuiz};
'redux-thunk'や' redux-saga'などの副作用ライブラリを使用していますか?また、QuizActionCreatorsファイルでは、最後の3行目が 'receiveQuiz'を呼び出します。 'receiveQuiz'はどこに定義されていますか? – Mihir
こんにちは@Mihir! receiveQuizを含めるように質問を編集しました(質問が最初に投稿されたときにそれを含むのを忘れてしまった)。 – Uzzar
これはあまりにも多くのコードを通過するためのものです。 [MCV](http://stackoverflow.com/help/mcve)の質問を投稿する方法をお読みください。 –