Я создаю обувной веб-сайт, но есть проблема в следующем компоненте, обычно он работает нормально, но когда я пытаюсь скопировать URL-адрес в другой вкладке и попытаться открыть его напрямую, это выдает мне ошибку, потому что я предполагалось получать данные из родительского маршрута, и я попробовал следующий обходной путь, но он не работает, но почему
печатает неопределенное значение в консоли, но тогда почему console.log("fetch data data") не печатается в консоли, что означает, что перехватчик не выполняется, но почему и console.log («компонент визуализируется»); также работает, и я получаю ошибку:
Я создаю обувной веб-сайт, но есть проблема в следующем компоненте, обычно он работает нормально, но когда я пытаюсь скопировать URL-адрес в другой вкладке и попытаться открыть его напрямую, это выдает мне ошибку, потому что я предполагалось получать данные из родительского маршрута, и я попробовал следующий обходной путь, но он не работает, но почему [code]export default function Article() { console.log("component is rendered"); const { user } = useAuth(); const navigate = useNavigate(); const {id} = useParams(); // article data coming from previous route const location = useLocation() const { article } = location.state || {}; // cart const { addToCart , articleLoadingState , setArticleLoadingState } = useCart(); const [sales, setSales] = useState(0);
fetchArticleData(); // Call the async function }, [article,id]);
[/code] [code]console.log(article)[/code] печатает неопределенное значение в консоли, но тогда почему console.log("fetch data data") не печатается в консоли, что означает, что перехватчик не выполняется, но почему и console.log («компонент визуализируется»); также работает, и я получаю ошибку: [code]Article.jsx:49 Uncaught TypeError: Cannot read properties of undefined (reading 'colors') at Article (Article.jsx:49:76) [/code] из-за этой строки в коде [code] const [selectedColor, setSelectedColor] = useState(Object.keys(Article.colors)[0],);
[/code] это код компонента приложения [code]function App() { return (
{/* Protected Routes */}
); }
export default App; [/code] полный код компонента [code]import React, { useState, useEffect } from "react"; import { MdAddShoppingCart } from "react-icons/md"; import { Button , Spinner } from "@nextui-org/react"; import { fireIcon } from "../../assets/images"; import { useNavigate , useLocation , useParams} from "react-router-dom"; import { useCart } from "../../context/CartContext"; import { useAuth } from "../../context/AuthManager"; import { doc, getDoc } from "firebase/firestore";
fetchArticleData(); // Call the async function }, [article,id]);
// article data const [selectedColor, setSelectedColor] = useState(Object.keys(Article.colors)[0],);// currently selected color const [selectedImage, setSelectedImage] = useState(0); // Track the active image index const [imageCounter, setImageCounter] = useState(1); // Track the current image number (1-indexed) const [isTransitioning, setIsTransitioning] = useState(true); // To control the sliding effect const [selectedSize, setSelectedSize] = useState(Article.sizes[0]); // Default to the first size const [amount, setAmount] = useState(1);
const handleColorChange = (color) => { setSelectedColor(color); setSelectedImage(0); // Reset selected image when changing color setImageCounter(1); // Reset counter when changing color setIsTransitioning(false); // Temporarily stop the sliding effect };
const handleImageSelect = (index) => { setSelectedImage(index); // Update the active image setImageCounter(index + 1); // Update the counter (1-indexed) };
// Set up the automatic image change every 5 seconds useEffect(() => { const interval = setInterval(() => { setSelectedImage((prevIndex) => { let nextIndex = prevIndex + 1;
// If the next index exceeds the number of images, reset to 0 if (nextIndex >= articleData.images[selectedColor].length) { nextIndex = 0; setIsTransitioning(false); // Stop the sliding effect temporarily setTimeout(() => { setIsTransitioning(true); // Re-enable the sliding effect after a brief pause }, 0); // Wait for a short period before re-enabling the transition }
return () => clearInterval(interval); // Clean up the interval when the component unmounts }, [selectedColor, articleData.images]);
useEffect(() => { // Set initial sales value to a random number between 10 and 15 const initialSales = Math.floor(Math.random() * (15 - 10 + 1)) + 10; setSales(initialSales);
// Set up interval to increment sales by 1, 2, or 3 every 2 minutes const interval = setInterval( () => { const increment = Math.floor(Math.random() * 3) + 1; // Random value between 1 and 3 setSales((prevSales) => prevSales + increment); }, 5 * 60 * 1000, ); // 2 minutes in milliseconds
return () => clearInterval(interval); // Clean up the interval on component unmount }, []);