проблема с кнопкой корзины покупок в react

#javascript #html #reactjs

#javascript #HTML #reactjs

Вопрос:

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

Product.js :

 import React from 'react'
import './Product.css'
import {useStateValue} from './StateProvider'

function Products({id,title,image,price,rating}) {
const [state,dispatch] = useStateValue();
const addToBasket = () => {
    dispatch({
        type: 'ADD_TO_BASKET',
        item:{
            id: id,
            title: title,
            image: image, 
            price: price,
            rating: rating,  
        },
    });
   };
  return (
    <div className="product">
        <div className="product_info">
            <p>{title}</p>
            <p className="product_price">
                <small>$</small>
                <strong>{price}</strong>
            </p>
            <div className="product_rating">
                {Array(rating).fill().map((_,i) => (
                    <p></p>
                ))}
            </div>
        </div> 

        <img src={image} alt="" /> 
        <button onClick={addToBasket}>Add to Basket</button> 
    </div>
   );
   }
  export default Products;
 

Reducer.js :

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

const reducer =(state,action)=>{
console.log(action);
switch(action.type){
    case "ADD_TO_BASKET":
        return {
            ...state,
            basket:[...state.basket,action.item],
        };
        default:
            return state;
    }
   };
export default reducer;
 

Index.js :

 import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { StateProvider } from './StateProvider';
import reducer, {initialState} from './reducer'

ReactDOM.render(
<React.StrictMode>
<StateProvider initialState={initialState} reducer={reducer}>
<App />
</StateProvider>
</React.StrictMode>,
document.getElementById('root')
);
reportWebVitals();
 

Header.js (там, где я поместил логотип корзины):

 import React from 'react';
import './Header.css';
import SearchIcon from '@material-ui/icons/Search'
import ShopppingBasketIcon from '@material-ui/icons/ShoppingBasket'
import {Link} from 'react-router-dom'
import { useStateValue } from "./StateProvider"

function Header() {
const [{basket},dispatch] = useStateValue();
return (
    <div className="header"> 
    <Link to="/">
    <img className="header__logo" src="http://pngimg.com/uploads/amazon/amazon_PNG11.png"/>
    </Link>       
    <div className="header__search">
    <input className="header__searchInput" type="text"/> 
    <SearchIcon className="header__searchIcon"/>
    </div>

    <div className="header__nav">
        <Link to="/checkout">
        <div className="header__optionBasket">
            <ShopppingBasketIcon/>
            <span className="header__optionLineTwo
            header__basketCount">{basket?.lenght}</span>
        </div>
        </Link>
    </div>
    </div>
)
}
export default Header
 

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

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

1. у вас опечатка, она basket.length не должна basket?.lenght использовать линтер, который вы можете получить в своем редакторе, например, eslint / prettier formatter… и он немедленно сообщит вам об этом.

2. Спасибо! в конце я решил эту проблему .. это была ошибка в css

Ответ №1:

попробуйте предотвратить поведение по умолчанию следующим образом

 const addToBasket = (e) => {
e.preventDefault();
dispatch({
    type: 'ADD_TO_BASKET',
    item:{
        id: id,
        title: title,
        image: image, 
        price: price,
        rating: rating,  
    },
});
};
 

и вы также можете попробовать установить тип для кнопки

 <button type="button" onClick={addToBasket}>Add to Basket</button>