javascript 无法删除循环中的特定卡组件[重复]

yvfmudvl  于 5个月前  发布在  Java
关注(0)|答案(2)|浏览(73)

此问题在此处已有答案

I am unable to remove a specific card component in a loop(1个答案)
2天前关闭

const MealBox = ({ mealTime, setShowBox }: { mealTime: string; setShowBox: any }) => {
    const [meal, setMeal] = useState("Jollof rice")
    
    // console.log('meal', meal)
    
    return (
        <Box border={'1px solid #f0eeeb'} rounded={'lg'} p="10px">
            <Flex
                alignItems={'center'}
                gap={'25px'}
                w={'270px'}
                justifyContent={'space-between'}
            >
                <Box w='full'>
                    <Flex justify={'space-between'}>
                        <Text fontWeight={'semibold'}>{mealTime}</Text>
                        <MdOutlineRefresh size={24} />
                    </Flex>
                    <Select onChange={(e) => setMeal(e.target.value)} value={meal}>
                        <option value="Jollof rice">Jollof Rice</option>
                        <option value="Spaghetti">Spaghet

ti</option>
                </Select>
            </Box>
        </Flex>

        <Box bg={'#f8f8f7'} p="10px" mt="15px" rounded={'lg'}>
            <Flex alignItems={'center'} justifyContent={'space-between'}>
                <Text fontWeight={'semibold'}>{meal}</Text>
                <Box onClick={() => setShowBox(false)} cursor={'pointer'}>
                    <LiaTimesSolid />
                </Box>
            </Flex>
            <Text>Chicken Republic - Gbagada</Text>
            <Text fontWeight={'medium'}>NGN 2,500</Text>
            <Flex alignItems={'center'} gap={'15px'} mt={'10px'}>
                <Text>Sides:</Text>
                <Select>
                    <option value="Youghurt">Youghurt</option>
                    <option value="Orange juice">Orange juice</option>
                </Select>
            </Flex>
            <Flex alignItems={'center'} gap={'15px'} mt={'10px'}>
                <Text>Extras:</Text>
                <Select>
                    <option value="Youghurt">Plantain</option>
                    <option value="Orange juice">Coleslaw</option>
                </Select>
            </Flex>
        </Box>
    </Box>
);

上面的代码是一个卡片组件,它有一个取消图标,单击该图标将删除卡片。

const [showBreakfastBox, setShowBreakfastBox] = useState(true);
const [showLunchBox, setShowLunchBox] = useState(true);
const [showDinnerBox, setShowDinnerBox] = useState(true);


这些usestate变量用于有条件地呈现是显示mealbox组件还是显示addfood组件-

{Array(7)
            .fill(0)
            .map((item, idx) => {

                const tomorrow = new Date(currentDate)
                tomorrow.setDate(currentDate.getDate() + idx + 1);

                const formattedDate = tomorrow.toLocaleDateString('en-US', { month: 'long', day: 'numeric' });

                const dayOfWeek = tomorrow.toLocaleDateString('en-US', { weekday: 'long' })

                return (
                    <Box
                        key={idx}
                        overflowX={'scroll'}
                        sx={{
                            '::-webkit-scrollbar': {
                                display: 'none',
                            },
                        }}
                        maxW={'1420px'}
                        w={'1420px'}
                        my={'25px'}
                        mx="auto"
                    >
                        <Flex gap={'15px'} width={(10 * 270).toString() + 'px'}>
                            <Box w={'170px'}>
                                <Text>{formattedDate}</Text>
                                <Text fontWeight={'semibold'}>{dayOfWeek}</Text>
                                <Text fontSize={'.875rem'} color='#AA9F93'>1669 Calories</Text>
                                <Box mt='10px'>
                                    <MdOutlineRefresh size={24} />
                                </Box>
                            </Box>

                            {
                                showBreakfastBox
                                    ? <MealBox mealTime={'Breakfast'} setShowBox={setShowBreakfastBox} />
                                    : <AddFood mealTime={'Breakfast'} setShowBox={setShowBreakfastBox} />
                            }
                            {
                                showLunchBox
                                    ? <MealBox mealTime={'Lunch'} setShowBox={setShowLunchBox} />
                                    : <AddFood mealTime={'Lunch'} setShowBox={setShowLunchBox} />
                            }
                            {
                                showDinnerBox
                                    ? <MealBox mealTime={'Dinner'} setShowBox={setShowDinnerBox} />
                                    : <AddFood mealTime={'Dinner'} setShowBox={setShowDinnerBox} />
                            }
                            
                            <SnackBox />
                        </Flex>
                    </Box>
                );
            })}


在这段代码中,我在屏幕上呈现了mealbox组件,并使用前面声明的usestate变量,通过addfood组件有条件地呈现它,但我现在面临的问题是,每当我单击“取消”按钮时,都会出现此循环。所有的7卡组件都离开屏幕,目标是只让一个组件离开屏幕。2我将感激我能得到的每一种帮助来解决这个问题问题.

pw136qt2

pw136qt21#

我已经弄明白了,所以我认为我不应该在循环中删除mealbox卡,所以我创建了一个新的组件,在组件中做了条件渲染,在组件中也删除了卡,我在循环中渲染了新的组件。

const CheckLoop = ({mealTime}: {mealTime: string}) => {
    const [showInitialBox, setShowInitialBox] = useState(true);
    
    return (
        showInitialBox
            ? <MealBox mealTime={mealTime} setShowBox={setShowInitialBox} />
            : <AddFood mealTime={mealTime} setShowBox={setShowInitialBox} />
    )
}

字符串
我做了一些类似的事情,并将Checkloop组件放入array.map

7uhlpewt

7uhlpewt2#

您遇到的行为是因为showBreakfastBoxshowLunchBoxshowDinnerBox状态在每日膳食的所有七个示例中共享。当其中任何一个被设置为false时,它都会影响所有七天,因为它们都引用相同的状态变量。
为了解决这个问题,你需要为每一天维护不同的状态,一种方法是使用一个对象数组,每个对象代表一天的状态。

const [days, setDays] = useState(Array(7).fill().map(() => ({
    showBreakfastBox: true,
    showLunchBox: true,
    showDinnerBox: true
})));

字符串
现在,您需要修改呈现逻辑以使用特定日期的状态。

{days.map((day, idx) => {
    // ...your existing code to calculate tomorrow, formattedDate, and dayOfWeek

    const setShowBox = (meal, show) => {
        setDays(currentDays => {
            const newDays = [...currentDays];
            newDays[idx] = {
                ...newDays[idx],
                [meal]: show
            };
            return newDays;
        });
    };

    return (
        <Box key={idx} /* ...rest of your props */>
            <Flex /* ...rest of your props */>
                {/* ...rest of your components */}
                {
                    day.showBreakfastBox
                        ? <MealBox mealTime={'Breakfast'} setShowBox={(show) => setShowBox('showBreakfastBox', show)} />
                        : <AddFood mealTime={'Breakfast'} setShowBox={(show) => setShowBox('showBreakfastBox', show)} />
                }
                {
                    day.showLunchBox
                        ? <MealBox mealTime={'Lunch'} setShowBox={(show) => setShowBox('showLunchBox', show)} />
                        : <AddFood mealTime={'Lunch'} setShowBox={(show) => setShowBox('showLunchBox', show)} />
                }
                {
                    day.showDinnerBox
                        ? <MealBox mealTime={'Dinner'} setShowBox={(show) => setShowBox('showDinnerBox', show)} />
                        : <AddFood mealTime={'Dinner'} setShowBox={(show) => setShowBox('showDinnerBox', show)} />
                }
                {/* ...rest of your components */}
            </Flex>
        </Box>
    );
})}

相关问题