You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化React组件中重复的isPressedStyle逻辑?

合并按压样式逻辑的解决方案

当然可以把两个按压样式的逻辑合并成一行,直接根据variant和isPressed的状态生成对应的样式对象,避免代码重复。

修改后的核心代码

把原来的isPressedStyle和isPressedStyle2替换成单个变量,两种写法任选其一:

写法一:嵌套三元表达式(简洁紧凑)

const pressedStyle = isPressed 
  ? variant === "white" 
    ? { backgroundColor: "gray" } 
    : { opacity: 0.5 } 
  : {};

写法二:对象扩展语法(逻辑更直观)

const pressedStyle = isPressed ? {
  ...(variant === "white" && { backgroundColor: "gray" }),
  ...(variant === "transparent" && { opacity: 0.5 })
} : {};

完整修改后的ListItem组件

export function ListItem({ variant }: ListItemProps) {
    const [isPressed, setIsPressed] = React.useState(false);
    // 合并后的按压样式逻辑
    const pressedStyle = isPressed 
      ? variant === "white" 
        ? { backgroundColor: "gray" } 
        : { opacity: 0.5 } 
      : {};

    function onPressIn() {
        setIsPressed(true);
    }
    function onPressOut() {
        setIsPressed(false);
    }
    return (
        <View style={[ styles.row, variant === "white" && styles.backgroundColorWhite]}>
            <Pressable
                onPressIn={onPressIn}
                onPressOut={onPressOut}
                style={[
                    styles.container,
                    pressedStyle // 只用这一个变量即可
                ]}
            >
            </Pressable>
        </View>
    );
}

逻辑说明

  • 当isPressed为false时,直接返回空对象,不添加任何按压样式
  • 当isPressed为true时,根据variant的值返回对应样式:
    • 若variant是white,返回背景色为灰色的样式
    • 若variant是transparent,返回透明度为0.5的样式

这样既精简了代码,也让按压状态的样式逻辑更集中,后续维护起来更方便。

内容的提问来源于stack exchange,提问作者CodingProfile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:46:30