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
添加回答
举报