我正在创建一个todo列表,在下面的Tasks组件中,我有一个li组件,其中包含Map的数据,我想有条件地在任务上添加删除线,我使用了intial属性为null的useState挂接。然后,我添加了onClick函数,分别将状态更改为true和false,但我的样式没有被应用:(下面是相同的代码
`import React, {useState} from 'react';
import "./Tasks.css";
import DoneIcon from '@mui/icons-material/Done';
import CloseIcon from '@mui/icons-material/Close';
function Tasks(props) {
const [done, setDone] = useState(null);
return (
<div className="tasks">
{props.items.map(item => (
<li key={item.id} onClick={() => setDone(false)} style={{textDecorationLine: done && 'line-through'}}>{item.text}
<div>
<button onClick={() => setDone(true)} style={{color: "green"}}><DoneIcon/></button>
<button style={{color: "red"}}><CloseIcon/></button>
</div>
</li>
))}
</div>
)
}
export default Tasks;`
我正在创建一个todo列表,在下面的Tasks组件中,我有一个li组件,其中包含Map的数据,我想有条件地在任务上添加删除线,我使用了intial属性为null的useState挂接。然后,我添加了onClick函数,分别将状态更改为true和false,但我的样式没有被应用:(以下是相同的代码
2条答案
按热度按时间a9wyjsp71#
您的代码有两个问题:
1.如果要保存每个任务的状态,不能使用单个布尔值。需要为每个任务保存一个值的数组或对象。
1.当您单击Done按钮时,两个
onClick
回调都会被触发(一个用于<button>
,另一个用于<li>
),将done
的值设置为true
,然后立即再次设置为false
。要求解[1],可以将
done
变量设置为一个对象,其中每个键都是一个项目ID,匹配值是一个布尔值,用于确定任务是否完成。要求解[2],请从
<li>
中删除onClick
。如果您在按钮的onClick
中根据以前的状态设置任务状态,您仍然可以实现切换效果。下面的代码应该是您所需要的:
u3r8eeie2#
您需要保存
item.id
来确定单击了哪个项目,而不是保存布尔值。