Как изменить содержимое карты MUI при наведении

Я хочу изменить карту только с изображением на карту с содержимым. По сути, в моем портфолио я хотел бы отобразить логотип моего проекта, а затем, наведя на него курсор, он должен показать название / используемые языки / описание. В настоящее время у меня есть код:

              <Card sx = {{ width: 1, height: 250 }}>
                <CardActionArea>
                  <CardMedia
                    sx = {{ 
                      height: 250,
                      ':hover': {
                        // call a function here I believe?
                      },
                     }}
                    image = {project.image}
                    title = "green iguana"
                  />
                </CardActionArea>
              </Card>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете активировать CSS только с помощью sx реквизита MUI. Чтобы запускать функции, вы можете обернуть свои компоненты Card с помощью div и использовать свойства onMouseEnter и onMouseLeave.

Вот очень простой пример:

  const [myColor, setMyColor] = useState('red');

  <Card sx = {{ maxWidth: 345 }}>
     <div onMouseEnter = {() => setMyColor('green')} onMouseLeave = {() => setMyColor('red')}>
        <CardMedia sx = {{ height: 140, border: '2px dashed', borderColor: myColor }}
        />
     </div>
  </Card>

Я надеюсь, что это помогает.

Ответ принят как подходящий

Симран Сингх прав. Однако пример кода изменяет свойства CSS компонента CardMedia, а вопрос заключается в том, как изменить содержимое самой карты MUI. В приведенном ниже примере изменяется содержимое карты MUI. Это можно увидеть в этой живой демонстрации . Доступен демо репозиторий кода. Основной код компонента приведен ниже.

приложение.jsx

...

import img from './../assets/images/purple.jpg';

const App = () => {

    const [ isHovered, setIsHovered ] = useState( false );
    const project = {
        image: img
    };

    function handleMouseOver() {
        setIsHovered( true );
    }

    function handleMouseOut() {
        setIsHovered( false );
    }

    return (
        <Card sx = {{ width: '360px', height: '250px' }}>
            <CardActionArea
                onMouseOver = { handleMouseOver }
                onMouseOut = { handleMouseOut }
            >
                { isHovered
                    ?     <CardContent sx = { { minHeight: '220px' } } >
                            <CardHeader
                                action = {
                                    <IconButton aria-label = "settings">
                                    <MoreVertIcon />
                                    </IconButton>
                                }
                                title = "My Title"
                                subheader = "All the cool languages"
                            />
                            <Box ml = { 2 }>
                                <Typography variant = "body1" color = "text.primary">
                                    More information...
                                </Typography>
                                <Typography variant = "body1" color = "text.primary">
                                    Description of my cool projects!
                                </Typography>
                            </Box>
                            <CardActions>
                                <IconButton>
                                    { 'Click Me to Learn More!' }
                                    <TouchAppIcon size = { 'large' } />
                                </IconButton>
                            </CardActions>
                        </CardContent>
                    :   <CardMedia
                            sx = {{
                                height: 250,
                                '&:hover': {
                                    '*': 'inherit' // Nope. Code does not go here.
                                },
                             }}
                            image = { project.image }
                            title = "green iguana"
                        />
                }
            </CardActionArea>
        </Card>
    );
};

export default App;

Обновлять

Эффект наведения для нескольких карт

Необходимые изменения находятся в строках кода, показанного ниже.

export default function Projects() {
    const [isHoveredId, setIsHoveredId] = useState( '' );
    let projectList;

    function handleMouseOver( ID ) {
        return () => {
            setIsHoveredId( ID );
        }
    }

    function handleMouseOut() {
         setIsHoveredId( '' );
    }

    if (ScreenDetection() === false) {
        projectList = (
            <div className = "grid grid-cols-2 gap-6 pt-10">
                {projects.map((project) => (
                    <Card sx = {{ width: 1, height: 250 }}>
                        <CardActionArea
                            onMouseOver = {handleMouseOver( project.title )}
                            onMouseOut = {handleMouseOut}
                            href = {project.link}
                            rel = "noopener noreferrer"
                            target = "_blank"
                        >
                            {isHoveredId == project.title ? (

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

sandycheeks 21.04.2023 09:17

@sandycheeks Не могли бы вы опубликовать свой код? Я могу посмотреть, как это может быть обновлено. Спасибо.

kofeigen 21.04.2023 09:41
codeandbox.io/s/fervent-resonance-5jvwkx?file=/src/App.js Это ссылка на код-песочницу! Спасибо!
sandycheeks 23.04.2023 05:51

@sandycheeks Есть ли у объекта project идентификатор или что-то, что может его однозначно идентифицировать? Пока что я рассматриваю только заголовок как потенциальный уникальный идентификатор.

kofeigen 23.04.2023 06:14

У него нет идентификатора, но было бы очень легко добавить тег идентификатора 1, 2, 3... и далее.

sandycheeks 23.04.2023 06:23

@sandycheeks Обновления находятся в коде, показанном в моем обновленном ответе.

kofeigen 23.04.2023 07:16

Другие вопросы по теме