如何删除titles.map和titles.slice中的重复代码



如何从titles.map和titles.slice中删除重复的代码?应该如何处理,以设置应该显示的facet。功能正常工作,我只想删除重复的代码。

import { useState } from "react";
const App = () => {
const titles = [
{ id: "0", name: "Title" },
{ id: "5637144579", name: "Miss" },
{ id: "5637144576", name: "Mr." },
{ id: "5637145326", name: "MrandMrs." },
{ id: "5637144577", name: "Mrs." },
{ id: "5637144578", name: "Ms." },
{ id: "5637145330", name: "Br." },
{ id: "5637145327", name: "Dame" },
{ id: "5637144585", name: "Dr." },
{ id: "5637145331", name: "Fr." },
{ id: "5637144582", name: "I" },
];
const [isAllFacets, setIsAllFacets] = useState(false);
const MAX_FACET_COUNT = 5;
const visibleFacetCount = titles.length - 1 === MAX_FACET_COUNT ? 
titles.length : 
MAX_FACET_COUNT;
const showAllFacet = () => { setIsAllFacets(!isAllFacets); };
return (<>
{isAllFacets ? 
titles.map((title: any) => { 
return <div key={title.id}>{title.name}</div>; 
}) : 
titles.slice(0, visibleFacetCount).map((title) => { 
return <div key={title.id}>{title.name}</div>; 
})}
{titles.length > visibleFacetCount && (<>
{!isAllFacets ? (
<button onClick={showAllFacet}>show all</button>
) : (
<button onClick={showAllFacet}>show less</button>
)}
</>)}
</>);
};
export default App;                                                                                                                                                                                                                                                                           

一个选项是在isAllFacets为false的情况下,使用条件运算符对整个现有数组进行切片,而不是在要返回的整个JSX上交替,而是只在要切片的索引上交替。

类似的方法可以用于简化<button>文本。

return (
<>
{
titles
.slice(0, isAllFacets ? titles.length : visibleFacetCount)
.map(title => <div key={title.id}>{title.name}</div>)
}
{titles.length > visibleFacetCount && <button onClick={showAllFacet}>show{isAllFacets ? ' all' : ' less'}</button>}
</>
);

使用useMemo钩子可以实现您的目标。准备数据以进行显示和渲染。当depsArray内部的任何内容发生更改时,将重新计算值。

const titlesToDisplay = useMemo(() => {
return isAllFacets ? titles : titles.slice(0, visibleFacetCount);
}, [titles, isAllFacets, visibleFacetCount]);
return (
<>
{titlesToDisplay.map((title) => {
return <div key={title.id}>{title.name}</div>;
})}
{titles.length > visibleFacetCount && (
<>
{!isAllFacets ? (
<button onClick={showAllFacet}>show all</button>
) : (
<button onClick={showAllFacet}>show less</button>
)}
</>
)}
</>
);

您只需要将所有内容放在一起:

titles.slice(0, isAllFacets?titles.length:visibleFacetCount).map((title) => { return <div key={title.id}>{title.name} 
</div>; })

创建一个返回titledivrenderTitle函数
const renderTitle = title => <div key={title.id}>{title.name}</div>

然后将其传递给两个.map调用

titles.map(renderTitle)

titles.slice(0, visibleFacetCount).map(renderTitle)

对于您的按钮,请使用进行简化

<button onClick={showAllFacet}>show {isAllFacets ? "less" : "all"}</button>

最新更新