【问题标题】:React useStyles Remove class name on clickReact useStyles 点击时删除类名
【发布时间】:2021-09-25 16:55:13
【问题描述】:

这几乎可以肯定是世界上最简单的事情,但不知何故在逃避我......

我有一个可供选择的 onClick 材质 UI 卡组件的选择,因此应该在选择它时添加一个类。出于某种原因,尽管所有示例似乎都表明应该删除该类,但该类的删除并不适用。我做错了什么?

为了简洁而删减...

const useStyles = makeStyles((theme: Theme) =>
    createStyles({
        cardSelected: {
            backgroundColor: theme.palette.action.selected
        },
    })
);


export const Occasion = (): JSX.Element => {
    const classes = useStyles();
    const [selected, setSelected] = useState<string>('');

    const handleSelect = (e: React.MouseEvent) => {
        const s = e.currentTarget.getAttribute("data-option");
        if (s) {
            setSelected(s);
        }
    }

    return (
        <Grid item xs={12} sm={6} md={3}>
            <CardActionArea className={classes.actionArea} onClick={handleSelect} data-option={occasion.id}>
                <Card className={ selected === occasion.id ? classes.cardSelected : '' }>
                    <IconRounded className={classes.iconItem} color="secondary" />
                    <Typography variant="h5" component="h3">{ occasion.name } </Typography>
                </Card>
            </CardActionArea>
        </Grid>
    );
}

```


Clicking a card correctly adds the desired class but does not remove it from the other card items?

【问题讨论】:

  • occasion 变量来自哪里?我没有看到它在任何地方定义。
  • 我从中收集到的是,您正在映射一个数组并生成多个 Occasion 元素?如果是这样,您应该在组件树的较高位置存储哪个是活动的,最好是在您映射到数组的组件内部。

标签: reactjs state jss


【解决方案1】:

您还需要清除selected

const useStyles = makeStyles((theme: Theme) =>
    createStyles({
        cardSelected: {
            backgroundColor: theme.palette.action.selected
        },
    })
);


export const Occasion = (): JSX.Element => {
    const classes = useStyles();
    const [selected, setSelected] = useState<string>('');

    const handleSelect = (e: React.MouseEvent) => {
        const s = e.currentTarget.getAttribute("data-option");
        if (s) {
            setSelected(s);
        } else {
            setSelected('');
        }
    }

    return (
        <Grid item xs={12} sm={6} md={3}>
            <CardActionArea className={classes.actionArea} onClick={handleSelect} data-option={occasion.id}>
                <Card className={ selected === occasion.id ? classes.cardSelected : '' }>
                    <IconRounded className={classes.iconItem} color="secondary" />
                    <Typography variant="h5" component="h3">{ occasion.name } </Typography>
                </Card>
            </CardActionArea>
        </Grid>
    );
}

在当前示例中,如果 ids 存在,您只是将其添加到 selected,但不会删除它。

编辑更新了切换功能。

const useStyles = makeStyles((theme: Theme) =>
    createStyles({
        cardSelected: {
            backgroundColor: theme.palette.action.selected
        },
    })
);


export const Occasion = (): JSX.Element => {
    const classes = useStyles();
    const [selected, setSelected] = useState<string>('');

    const toggleSelect = (e: React.MouseEvent) => {
        const s = e.currentTarget.getAttribute("data-option");
        if (s && !selected) {
            setSelected(s);
        } else {
            setSelected('');
        }
    }

    return (
        <Grid item xs={12} sm={6} md={3}>
            <CardActionArea className={classes.actionArea} onClick={toggleSelect} data-option={occasion.id}>
                <Card className={ selected === occasion.id ? classes.cardSelected : '' }>
                    <IconRounded className={classes.iconItem} color="secondary" />
                    <Typography variant="h5" component="h3">{ occasion.name } </Typography>
                </Card>
            </CardActionArea>
        </Grid>
    );
}

【讨论】:

  • 顺便说一句,示例不完整。我们从哪里获得occasion 对象数据?
  • 我试过了。在设置之前清除它,它没有任何区别
  • 啊!您需要切换功能。如果选定的值已经存在,那么您需要清理它!更新了示例。检查编辑部分。
  • 更新后的解决方案是否有效?
  • 谢谢,但问题仍然存在!即使应用了切换版本,所有项目似乎都保留了“选定”样式。需要明确的是,页面上有多个卡片,这是一个组件被渲染 x 多次......所以应该只选择一个。
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2017-10-27
  • 2019-07-19
  • 2017-11-14
  • 2022-06-28
  • 1970-01-01
  • 2021-10-05
相关资源
最近更新 更多