Я попытался обновить хранилище Redux моего приложения с помощью кнопки, но каждый раз, когда нажимается кнопка и сопоставляются данные из API, он не обновляет хранилище ожидаемым значением.
Я записал ожидаемое значение (product.title) в консоль и заметил, что оно исчезает почти сразу же, как появляется на консоли. Что мне сделать, чтобы остаться
Вот мой код
import { useEffect, useState } from "react";
import "../styles/BestSellers.css";
import { useDispatch } from "react-redux";
import { setItem } from "../features/ProductState";
function BestSellers() {
const [products, setProducts] = useState([]);
const [count, setCount] = useState(10);
const dispatch = useDispatch();
useEffect(() => {
fetch(`https://dummyjson.com/products?limit=${count}`)
.then((res) => res.json())
.then((data) => {
setProducts(data.products);
});
}, [count]);
const loadMore = () => {
setCount((prevCount) => prevCount + 5);
};
const handleAction = (product) => {
dispatch(
setItem({
title: product.title,
image: product.image,
price: product.price,
})
);
};
return (
<div className = "container">
<div className = "products">
{products.map((product) => (
<a
onClick = {() => {
handleAction(product);
}}
className = "link"
href = "/shop"
key = {product.id}
>
<div className = "product">
<h5>{product.title}</h5>
<p>English Department</p>
<span className = "prices">
<h4 className = "discount">$16.48</h4>
<h4>${product.price}</h4>
</span>
</div>
</a>
))}
</div>
<button onClick = {loadMore} className = "btn">
LOAD MORE PRODUCTS
</button>
</div>
);
}
export default BestSellers;
🤔 А знаете ли вы, что...
JavaScript можно использовать для манипуляции DOM (Document Object Model), что позволяет изменять содержимое и структуру веб-страницы.
Вместо кнопок вы используете теги привязки. Тег привязки перезагружает страницу при нажатии, и когда страница перезагружается, ваш магазин Redux повторно инициализируется. Не используйте подобные теги привязки.
Пример использования элемента button
:
<div className = "products">
{products.map((product) => (
<button
key = {product.id}
onClick = {() => {
handleAction(product);
}}
className = "link"
>
<div className = "product">
<h5>{product.title}</h5>
<p>English Department</p>
<span className = "prices">
<h4 className = "discount">$16.48</h4>
<h4>${product.price}</h4>
</span>
</div>
</a>
))}
</div>
Потому что вы используете элемент <a></a>
Вы можете попробовать использовать <button />
Навигация внутри одностраничного приложения должна осуществляться через маршрутизатор, чтобы избежать перезагрузки/повторной инициализации страницы. Подобно кнопке перезагрузки в браузере, это инициализирует хранилище redux.
В зависимости от вашей версии реагирования навигация должна обрабатываться немного по-другому. Вот несколько примеров из другого поста: https://stackoverflow.com/a/42121109/19801189 Для взаимодействия с кнопками магазина лучше всего подойдет onClick.