Files
2022-01-20 20:30:18 +01:00

3.8 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5a24c314108439a4d4036150 ストアでアクションを処理する 6 301444 handle-an-action-in-the-store

--description--

アクションが作成されてディスパッチされた後、Redux ストアでは、そのアクションに対してどう応答するかを知る必要があります。 その役割を担うのが reducer (リデューサー) 関数です。 Redux のリデューサーは、アクションに応じて行われる state の変更を担います。 reducer は、引数として stateaction を受け取り、常に新しい state を返します。 ここで重要なのは、これがレデューサーの唯一の役割であると理解することです。 副次的な処理はまったくありません。API のエンドポイントを呼び出すこともなく、驚くようなことも隠されていません。 レデューサーは、state と action を受け取って新しい state を返すだけの純粋な関数です。

Redux のもう一つの重要な原則は「state は読み取り専用である」ことです。 言い換えれば、reducer 関数は常に state の新しいコピーを返す必要があり、state を直接変更することは決して許されません。 Redux では状態の不変性を強制してはいませんが、レデューサー関数のコードではプログラマーが状態の不変性を強制する必要があります。 これについてはこのあとのチャレンジで練習します。

--instructions--

コードエディターに、以前に紹介した例と、reducer 関数の冒頭部分があります。 reducer 関数の本体を入力して、タイプ 'LOGIN' のアクションを受け取った場合に logintrue に設定された state オブジェクトを返すようにしてください。 それ以外の場合は、現在の state を返してください。 現在の state とディスパッチされた action がレデューサーに渡されるため、action.type を使用してアクションタイプに直接アクセスすることができます。

--hints--

関数 loginAction の呼び出しで、type プロパティが文字列 LOGIN に設定されたオブジェクトを返します。

assert(loginAction().type === 'LOGIN');

オブジェクトのプロパティ loginfalse に設定してストアを初期化します。

assert(store.getState().login === false);

loginAction のディスパッチで、ストアの state の login プロパティを true に更新します。

assert(
  (function () {
    const initialState = store.getState();
    store.dispatch(loginAction());
    const afterState = store.getState();
    return initialState.login === false && afterState.login === true;
  })()
);

アクションがタイプ LOGIN でない場合、ストアは現在の state を返します。

assert(
  (function () {
    store.dispatch({ type: '__TEST__ACTION__' });
    let afterTest = store.getState();
    return typeof afterTest === 'object' && afterTest.hasOwnProperty('login');
  })()
);

--seed--

--seed-contents--

const defaultState = {
  login: false
};

const reducer = (state = defaultState, action) => {
  // Change code below this line

  // Change code above this line
};

const store = Redux.createStore(reducer);

const loginAction = () => {
  return {
    type: 'LOGIN'
  }
};

--solutions--

const defaultState = {
  login: false
};

const reducer = (state = defaultState, action) => {

  if (action.type === 'LOGIN') {
    return {login: true}
  }

  else {
    return state
  }

};

const store = Redux.createStore(reducer);

const loginAction = () => {
  return {
    type: 'LOGIN'
  }
};