1

私は次のリデューサーを持っています:

const initialState = {}

const dishReducer = (state = initialState, action) => {
    switch (action.type) {
      case 'LOAD_DISHES': 
        return (action.dishes)
    
      case 'LOAD_DISHES_ERROR': 
        console.log("load dishes error")
        return state
      case 'LOAD_DISHES_SUCCESS': 
        console.log("load dishes success")
        return state
      default:
        return state;
    }
  };

  export default dishReducer;

そして、次のアクション:

import {database} from '../../config/fbConfig'

export const startLoadingDishes = (dishes) => {
    return (dispatch) =>{
        return database.ref('products-dishes').once('value').then((snapshot) => {
            let dishes = {}
            snapshot.forEach((childSnapshot) => {
                let parentkey = childSnapshot.key
                let dishArray = [];
                childSnapshot.forEach((dish) =>{
                        dishArray.push(dish.val())
                    });
                dishes[childSnapshot.key] = dishArray;
            })
    
            dispatch(loadDishes(dishes))
        }).then(() => {
            dispatch({ type: 'LOAD_DISHES_SUCCESS' });
          }).catch(err => {
            dispatch({ type: 'LOAD_DISHES_ERROR' }, err);
          });
    }

}

export const loadDishes = (dishes) => { 
    return {
        type: 'LOAD_DISHES',
        dishes               
    }
}

「startLoadingDishes」アクションは、特定のコンポーネントの componentDidLoad() 内で呼び出されます。ただし、次のように、追加情報が含まれるように、dishReducer の初期状態を変更したいと考えています。

const initialState = {
    value : {},
    loaded: false,
    loading: false,
    error: false
}

そのため、[LOAD_DISHES の場合] レデューサーによって返される 'action.dishes' は、状態全体ではなく、状態の '値' 部分内に配置する必要があります。また、皿がすでに以前にロードされている場合は、状態の「ロード済み」部分を true に設定する必要があります。これはかなり単純なことだと理解していますが、私は React+Redux を初めて使用するので、(状態の不変性を維持しながら) Action/Reducer コードを適切に変更する方法がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1