Добавление динамических состояний в проект React JS

#reactjs #material-ui

Вопрос:

Я создаю приложение emojipedia, в котором, как ожидается, при нажатии на эмодзи откроется модал, содержащий описание эмодзи. Насколько я знаю, для этого мне нужно сопоставить описание(содержащееся в emojipedia.js файле) эмодзи с EmojiContainer компонентом в Components папке.

Здесь возникает моя проблема, когда, когда я нажимаю на смайлик, он зависает. Почему это происходит и как это исправить???

заранее спасибо.

Комментарии:

1. Привет. Если вам нужна помощь, вам нужно, по крайней мере, предоставить пример кода.

2. Я предоставил ссылку на код и поле там.

Ответ №1:

Вы используете одно включенное состояние EmojiContainer для управления всеми модальностями в вашем списке смайликов. Как следствие, когда вы пытаетесь открыть модал, открываются все модалы. Лучшим вариантом было бы инкапсулировать всю логику относительно одного модального значения в отдельный многоразовый компонент:

 export default function Emoji({ item }) {
  const [open, setOpen] = useState(false);
  return (
    <Grid item lg={2} md={3} xs={6}>
      <ImageButton onClick={() => setOpen(true)}>
        <CardMedia
          sx={{
            "amp;:hover": {
              transform: "scale(1.3)"
            }
          }}
          component="img"
          height="100"
          image={item.link}
          alt="emoji"
        />
      </ImageButton>
      <Modal
        open={open}
        onClose={() => setOpen(false)}
        aria-labelledby="modal-modal-title"
        aria-describedby="modal-modal-description"
      >
        <Typography sx={style} variant="p">
          {item.desc}
        </Typography>
      </Modal>
    </Grid>
  );
}
 

Как вы видите, этот компонент имеет свое собственное состояние и управляет своим собственным модальным значением. В вашем смайликонтейнере вы можете использовать его следующим образом:

 export default function EmojiContainer() {
  return (
    <Grid>
      {emojipedia.map((item, index) => (
        <Grid key={index} container>
          <Emoji item={item} />
        </Grid>
      ))}
    </Grid>
  );
}
 

Из того, что я вижу, вам также нужно будет настроить модальный стиль. Вот обновленный codesandbox