我正在做这个前端导师挑战,大部分功能都已实现。我可以根据数据的isActive
属性进行过滤,根据它们是否处于活动状态来显示正确的项目。但我搞不清楚如何更新单个项目的isActive
状态,以及如何在切换时重新渲染应用,以便将项目移动到正确的过滤器中。
以下是代码App.jsx
:
function App() {
const [data, setData] = useState([]);
const [filteredData, setFilteredData] = useState(data);
const [activeFilter, setActiveFilter] = useState("All");
// Fetch and set the data.
useEffect(() => {
fetch("../data.json")
.then((response) => response.json())
.then((data) => setData(data))
.catch((error) => console.error("error", error));
}, []);
// Filter the data
useEffect(() => {
if (activeFilter === "All") {
setFilteredData(data);
} else if (activeFilter === "Active") {
setFilteredData(data.filter((item) => item.isActive === true));
} else {
setFilteredData(data.filter((item) => item.isActive === false));
}
}, [activeFilter, data]);
return (
<div className="w-full h-full bg-linear-to-b from-[#040918] to-[#091540] py-6 px-3 flex flex-col text-white">
{/* Header */}
<Header />
{/* Options */}
<Options activeFilter={activeFilter} setActiveFilter={setActiveFilter} />
{/* Cards */}
{filteredData &&
filteredData.map((item) => (
<Card
logo={item.logo}
name={item.name}
description={item.description}
isActive={item.isActive}
key={item.name}
setFilteredData={setFilteredData}
filteredData={filteredData}
/>
))}
</div>
);
}
这是Card.jsx
带有拨动开关的:
const Card = ({
logo,
name,
description,
isActive,
filteredData,
setFilteredData,
}) => {
const [activeState, setActiveState] = useState(isActive);
function handleClick() {
setActiveState(!activeState);
}
return (
<div className="bg-neutral-700 p-4 rounded-xl border border-neutral-600 mt-4">
<div className="flex items-start gap-4">
{/* Logo */}
<img src={logo} alt="Extension Image" />
{/* Name and Description */}
<div className="flex flex-col gap-2 mb-8">
<h2 className="font-semibold text-xl">{name}</h2>
<p className="text-sm font-light">{description}</p>
</div>
</div>
{/* Remove Button */}
<div className="flex justify-between items-center">
<div className="border border-neutral-600 rounded-full px-3 py-1 flex items-center justify-center">
<button>Remove</button>
</div>
{/* Is Active Toggle */}
<div className="flex items-center justify-center">
<label
htmlFor={`${name}Toggle`}
className="flex items-center cursor-pointer "
>
<div className="relative">
<input
id={`${name}Toggle`}
type="checkbox"
className="sr-only"
onClick={handleClick}
/>
<div
className={`flex items-center ${
activeState ? "bg-red-400 " : "bg-gray-600 "
} w-11 h-6 rounded-full transition-all px-[2px]`}
>
<div
className={`bg-white w-5 h-5 rounded-full ${
activeState ? "translate-x-5" : "translate-x-0"
} transition-all`}
></div>
</div>
</div>
</label>
</div>
</div>
</div>
);
};
我试图在卡片handleclick
函数里找到同样的方法,将特定卡片的名称与物品的名称匹配,filteredData
然后……翻转它的isActive
状态?我不知道该怎么做,我甚至不确定这是不是最好的方法。