action post redux thunk

#javascript #reactjs #redux #redux-thunk

#javascript #reactjs #redux #redux-thunk

Вопрос:

привет, запрос не вводится внутри функции… кто-нибудь мог бы помочь мне лучше понять redux thunk, компонент идеален, но во время выполнения действия вызов моей спины не доходит до меня

компонент

 import React, {useState} from "react";
import { createCategory} from '../../actions/crudCategoriesActions';



function FormCategory() {
//----------------------Categoria----------------------------------//
    const initialFormState = { name: "", description: "" };
    const [category, setCategory] = useState(initialFormState);
    
 //-------------------------AgregarCategoria-------------------//   
  const addCategory = (category) => {
    const newCategory = {
      name: category.name,
      description: category.description, //creo la categorias que voy a enviar con los datos de category
    };
    console.log(createCategory(newCategory));
  };


  const onSubmitAdd = (e) => {
    e.preventDefault();
     addCategory(category);
    setCategory(initialFormState);

    }
  ;
  const handleInputChange = (e) => {
    const { name, value } = e.target;
    setCategory({ ...category, [name]: value });
  };


return (
    <div>
      <div className="md:grid md:grid-cols-3 md:gap-6 ">
        <div className="mt-5 md:mt-0 md:col-span-2">
          <form action="#" method="POST">
            <div className="shadow sm:rounded-md sm:overflow-hidden">
              <div className="px-4 py-5 bg-white space-y-6 sm:p-6">
                <div className="grid grid-cols-3 gap-6">
                  <div className="col-span-3 sm:col-span-2">
                    <label className="block text-sm font-medium text-gray-700">
                      Category to Add:
                    </label>
                    <div className="mt-1 flex rounded-md shadow-sm">
                      <input
                        type="text"
                        name="name"
                        id="company_website"
                        className="focus:ring-indigo-500 focus:border-indigo-500 flex-1 block w-full rounded-none rounded-r-md sm:text-sm border-gray-300"
                        placeholder="Give me a name"
                        value={category.name}
                        onChange={handleInputChange}
                      />
                    </div>
                  </div>
                </div>

                <div>
                  <label className="block text-sm font-medium text-gray-700">
                    Description:
                  </label>
                  <div className="mt-1">
                    <textarea
                      id="about"
                      name="description"
                      rows="3"
                      className="shadow-sm focus:ring-indigo-500 focus:border-indigo-500 mt-1 block w-full sm:text-sm border-gray-300 rounded-md"
                      placeholder="
                      put a description of how beautiful I am "
                      value={category.description}
                      onChange={handleInputChange}
                    ></textarea>
                  </div>
                </div>
                <div> Select one category in case to delete or modify:</div>
                <br />
                <br />
                <br />
                <br />
              </div>
              <hr></hr>
              <div className="px-4 py-3 bg-gray-50 text-right sm:px-6">
                <button
                  onClick={onSubmitAdd}
                  type="submit"
                  className="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
                >
                  Save
                </button>
                <button
               
                  type="submit"
                  className="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-yellow-600 hover:bg-yellow-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
                >
                  Modify
                </button>
                <button
              
                  type="submit"
                  className="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-red-600 hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
                >
                  Delete
                </button>
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  );
}

export default FormCategory;
 

Действия

 import axios from "axios";

import { ADD_CATEGORY } from "../constants/categoriesConstants.js";

const _addCategory = (category) => ({
  type: ADD_CATEGORY,
  payload: category,
});

export const createCategory = (category) => {
  return (dispatch) => {
    axios.post("http://localhost:3001/categories",  category).then((result) => {
      dispatch(_addCategory(result.data));
    });
  };
};
 

редукторы

 import {  ADD_CATEGORY  } from "../constants/categoriesConstants.js";


const initialState = {
    allCategories: [],
    newCategory: {},
  };
  
  const categoryReducer = (state = initialState, action) => {
    switch (action.type) {
      case ADD_CATEGORY:
        return {
          ...state,
          allCategories: [...state.allCategories, action.payload]
        };
      
      default:
        return state;
    }
  };

  export default categoryReducer;
 

Магазин

 import { createStore, combineReducers, applyMiddleware } from 'redux';
import reduxThunk from 'redux-thunk';
import { composeWithDevTools } from 'redux-devtools-extension';
import { productListReducer } from '../reducers/productReducers';
import categoriesReducer from '../reducers/CategoriesReducers';

const reducer = combineReducers({
  productList: productListReducer,
  categories: categoriesReducer,
});

//Loading Section
const initialState = {};

const middleware = [reduxThunk];

const store = createStore(
  reducer,
  composeWithDevTools(applyMiddleware(...middleware))
);

export default store;
 

действие ничего мне не возвращает, пожалуйста, помогите, я не понимаю, почему

Комментарии:

1. Может ли быть проблема с самим API? Каков будет результат добавления обратного вызова в axios.post для отклоненного обещания, т.е. (axios.post().then(success => {}, failure => {})? Также вы уверены, что запрос axios выполняется? Что говорят инструменты разработки в Chrome или Firefox?

2. Мой сервер и маршруты идеальны, я уже пробовал с postman all, у него проблема при вводе действия, потому что синтаксический анализатор не завершает его, или формат действия плохо структурирован, и он не возвращает то, что должен

3. Что говорят вам инструменты redux devtools? Я думаю, вам нужно получить функцию отправки useDispatch , а затем отправить действие create category: dispatch(createCategory(newCategory));

4. Что говорит @HMR: вы не отправляете. С thunk никогда ничего не произойдет, если вы его не отправите.