如何在反应打字稿中更改数组中的图标
How to change icon in an array in react typescript
我正在尝试创建手风琴,当您单击它时它会向下滑动并更改图标
这是我在 App.tsx
中的以下代码:
const accordionList = [
{
title: "Horses can..."
icon: "",
pointer: ""
},
{
title: "Rhino skin maybe.."
icon: "",
pointer: ""
},
{
title: "If you looking..."
icon: "",
pointer: ""
}
]
function App() {
const [icon, setIcon] = useState([''])
const toggleAccordion = (accordion: any, index: any) => {
const iconRotate = [...accordion.pointer];
iconRotate[accordion.pointer] = '';
setIcon(iconRotate[accordion.pointer])
accordion.pointer = icon;
}
return (
<div className="App">
<div className="App-header">
{accordionList.map((accordion, index) => (
<ul className="accordion-list" key={index}>
<div className="accordion-item">
<button onClick={() => toggleAccordion(accordion, index)}>{accordion.icon} {icon} </button>
<Accordion accordion={accordion} />
</div>
</ul>
))}
</div>
</div>
);
}
export default App;
这是我在 Accordion.tsx
中的以下代码:
interface Props {
accordion: { title: string, icon: string;}
}
export const Accordion: React.FC<Props> = (props) => {
const { accordion } = props;
return (
<div>
{accordion.title}
</div>
)
};
现在我的 toggleAccordion
函数在点击时没有改变图标。如何改进我的功能?
指向对象数组的更新指针
根据我对您要完成的工作的理解,要更改图标,您只需要更新 icon
状态而不是更新 accordionList.pointer
内的指针并维护此图标您拥有的图标列表中所有项目的状态。我建议您将手风琴项目分成自己的组件,图标状态如下:
App.js
文件:
const accordionList = [
{
title: "Horses can..."
icon: "",
pointer: ""
},
{
title: "Rhino skin maybe.."
icon: "",
pointer: ""
},
{
title: "If you looking..."
icon: "",
pointer: ""
}
]
function App() {
return (
<div className="App">
<div className="App-header">
{accordionList.map((accordion, index) => (
<ul className="accordion-list" key={index}>
<AccordionItem accordion={accordion}/>
</ul>
))}
</div>
</div>
);
}
export default App;
AccordionItem
组件:
function AccordionItem({accordion}) {
const [indicatorIcon, setIndicatorIcon] = useState('')
const toggleAccordion = () => {
setIndicatorIcon('');
}
return (
<div className="accordion-item">
<button
onClick={() => toggleAccordion(accordion, index)}
>{accordion.icon} {icon} </button>
<Accordion accordion={accordion} />
</div>
);
}
export default App;
您可以保持 Accordion
不变。这将分离您的关注点,帮助您只需要关心 AccordionItem
的状态,这将消除任何不必要的复杂数组操作。
我正在尝试创建手风琴,当您单击它时它会向下滑动并更改图标
这是我在 App.tsx
中的以下代码:
const accordionList = [
{
title: "Horses can..."
icon: "",
pointer: ""
},
{
title: "Rhino skin maybe.."
icon: "",
pointer: ""
},
{
title: "If you looking..."
icon: "",
pointer: ""
}
]
function App() {
const [icon, setIcon] = useState([''])
const toggleAccordion = (accordion: any, index: any) => {
const iconRotate = [...accordion.pointer];
iconRotate[accordion.pointer] = '';
setIcon(iconRotate[accordion.pointer])
accordion.pointer = icon;
}
return (
<div className="App">
<div className="App-header">
{accordionList.map((accordion, index) => (
<ul className="accordion-list" key={index}>
<div className="accordion-item">
<button onClick={() => toggleAccordion(accordion, index)}>{accordion.icon} {icon} </button>
<Accordion accordion={accordion} />
</div>
</ul>
))}
</div>
</div>
);
}
export default App;
这是我在 Accordion.tsx
中的以下代码:
interface Props {
accordion: { title: string, icon: string;}
}
export const Accordion: React.FC<Props> = (props) => {
const { accordion } = props;
return (
<div>
{accordion.title}
</div>
)
};
现在我的 toggleAccordion
函数在点击时没有改变图标。如何改进我的功能?
指向对象数组的更新指针
根据我对您要完成的工作的理解,要更改图标,您只需要更新 icon
状态而不是更新 accordionList.pointer
内的指针并维护此图标您拥有的图标列表中所有项目的状态。我建议您将手风琴项目分成自己的组件,图标状态如下:
App.js
文件:
const accordionList = [
{
title: "Horses can..."
icon: "",
pointer: ""
},
{
title: "Rhino skin maybe.."
icon: "",
pointer: ""
},
{
title: "If you looking..."
icon: "",
pointer: ""
}
]
function App() {
return (
<div className="App">
<div className="App-header">
{accordionList.map((accordion, index) => (
<ul className="accordion-list" key={index}>
<AccordionItem accordion={accordion}/>
</ul>
))}
</div>
</div>
);
}
export default App;
AccordionItem
组件:
function AccordionItem({accordion}) {
const [indicatorIcon, setIndicatorIcon] = useState('')
const toggleAccordion = () => {
setIndicatorIcon('');
}
return (
<div className="accordion-item">
<button
onClick={() => toggleAccordion(accordion, index)}
>{accordion.icon} {icon} </button>
<Accordion accordion={accordion} />
</div>
);
}
export default App;
您可以保持 Accordion
不变。这将分离您的关注点,帮助您只需要关心 AccordionItem
的状态,这将消除任何不必要的复杂数组操作。