ReduxReactのネストされた配列へのオブジェクトの追加

ジョセフ

アレイのbanking_cards array内側に新しいカードを追加しようとしていpaymentMethodsます。banking_cards配列は内部にあるpaymentMethods配列。そこで、新しいカードオブジェクトをbanking_cards配列内に挿入したかったのです。以下の私のコードは、というエラーを生成しますstate.paymentMethods.banking_cards is not iterable

メモを取る

banking_cards配列は内部にあるpaymentMethods配列

export const initialState = {
    paymentMethods: [],
  };



  case paymentMethodConstants.ADD_CARD_SUCCESS:
    return {
      ...state,
      paymentMethods: [
        ...state.paymentMethods,
        banking_cards: [...state.paymentMethods.banking_cards, action.payload],
      ],
    };

JSON

paymentMethods = [
  {
    "id": 8,
    "customer_token": "epofjoe",
    "banking_cards": [
      {
        "id": 1,
        "banking_token": "AAA",
        "last_4": "0006",
        "exp_year": 2021,
        "exp_month": 12,
        "cvc": 876
      },
      {
        "id": 2,
        "banking_token": "BBB",
        "last_4": "0002",
        "exp_year": 2022,
        "exp_month": 12,
        "cvc": 877
      },
    ]
  }
]
HMR

カードを支払い方法に追加する場合、アクションには、カードを追加する必要のある支払い方法を含める必要があります。

以下は、それを行う方法の実用的な例です。

const { Provider, useDispatch, useSelector } = ReactRedux;
const { createStore, applyMiddleware, compose } = Redux;

const createId = ((id) => () => id++)(3);

const initialState = {
  paymentMethods: [
    {
      id: 8,
      banking_cards: [
        {
          id: 1,
        },
        {
          id: 2,
        },
      ],
    },
    {
      id: 9,
      banking_cards: [
        {
          id: 1,
        },
        {
          id: 2,
        },
      ],
    },
  ],
};
//action types
const ADD_CARD_SUCCESS = 'ADD_CARD_SUCCESS';
//action creators
const addCardSuccess = (payementMethodId, card) => ({
  type: ADD_CARD_SUCCESS,
  payload: { payementMethodId, card },
});
const reducer = (state, { type, payload }) => {
  if (type === ADD_CARD_SUCCESS) {
    const { payementMethodId, card } = payload;
    return {
      ...state,
      paymentMethods: state.paymentMethods.map((method) =>
        method.id === payementMethodId
          ? {
              ...method,
              banking_cards: [
                ...method.banking_cards,
                card,
              ],
            }
          : method
      ),
    };
  }
  return state;
};
//selectors
const selectPaymentMethods = (state) =>
  state.paymentMethods;
//creating store with redux dev tools
const composeEnhancers =
  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
  reducer,
  initialState,
  composeEnhancers(
    applyMiddleware(() => (next) => (action) =>
      next(action)
    )
  )
);
//pure component so not re rendering when nothing changed
const Card = React.memo(function Card({ card }) {
  return <li>card: {card.id}</li>;
});
//pure component so it won't re render when nothing changes
const PaymentMethod = React.memo(function PaymentMethod({
  paymentMethod,
}) {
  const dispatch = useDispatch();
  return (
    <li>
      payment method id: {paymentMethod.id}
      <ul>
        {paymentMethod.banking_cards.map((card) => (
          <Card key={card.id} card={card} />
        ))}
      </ul>
      <button
        onClick={() =>
          dispatch(
            //dispatch action with payment method id
            addCardSuccess(paymentMethod.id, {
              //the new card to be added
              id: createId(),
            })
          )
        }
      >
        Add card
      </button>
    </li>
  );
});
const App = () => {
  const paymentMethods = useSelector(selectPaymentMethods);
  return (
    <ul>
      {paymentMethods.map((paymentMethod) => (
        <PaymentMethod
          key={paymentMethod.id}
          paymentMethod={paymentMethod}
        />
      ))}
    </ul>
  );
};

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.5/redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/7.2.0/react-redux.min.js"></script>
<div id="root"></div>

イマーでは、支払い方法のインデックスを使用し、マップは必要ありません。

const { Provider, useDispatch, useSelector } = ReactRedux;
const { createStore, applyMiddleware, compose } = Redux;
const { produce } = immer;

const createId = ((id) => () => id++)(3);

const initialState = {
  paymentMethods: [
    {
      id: 8,
      banking_cards: [
        {
          id: 1,
        },
        {
          id: 2,
        },
      ],
    },
    {
      id: 9,
      banking_cards: [
        {
          id: 1,
        },
        {
          id: 2,
        },
      ],
    },
  ],
};
//action types
const ADD_CARD_SUCCESS = 'ADD_CARD_SUCCESS';
//action creators
const addCardSuccess = (index, card) => ({
  type: ADD_CARD_SUCCESS,
  payload: { index, card },
});
const reducer = (state, { type, payload }) => {
  if (type === ADD_CARD_SUCCESS) {
    //lot less hassle using index and immer
    const { index, card } = payload;
    return produce(state, (draft) => {
      draft.paymentMethods[index].banking_cards.push(card);
    });
  }
  return state;
};
//selectors
const selectPaymentMethods = (state) =>
  state.paymentMethods;
