#reactjs
#reactjs
Вопрос:
Итак, я сопоставляю и отображаю изображения в dom. Изображения должны быть интерактивными, а затем возвращать значение, потому что мне нужно знать, какая кнопка была нажата, чтобы я мог получить значение или идентификатор и выполнить поиск по другому массиву в другом компоненте. Я сделал что-то подобное в vanilla js, добавив идентификатор к изображению, и это сработало, но не будет работать в react. вот мой код, если у кого-нибудь есть решение.
import {Photo, ViewProps} from "./../tools/Samples.model";
const FocusView = ({photos, visible}:ViewProps):JSX.Element => {
const imageClick = (e:any):void => {
console.log("image is clicked" e.target.value);
}
return (
<div className="focusImages" style={{display: (visible ? 'flex' : 'none')}}>
{photos.map((data:Photo,n:number):JSX.Element => {
return (
<button key={n} style={{background:'none', border:'none'}} onClick={imageClick} value={n}>
<img src={"./Images/" data.source} alt="asd" className="imageHover"/>
</button>
);
})}
</div>
)
}
export default FocusView;
Ответ №1:
Вероятно, вы могли бы использовать currying для решения этой проблемы.
Что-то вроде этого?
import {Photo, ViewProps} from "./../tools/Samples.model";
const FocusView = ({photos, visible}:ViewProps):JSX.Element => {
const imageClick = (n:number) => (e:any):void => {
console.log("image is clicked" n);
}
return (
<div className="focusImages" style={{display: (visible ? 'flex' :
'none')}}>
{photos.map((data:Photo,n:number):JSX.Element =>{
return (
<button key={n} style={{background:'none', border:'none'}}
onClick={imageClick(n}>
<img src={"./Images/" data.source} alt="asd"
className="imageHover"/>
</button>
);
})}
</div>
);
Комментарии:
1. вы должны обернуть функцию в обратный вызов таким образом,
() => imageClick(n)
чтобы она выполнялась только при нажатии2. Да, теперь он правильно отображается в консоли, спасибо.
3. @Kakiz самое классное в каррировании то, что вам не нужно этого делать. Вы на 100% правы, хотя, если бы мы не ругались.
Ответ №2:
React имеет синтетическое событие. Вы можете попробовать следующий пример, чтобы получить максимальную информацию из события, на которое вы нажали.
const imageClick = () => {
console.log("image is clicked" event.target.value);
}
Ответ №3:
Вы можете передать свой индекс массива (который вы назвали как «n») в качестве параметра для функции imageClick вместо того, чтобы пытаться получить из event.target
photos.map((data: Photo, n: number): JSX.Element => {
return (
<button onClick={() => imageClick(n)}></button>
)
}