Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Por que é necessário criar dois novos estados?

Oi pessoal! Já tinha feito antes sem precisar criar dois estados novos no carrinhoContext. Como já tem a quantidade e o valor de cada produto no estado carrinho, fiz o reduce no próprio estado carrinho. O que acham dessa abordagem? Por que é necessário criar os dois novos estados "quantidade" e "valorTotal"?

Eu fiz assim:

CarrinhoContext.jsx:


import { createContext, useState } from "react";

export const CarrinhoContext = createContext();
CarrinhoContext.displayName = "Carrinho";

export const CarrinhoProvider = ({ children }) => {

  const [carrinho, setCarrinho] = useState([]);

  return (
    <CarrinhoContext.Provider value={{ carrinho, setCarrinho, quantidade, setQuantidade, valorTotal, setValorTotal }}>
      {children}
    </CarrinhoContext.Provider>
  );
};

useCarrinhoContext.js:



import { useContext } from "react"
import { CarrinhoContext } from "@/context/CarrinhoContext.jsx";

export const useCarrinhoContext = () => {

  const { carrinho, setCarrinho } = useContext(CarrinhoContext);

  function adicionarProduto(novoProduto) {
    const produtoExisteNoCarrinho = carrinho.some(itemDoCarrinho => itemDoCarrinho.id === novoProduto.id);
    if (!produtoExisteNoCarrinho) {
      novoProduto.quantidade = 1;
      setCarrinho((carrinhoAnterior) => [...carrinhoAnterior, novoProduto]);
      return;
    };
    setCarrinho((carrinhoAnterior) =>
      carrinhoAnterior.map((itemDoCarrinho) => {
        if (itemDoCarrinho.id === novoProduto.id) {
          return { ...itemDoCarrinho, quantidade: itemDoCarrinho.quantidade + 1 }
        };
        return itemDoCarrinho;
      }));
  };

  function removerProduto(id) {
    const produto = carrinho.find(itemDoCarrinho => itemDoCarrinho.id === id);
    const ehOUltimo = produto.quantidade === 1;
    if (ehOUltimo) {
      setCarrinho((carrinhoAnterior) =>
        carrinhoAnterior.filter(itemDoCarrinho => itemDoCarrinho.id !== produto.id));
      return;
    };
    setCarrinho((carrinhoAnterior) =>
      carrinhoAnterior.map((itemDoCarrinho) => {
        if (itemDoCarrinho.id === id) {
          return { ...itemDoCarrinho, quantidade: itemDoCarrinho.quantidade - 1 };
        };
        return itemDoCarrinho;
      })
    );
  };

  function removerProdutoCarrinho(id) {
    setCarrinho((carrinhoAnterior => {
      return carrinhoAnterior.filter(produto => produto.id !== id);
    }));
  };

  const valorTotalCarrinho = carrinho.reduce((total, produto) => {
    return total + (produto.preco * produto.quantidade);
  }, 0);

  return {
    adicionarProduto,
    removerProduto,
    removerProdutoCarrinho,
    valorTotalCarrinho
  };

};

Obrigado pela atenção!

1 resposta
solução!

Bom dia.

Tua abordagem de calcular diretamente o valor total e a quantidade dentro do estado carrinho usando reduce faz sentido e A vantagem disso é evitar estados adicionais e recalcular esses valores dinamicamente, o que pode simplificar um pouco a estrutura de estados.

Por outro lado, criar os dois novos estados ("quantidade" e "valorTotal") é útil em cenários específicos:

Falando de perfirmance: Ao calcular a quantidade e o valor total diretamente no render, toda vez que o carrinho é atualizado, o reduce será executado. Se o carrinho tiver muitos itens, pode haver um impacto na performance. Ter estados separados pode evitar esse cálculo repetido.

E Ao armazenar "quantidade" e "valorTotal" em estados separados, você isola o cálculo do carrinho, facilitando o acesso direto a esses valores em diferentes componentes, sem precisar recalculá-los.

Acredito que a necessidade de criar os dois novos estados depende mais do tamanho da aplicação e dos casos de uso específicos. Se a aplicação for simples e pequena, sua abordagem pode ser mais prática. Para cenários maiores, com mais cálculos e interações, os estados separados podem oferecer uma melhor performance e organização.

Abs.