//creating store with redux dev tools
const composeEnhancers =
  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
  reducer,
  initialState,
  composeEnhancers(
    applyMiddleware(() => (next) => (action) =>
      next(action)
    )
  )
);
//pure component so not re rendering when nothing changed
const Card = React.memo(function Card({ card }) {
  return <li>card: {card.id}</li>;
});
//pure component so it won't re render when nothing changes
const PaymentMethod = React.memo(function PaymentMethod({
  paymentMethod,
  index,
}) {
  const dispatch = useDispatch();
  return (
    <li>
      payment method id: {paymentMethod.id}
      <ul>
        {paymentMethod.banking_cards.map((card) => (
          <Card key={card.id} card={card} />
        ))}
      </ul>
      <button
        onClick={() =>
          dispatch(
            //dispatch action with payment method index
            addCardSuccess(index, {
              //the new card to be added
              id: createId(),
            })
          )
        }
      >
        Add card
      </button>
    </li>
  );
});
const App = () => {
  const paymentMethods = useSelector(selectPaymentMethods);
  return (
    <ul>
      {paymentMethods.map((paymentMethod, index) => (
        <PaymentMethod
          key={paymentMethod.id}
          paymentMethod={paymentMethod}
          index={index}
        />
      ))}
    </ul>
  );
};

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.5/redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/7.2.0/react-redux.min.js"></script>
<script src="https://unpkg.com/[email protected]/dist/immer.umd.production.min.js"></script>
<div id="root"></div>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされた配列からオブジェクトの配列へ

分類Dev

react-reduxのネストされた配列へのオブジェクトの追加

分類Dev

JSON配列のオブジェクトへの解析(ネストされたJSON)

分類Dev

オブジェクトjsonからcsvへのネストされた配列

分類Dev

オブジェクト内のネストされた配列

分類Dev

JavaScript:オブジェクトの配列とオブジェクトのネストされた配列の比較

分類Dev

オブジェクト内の深いネストされた配列へのアクセスの取得

分類Dev

Javascriptのループの問題とネストされたオブジェクトの配列への変換

分類Dev

ネストされた子へのオブジェクトのJavaScript形式の配列

分類Dev

[String] [String]を介したネストされた配列/オブジェクトへのアクセス

分類Dev

配列からネストされたオブジェクトのAngularjs配列

分類Dev

MGOクエリのネストされたオブジェクトの配列

分類Dev

オブジェクトの配列にネストされたオブジェクトの状態の変更

分類Dev

オブジェクトの深くネストされた配列へのMongoDB $ addToSet

分類Dev

配列内にネストされたJSONオブジェクトへのアクセス

分類Dev

深くネストされたjsonオブジェクトを使用した配列へのマッピング

分類Dev

ネストされたオブジェクトの配列の並べ替え

分類Dev

ネストされたオブジェクト配列の要素の結合

分類Dev

配列内のネストされたオブジェクトの破棄

分類Dev

ネストされた配列内のオブジェクトの比較-mongoDB

分類Dev

reactjsのネストされた配列の更新とオブジェクト

分類Dev

ネストされたオブジェクトのネストされた配列のMongodb集計クエリ

分類Dev

オブジェクトのネストされた配列の検証を追加する方法

分類Dev

javascriptのネストされたオブジェクトからの単純な配列オブジェクト

分類Dev

オブジェクトのネストされた配列を使用した$ lookup

分類Dev

HTMLで表示するオブジェクト内のネストされたJSONオブジェクトと配列へのアクセス-AngularJS

分類Dev

ネストされたオブジェクト配列のクエリ

分類Dev

深くネストされたオブジェクト配列JSONファイルへのマッピング

分類Dev

ネストされた配列を持つ一意のオブジェクトの配列に凝縮されたオブジェクトの配列

Related 関連記事

  1. 1

    ネストされた配列からオブジェクトの配列へ

  2. 2

    react-reduxのネストされた配列へのオブジェクトの追加

  3. 3

    JSON配列のオブジェクトへの解析(ネストされたJSON)

  4. 4

    オブジェクトjsonからcsvへのネストされた配列

  5. 5

    オブジェクト内のネストされた配列

  6. 6

    JavaScript:オブジェクトの配列とオブジェクトのネストされた配列の比較

  7. 7

    オブジェクト内の深いネストされた配列へのアクセスの取得

  8. 8

    Javascriptのループの問題とネストされたオブジェクトの配列への変換

  9. 9

    ネストされた子へのオブジェクトのJavaScript形式の配列

  10. 10

    [String] [String]を介したネストされた配列/オブジェクトへのアクセス

  11. 11

    配列からネストされたオブジェクトのAngularjs配列

  12. 12

    MGOクエリのネストされたオブジェクトの配列

  13. 13

    オブジェクトの配列にネストされたオブジェクトの状態の変更

  14. 14

    オブジェクトの深くネストされた配列へのMongoDB $ addToSet

  15. 15

    配列内にネストされたJSONオブジェクトへのアクセス

  16. 16

    深くネストされたjsonオブジェクトを使用した配列へのマッピング

  17. 17

    ネストされたオブジェクトの配列の並べ替え

  18. 18

    ネストされたオブジェクト配列の要素の結合

  19. 19

    配列内のネストされたオブジェクトの破棄

  20. 20

    ネストされた配列内のオブジェクトの比較-mongoDB

  21. 21

    reactjsのネストされた配列の更新とオブジェクト

  22. 22

    ネストされたオブジェクトのネストされた配列のMongodb集計クエリ

  23. 23

    オブジェクトのネストされた配列の検証を追加する方法

  24. 24

    javascriptのネストされたオブジェクトからの単純な配列オブジェクト

  25. 25

    オブジェクトのネストされた配列を使用した$ lookup

  26. 26

    HTMLで表示するオブジェクト内のネストされたJSONオブジェクトと配列へのアクセス-AngularJS

  27. 27

    ネストされたオブジェクト配列のクエリ

  28. 28

    深くネストされたオブジェクト配列JSONファイルへのマッピング

  29. 29

    ネストされた配列を持つ一意のオブジェクトの配列に凝縮されたオブジェクトの配列

ホットタグ

アーカイブ