css 应用了MUI makeStyles()类,但在使用classList时未反映样式,add('class-name')

8yparm6h  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(151)

我用MUI makeStyles()写了一堆CSS类。在这些类中,我动态地向文件drag-and-drop事件中的Box元素添加和删除一个类。
这个类被成功地应用了,我甚至可以看到当我在我的元素上拖动一个文件时它被应用了。但是,我看不到类中的样式应用于我的元素。我不知道什么是错的,任何帮助将不胜感激。
下面是我的代码片段-

const useStyles = makeStyles({
  imageUploader: {
    width: '100%',
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    justifyContent: 'center',
    gap: '8px',
    padding: '24px 16px',
    border: '1px dashed #AAAAAA',
    borderRadius: '4px',
    cursor: 'pointer',
  },
  imageUploaderDrop: {
    background: '#e4e4e4',
  },
});

export default function ImageUploader() {
  const styles = useStyles();
  const imageUploaderContainer = useRef<HTMLDivElement>(null);
  const imageUploader = useRef<HTMLInputElement>(null);

  const classList = () => imageUploaderContainer.current?.classList;

  const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {
    e.preventDefault();
    const file = e.dataTransfer.files[0];
    classList()?.remove('imageUploaderDrop');
  };

  const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {
    e.preventDefault();
    if (!classList()?.contains('imageUploaderDrop')) {
      classList()?.add('imageUploaderDrop');
    }
  };

  const handleDragLeave = () => {
    if (classList()?.contains('imageUploaderDrop')) {
      classList()?.remove('imageUploaderDrop');
    }
  };

return (
    <Box
      className={styles.imageUploader}
      onClick={() => imageUploader.current?.click()}
      onDrop={handleDrop}
      onDragLeave={handleDragLeave}
      onDragOver={handleDragOver}
      ref={imageUploaderContainer}
    >
      ...
    </Box>
e37o9pze

e37o9pze1#

为了避免className冲突,MUI makeStyles生成动态类,并在类后面附加一个随机ID。例如,在我们的例子中,它将是类似makeStyles-imageUploaderDrop-62的东西。
从这里开始,当我使用classList.add('imageUploaderDrop')时,尽管它应用于DOM,但它与动态className并不完全相同。因此类样式是不可见的。
要解决这个问题,可以直接从useStyles()钩子访问动态className。并且可以使用classList方法添加和移除它。

const styles = useStyles();
element.classList.add(styles.imageUploaderDrop);

相关问题