Here I have an error that says:
Expected an assignment or function call and instead saw an expression no-unused-expressions
I want onClick put my const handleCompleted with ternary. I think it's just a problem with {} or (), I did lots of things but I always have this error message.
const Filters = ({ listTask, setListTask, filters, setFilters }) => {
const [completed, setCompleted] = useState(false);
const handleCompleted = () => {
const newFilters = { ...filters };
{
completed
? (setCompleted(false),
(newFilters.status.completed = ""),
setFilters(newFilters))
: (setCompleted(true),
(newFilters.status.completed = "Completed"),
setFilters(newFilters));
}
};
return(...);
};
I'm pretty sure, it has to do with the weird ternary construction. It's probably just an error in ESLint.
BUT: A ternary operator should be used for conditionally assigning values to variables.
Although it CAN be used as a replacement for if ()
, it SHOULD NOT be used that way.
The reason is simple: It's unreadable and is prone to unwanted side effects that are hard to debug. Just don't ever use ternaries as a replacement for if ()
.
Try this instead. I think you find it even more readable.
const Filters = ({ listTask, setListTask, filters, setFilters }) => {
const [completed, setCompleted] = useState(false);
const handleCompleted = () => {
const newFilters = { ...filters };
// this is how you should use ternaries:
newFilters.status.completed = completed ? '' : 'Completed'
setCompleted(!completed)
setFilters(newFilters)
};
return(...);
};
There is some redundant logic ( setFilters(newFilters)
twice), in addition, you only made a shallow copy of filters
( {...filters}
), therefore you mutate state ( newFilters.status.completed =...
).
I would rewrite it to something like:
const Filters = ({ listTask, setListTask, filters, setFilters }) => {
const [completed, setCompleted] = React.useState(false);
const handleCompleted = () => {
setFilters((filters) => ({
...filters,
status: { ...filters.status, completed: completed ? "" : "Completed" }
}
));
setCompleted(prev => !prev);
};
return <>...</>;
};
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.