javascript - 将 If/Else 转换为三元 React Typescript
问题描述
我在 React 和 Typescript 中有一个项目,正在创建一个 Like 按钮并创建了一个 if/else 语句,如下所示:
const [count, setCount] = useState(0);
const [iconFill, setFill] = useState('gray');
const favoriteCount = () => {
if(iconFill == 'red') {
setCount(count - 1 );
setFill('gray');
}
else {
setCount(count + 1);
setFill('red');
}
}
代码按预期工作,但我想知道是否有更简洁的编写方式,我尝试使用三元语句:
iconFill == 'red' ? setCount(count - 1 ) && setFill('gray') : setCount(count + 1) && setFill('red');
我不确定为什么这不会产生相同的结果,并且还会收到以下 Typescript 错误:
An expression of type 'void' cannot be tested for truthiness
解决方案
我认为您原来的现有代码很好 - 使用条件运算符不仅使它更难阅读,而且它也不合适,因为条件运算符意味着在您想要有条件地生成表达式时使用(但是这里的结果表达式没有被使用)。if/else
更合适。
但是有一种替代方法可以使您的代码更简洁。因为它看起来像是iconFill
在灰色和红色之间切换,所以将该状态设置为布尔值而不是字符串如何?然后你可以反转布尔值:
const [fillGray, setFillGray] = useState(true);
const favoriteCount = () => {
setCount(count + (fillGray ? 1 : -1));
setFillGray(!fillGray);
}
上面使用了条件运算符,但它在更合适的上下文中使用,因为结果被用作表达式(即计算为1
or -1
)而不是作为 if/else 的不适当替代。
推荐阅读
- firebase - 访问字段键:来自当前用户的已验证用户的值对
- java - Jtable添加带有字符串和双打的行
- r - R freezes when trying to install packages using install.packages
- mysql - How to fix the issue "Timeout after [300] seconds waiting for service container stability. Operation will roll back."?
- javascript - How to access a function or variable from the parent iframe in jquery
- javascript - React Native Alarm Notification: Alarms set successfully but notification is comes only once for multiple alarms
- flutter - How to resize image in pure code using Dart?
- angular - 如何在Angular中检测具有相同值@Input()的变化?
- ms-access - Store filtered employees in training record
- kubernetes - Are Kubernetes requests really guaranteed?