Обновление моего хранилища данных из API одним нажатием кнопки

Я попытался обновить хранилище 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), что позволяет изменять содержимое и структуру веб-страницы.


50
3

Ответы:

Решено

Вместо кнопок вы используете теги привязки. Тег привязки перезагружает страницу при нажатии, и когда страница перезагружается, ваш магазин 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.