3 回答

TA貢獻1799條經驗 獲得超8個贊
如果我是你,我會簡化事情。首先,我將從array組件中提取內容,因為您不希望每次重新渲染組件時都重新渲染該組件。然后,我會更改您的狀態并僅保留items將包含array項目的狀態。我還會array通過提供一個 flag 來擴展這些項目isVisible。然后,我將刪除您的useEffect并改進您的handleClick,因為您只想在單擊按鈕時觸發此操作。在該函數中,我將通過映射您的項目并將“未單擊”項目更改為 false 來handleClick創建一組新項目。這樣,您就知道要隱藏哪些項目。最后,我將根據屬性渲染組件。因此,如果為 true,則該項目將被設置為渲染,反之亦然。itemsisVisibleisVisibleisVisiblehiddenfalse
這樣代碼就更加簡單、性能更高并且更容易理解。另外,它執行了您所要求的操作。
這是示例工作代碼的鏈接:codesandbox
import React, { useState } from "react";
const Comp1 = () => <div>hi</div>;
const Comp2 = () => <div>hi2</div>;
const Comp3 = () => <div>hi3</div>;
const array = [
{ id: 1, component: <Comp1 />, isVisible: true },
{ id: 2, component: <Comp2 />, isVisible: true },
{ id: 3, component: <Comp3 />, isVisible: true }
];
export const Test = () => {
const [items, setItems] = useState(array);
const handleClick = (number) => {
const triggeredItems = items.map((item) => {
if (item.id !== number) {
item.isVisible = !item.isVisible;
}
return item;
});
setItems(triggeredItems);
};
return (
<div className="flex">
{items.map(({ id, component, isVisible }) => (
<div
key={id}
className="h-12 w-12 bg-gray-400 m-1 flex items-center justify-center"
onClick={() => handleClick(id)}
hidden={!isVisible}
>
{component}
</div>
))}
</div>
);
};
export default Test;

TA貢獻2019條經驗 獲得超9個贊
const [currentComponent, setCurrentComponent] = useState(1);
const handleClick = () =>{
switch(currentComponent){
case 1:
setCurrentComponent(2)
case 2:
setCurrentComponent(3)
case 3:
setCurrentComponent(4)
case 4:
setCurrentComponent(1)
}
}
<button onClick={()=> handleClick()}>Click me!</button>
{currentComponent == 1 && <Comp1/>};
{currentComponent == 2 && <Comp2/>};
{currentComponent == 3 && <Comp3/>};
{currentComponent == 4 && <Comp4/>};

TA貢獻1772條經驗 獲得超5個贊
一種簡單的方法是在 useState 或 mobx 等狀態中保存一個布爾值(例如 isVisible = true )。然后在 React 組件中,您可以使用雙 & 符號,如下所示:
{isVisible && <MyComponent/>}
這將僅顯示 isVisible = true
添加回答
舉報