Масштабировать и изменять цвет svg при наведении в React

У меня есть следующий пользовательский компонент Icon:

import React from 'react';
import PropTypes from 'prop-types';

const Icon = (props: any) => {
  const styles = {
    svg: {
      display: 'inline-block',
      verticalAlign: 'middle',
    },
    path: {
       fill: props.color,
    },
  };

  return (

    <svg

      style = {styles.svg}
      width = {`${props.size}px`}
      height = {`${props.size}px`}
      viewBox = "0 0 1024 1024"
    >
       <path style = {styles.path} d = {props.icon} /> 
    </svg>
  );


};

Icon.propTypes = {
  icon: PropTypes.string.isRequired,
  size: PropTypes.number,
  color: PropTypes.string

};

Icon.defaultProps = {
  size: 16
};

export default Icon

В другом компоненте я создаю его экземпляр со следующим утверждением:

<Icon
          icon = {ICONS.TWITTER}
          color = "#fff"
          size = {30}
        />

Как я могу изменить размер и цвет при наведении? Заранее спасибо!

Вы хотите сделать это в Javascript или с помощью CSS?

Marcus 01.04.2019 21:12

желательно с css

Carlos Hernández Gil 02.04.2019 09:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
2
12 622
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Предполагая, что вы хотите решить эту проблему с помощью React, вам нужно сделать компонент, который рендерит ваш компонент <Icon />, и настроить его реквизиты в зависимости от того, зависает ли компонент <Icon /> или нет.

Это означает, что родительский компонент должен получить состояние, а компонент <Icon /> должен реализовать какой-то обратный вызов, когда мышь входит и покидает его. Для этого вы можете использовать функции onMouseEnter и onMouseLeave (также см. документы). Затем они просто установили бы логический флаг в состоянии родительского компонента, и на основе этого реквизиты изменились бы.

Реализация может выглядеть так:

<Icon
  icon = {ICONS.TWITTER}
  color = {this.state.isHovered ? '#333' : '#fff'}
  size = {this.state.isHovered ? 40 : 30}
  onMouseEnter = {this.handleMouseEnter}
  onMouseLeave = {this.handleMouseLeave}
/>

Где handleMouseEnter() может выглядеть так:

handleMouseEnter = () => {
  this.setState({ isHovered: true })
}

а handleMouseLeave() сделал бы наоборот.

Обратите внимание, хотя, это большая работа, чтобы реализовать то, что браузеры уже делают за вас (состояние :hover в CSS), поэтому стоит подумать, нужно ли вам, чтобы эффект был таким же динамичным, как сейчас, или вы могли бы просто жить с фиксированным увеличением размера и изменением цвета.
Кроме того, onMouseEnter и onMouseLeave могут вызвать некоторые проблемы с сенсорными устройствами.

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