Как я могу правильно реализовать Redux в React

#reactjs #redux

Вопрос:

Я начал изучать Redux с React, я застрял в части своего проекта, которая представляет собой магазин фильмов, в котором, когда пользователь выбирает количество билетов и нажимает «Добавить в корзину», я хочу обновить количество и добавить фильм в сумку.

Я реализовал некоторые исправления в своем коде, но функции не работают?

А ты как думаешь?

lt;— Постоянная—gt;

 export const ActionsTypes = {  SET_MOVIES : "SET_MOVIES",  GET_MOVIE : "GET_MOVIE",   REMOVE_MOVIE : "REMOVE_MOVIE",  QUANTITY: "QUANTITY",  ADD_PRODUCT : "ADD_PRODUCT",  }  

lt;— Мои Действия —gt;

 import {ActionsTypes} from "../Constants/ActionsTypes";   // create actions functions export const setMovies = (movies)=gt; {  return {  type : ActionsTypes.SET_MOVIES,  payload : movies,  } }   export const getMovie = (movie) =gt; {  return {  type : ActionsTypes.GET_MOVIE,  payload: movie,  }  }  export const removeMovie = () =gt; {  return {  type : ActionsTypes.REMOVE_MOVIE,  } }   export const AddProduct = (singleMovie) =gt; {  return {  type : ActionsTypes.ADD_PRODUCT,  payload: singleMovie,  } }  

lt;— Редукторы —gt;

 import { ActionsTypes } from "../Constants/ActionsTypes";   const initialState = {  movies: [],  quantity :0,  };      // Reducers function takes two arguments state, action    //Movies Reducers  export const setMoviesReducers = (state = initialState, action) =gt; {  switch (action.type) {  case ActionsTypes.SET_MOVIES:  return {...state, movies: action.payload }  default:  return state;  }  }    // single Movies Reducers  export const GetMovieDetailsReducers = (state={}, action) =gt; {  switch(action.type) {  case ActionsTypes.GET_MOVIE :   return {...state, ...action.payload}  case ActionsTypes.REMOVE_MOVIE :   return {};  default :   return state;  }    }    // Add to card and Quatity reducers  export const AddMovieToCart = (state = initialState, action) =gt; {  switch (action.type) {  case ActionsTypes.ADD_PRODUCT :  return {...state, quantity: state.quantity 1, products:[...state.products,action.payload]};  default :   return state;  }    }  

lt;— Combine reducers—gt;

 import {combineReducers} from "redux"; import { setMoviesReducers, GetMovieDetailsReducers, AddMovieToCart} from "./MoviesReducers";   export const reducers = combineReducers({  allMovies : setMoviesReducers,  movie : GetMovieDetailsReducers,  addToCart : AddMovieToCart, });  

lt;— Movie details component—gt;

 import React, {useEffect, useState} from 'react' import { Add, Remove } from '@material-ui/icons'; import './MovieDetails.css'; import { useSelector, useDispatch } from 'react-redux'; import { useParams } from 'react-router'; import { getMovie, removeMovie, AddProduct} from '../../Redux/Actions/Actions';  import axios from 'axios';  const MovieDetails = () =gt; {  const [quantity, setQuantity] = useState(1)  const singleMovie = useSelector((state)=gt; state.movie);  const addToCardProduct = useSelector((state)=gt; state.addToCart);  console.log(addToCardProduct);   const {title, poster_path, overview} = singleMovie;  const dispatch = useDispatch();  let {movieId} = useParams();  console.log(movieId);   // Handle Quantity  const handleQuantity = (type) =gt; {  if(type === "dec") {  quantity gt; 1 amp;amp; setQuantity(quantity - 1)  } else {  setQuantity(quantity   1)  }  }   // add to cart Handler  const CartHandler = () =gt; {  dispatch(addToCardProduct);  }    // Get a single Product amp; Remove product  useEffect(()=gt; {  try {  const getSingleMovie = async () =gt; {  const request = await axios.get(`https://api.themoviedb.org/3/movie/${movieId});  const response = await request.data;  dispatch(getMovie(response))  }   getSingleMovie();   } catch(error) {  console.log(`ERROR : ${error}`)  }   //Clean up  return () =gt; {  dispatch(removeMovie());  }    }, [movieId])    return (  lt;section className="movieDetails_container"gt;  lt;div className="wrapper"gt;  lt;div className="img-container"gt;  lt;img src={`${ImgPath}`   poster_path} alt={title}/gt;  lt;/divgt;   lt;div className="info-container"gt;  lt;h1gt;{title}lt;/h1gt;  lt;pgt;{overview}lt;/pgt;  lt;div className="quantity-container"gt;  lt;Remove className="quantity-icon" onClick={()=gt; handleQuantity("dec")}/gt;  lt;span className="amount"gt;{quantity}lt;/spangt;  lt;Add className="quantity-icon" onClick={()=gt; handleQuantity("incr")}/gt;  lt;/divgt;  lt;button className="btn-add" onClick={CartHandler} gt;Add To Cartlt;/buttongt;  lt;/divgt;    lt;/divgt;   lt;/sectiongt;  ) }  export default MovieDetails  

lt;—Панель навигации, где у меня есть значок моей сумки и где я хочу показать количество—gt;

 import React from 'react' import './Navbar.css'; import { Link } from 'react-router-dom'; import { Badge } from '@material-ui/core'; import { LocalMall } from '@material-ui/icons'; import { useSelector } from 'react-redux';  const Navbar = () =gt; {  const quantityBag = useSelector((state)=gt; state.quantity);  return (  lt;nav className="navBar-section"gt;  lt;Link to="/"gt;  lt;div className="logo-container"gt;  lt;img className="logo" src="./Pictures/warner-bros.png" alt="Logo"/gt;  lt;/divgt;  lt;/Linkgt;   lt;Badge badgeContent={0} color="primary"gt;  lt;LocalMall className="icon-bag" /gt;  lt;/Badgegt;  lt;/navgt;  ) }  export default Navbar  

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

1. В какой момент вы столкнулись с проблемой?

2. Пожалуйста, проверьте redux/инструментарий, способ, которым вы пользуетесь, — это старая школа.

3. Абу Суфиан Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю на кнопку, чтобы добавить выбранное количество и фильм в сумку, у меня возникает ошибка