Как различать элементы в React

У меня есть несколько изображений, которые мне нужно немного увеличить (с помощью CSS, например, transform : scale(1.2);) на onMouseEnter и вернуться на onMouseLeave. У меня есть код ниже, который работает.

CSS: -

.style {
    transform : scale(1.2);
    transition: transform .5s ease-out;
}

.shrink {
    transform : scale(1);
    transition: transform .5s ease-out;
}

Переменная, объявленная в конструкторе: -

this.state = { 
            isHovered: false
        };

Метод JS: -

handleHover(){
        this.setState({
            isHovered: !this.state.isHovered
        });
    }

логическая операция в методе рендеринга: -

const imgClass = this.state.isHovered ? 'profile-pic style' : 'profile-pic shrink';

И два изображения: -

   <Image title ='one' src = "pics/pic1.png" circle className = {imgClass}  
    onClick = { () => this.props.methodRef('one')} height = "70" width = "100"     
onMouseEnter = {this.handleHover} onMouseLeave = {this.handleHover}/>

     <Image title ='two' src = "pics/pic2.png" circle className = {imgClass}  
    onClick = { () => this.props.methodRef('two') } height = "70" width = "100"     
onMouseEnter = {this.handleHover} onMouseLeave = {this.handleHover}/>

Этот код работает отлично, как я и ожидал. Но проблема в том, что оба изображения увеличиваются и уменьшаются одновременно.

Как я могу различать движения мыши по разным-разным элементам в ReactJs.

Правильно ли вы задаете имена классов? profile-pic, style должен быть без запятой, верно? Если это так, и имена классов установлены, он будет работать отлично

Andy Theos 24.08.2018 18:35

Я попытался удалить запятую, но без изменений. Он по-прежнему ведет себя так же. Но спасибо за неправильный код.

Jaikrat 24.08.2018 18:38

вам нужно переместить состояние handleHover и isHovered внутри компонента изображения, таким образом их внутренний isHovered изменится, и только одно изображение будет увеличено. Сейчас вы используете одно и то же состояние для обоих изображений, поэтому оба изображения увеличиваются.

Fernando Salas 24.08.2018 18:48

Изображение - это один из компонентов, предоставляемых React. Я не создавал этот Компонент.

Jaikrat 24.08.2018 18:51

@Jaikrat Image - один из компонентов, предоставляемых React. Любая ссылка? Для меня это будет новым открытием, так как в react предоставляет компонент под названием Image.

Bhojendra Rauniyar 24.08.2018 18:55

Конечно ... у меня есть один импорт вроде ... import { Image} from 'react-bootstrap';

Jaikrat 24.08.2018 18:56

Ах, рад знать. Вы уже не упомянули, что это реакция-бутстрап.

Bhojendra Rauniyar 24.08.2018 18:57

@Jaikrat Можешь хоть раз попробовать: {() => this.handleHover()}

Bhojendra Rauniyar 24.08.2018 19:04

@BhojendraRauniyar. Нет, оба изображения увеличиваются и уменьшаются одновременно.

Jaikrat 24.08.2018 19:10

@Jaikrat Я не смог найти никаких проблем с вашим кодом, вы можете попробовать использовать консоль, что там происходит ..

Bhojendra Rauniyar 24.08.2018 19:10

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

Jaikrat 24.08.2018 19:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
11
71
1

Ответы 1

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

state: {
    images:[{id: "image1", isHovered: false},
            {id:"image2", isHovered: false}]
}

Таким образом, вы можете иметь свои идентификаторы в компонентах:

<Image id = {this.state.images[0].id} ...rest />

затем handleHover:

handleHover(e) => {
    const images = [...this.state.images]; //copy your array
    const index = images.findIndex(el => (el.id === e.target.id));
    images[index].isHovered = !images[index].isHovered;
    this.setState({images});
}

Однако это слишком сложно. Вы должны обернуть его внутри другого компонента и управлять состоянием оттуда.

Не требуется. Нет проблем с использованием одного состояния.

Bhojendra Rauniyar 24.08.2018 19:07

Я думаю, оба изображения увеличиваются, потому что он использует одно и то же состояние для обоих. Неважно, какое изображение он наводит, оба следят за одним состоянием isHovered, и оба изображения переключают классы.

Fernando Salas 24.08.2018 19:08

Я сказал: Нет. Не требуется. Это компонент, а не элемент. Компонент начальной загрузки.

Bhojendra Rauniyar 24.08.2018 19:09

Здесь я не согласен. Если только isHovered не является внутренним состоянием компонента, о котором мы не знаем. Затем ему нужно более одного состояния для переключения классов.

Fernando Salas 24.08.2018 19:14
You should wrap it inside another component and manage state from there. => Ага.
Matt Holland 24.08.2018 23:11

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