Как эффективно использовать redux в react, делая запрос к внутреннему серверу?

Я новичок в использовании react и также новичок в redux, я работаю над проектом, который использует Django для Back-end и React для Front-end. Я хочу использовать redux для управления состоянием данных, но мне кажется, что я не могу сделать это правильно. Проблема в том, что запрос достигает бэкенда, а также у меня возникли проблемы с обработкой обещания, возвращаемого Axios.

Вот моя функция action transaction.js:

import axios from "axios";

export const CREATE_TRANSACTION = "CREATE_TRANSACTION";
export const VIEW_TRANSACTION = "VIEW_TRANSACTION";
export const UPDATE_TRANSACTION = "UPDATE_TRANSACTION";
export const LIST_TRANSACTIONS = "LIST_TRANSACTIONS";
export const DELETE_TRANSACTION = "DELETE+TRANSACTION";
export const GET_TRANSACTIONLIST_DATA = "GET_TRANSACTIONLIST_DATA";

const ROOT_URL = "http://127.0.0.1:8000/api/";

export const getTransactionList = () => (dispatch) => {
  axios
    .get(`${ROOT_URL}transactions/`, {
      headers: {
        "Content-Type": "application/json",
      },
    })
    .then((response) => {
      dispatch({ type: LIST_TRANSACTIONS, payload: response.data });
      console.log(response.data);
    });
};

Вот моя функция reducer transactions.js:

import { LIST_TRANSACTIONS } from "../actions/transaction";

export function TransactionReducer(state = {}, action) {
  switch (action.type) {
    case LIST_TRANSACTIONS:
      return action.payload;
    default:
      return state;
  }
} 

Мой store.js:

import { createStore, applyMiddleware, compose } from "redux";
import thunk from "redux-thunk";
import rootReducer from "./reducers";
const initialState = {};

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
  ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ latency: 0 })
  : compose;

const store = createStore(
  rootReducer,
  initialState,
  composeEnhancers(applyMiddleware(thunk))
);

export default store;

Попытка отобразить данные с помощью useSelector()

import React, { useEffect } from "react";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import Paper from "@mui/material/Paper";
import { useSelector, useDispatch } from "react-redux";
import { getTransactionList } from "../../actions/transaction";

export default function TransactionList() {
  const dispatch = useDispatch();
  const data = useSelector((state) => state.transactions);
  console.log(data);
  useEffect(() => {
    dispatch(getTransactionList());
  }, [dispatch]);

  return (
    <TableContainer component={Paper} sx={{ boxShadow: "none" }}>

Последний мой index.js

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { Provider } from "react-redux";
import store from "./store";


ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      {" "}
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);


reportWebVitals();

Пожалуйста, любая помощь будет высоко оценена, ПОМНИТЕ, ЧТО Я НОВИЧОК В ИСПОЛЬЗОВАНИИ ЭТИХ ТЕХНОЛОГИЙ. Любая необходимая дополнительная информация может быть предоставлена.

Я вижу более или менее правильную установку. Единственная часть, которую я считаю недостающей, это когда вы делаете следующее:

const store = createStore(
  rootReducer,
  initialState,
  composeEnhancers(applyMiddleware(thunk))
);

Где находится ваш rootReducer? Я имею в виду, что мне не хватает кода вашего корневого редуктора с чем-то вроде этого:

import { combineReducers } from 'redux';
import { TransactionReducer } from 'your/path/TransactionReducer';
import { fooReducer } from 'your/path/fooReducer';
import { barReducer } from 'your/path/barReducer';

export const rootReducer = combineReducers({
  transactions: TransactionReducer,
  foo: fooReducer,
  bar: barReducer,
});

Разве не так?

Вернуться на верх