Как создать динамичную смену картинок при нажатии в ReactJS

147
19 октября 2021, 18:20

поставил себе задачу при клике на картинку like менять ее на другую в посте, чтобы пользователь понимал, что, что-либо поменялось в initialState у posts добавил значение isYouLike, которое принимает true/false идея была передавать при клике в редьюсер id поста,

let initialState = {
posts: [
    { id: 3, message: "Я в лазурном", date: '24 авг в 12:30', likesCount: 1, isYouLike: true},
    { id: 2, message: "It's my first post", date: '30 июл в 19:01', likesCount: 15, isYouLike: true},
    { id: 1, message: "Hello everybody", date: '30 июл в 19:00', likesCount: 3, isYouLike: false},
]}

замапить все посты и найти такой же id, поменять на противоположное значение isYouLike

const profileReduser = (state = initialState, action) => {
switch (action.type) {
case LIKE_IT:
        return{
            ...state,
            posts: state.posts.map(post => {
                debugger
                if(post.id === action.postId){
                    debugger
                    return { ...post, isYouLike: true, likesCount: post.likesCount++ }
                }
                return post
            })   
        }
    case DONT_LIKE_IT:
        return{
            ...state,
            users: state.posts.map(post => {
                if (post.id === action.userId) {
                    return { ...post, isYouLike: false, likesCount: post.likesCount--}
                }
                return post
            })
        }
    default:
        return state
}}

и проверку на самой картинке в компоненте

<div className={styles.like}>
                <div className={styles.onClickWrapper} >
                    <img src={props.isYouLike ? onClickLikePicture : likePicture} alt="Нравится" />
                </div>
                <p>{props.likesCount}</p>       
            </div>

На сколько я знаю onClick на саму картинку повесить нельзя, поэтому я обернул ее div'ом и при задавании ему метода onClick все ломается, картинки позываются неправильно(независимо от проверки) вот сама проверка при клике

onClick={props.isYouLike ? dislike(props.id) : like(props.id)}>

сами функции просто передавали в редьюсер id поста, подскажите пожалуйста в чем кроется моя ошибка, сами посты я мапил .map в компоненте, которая вызывала эту компоненту

let postsElements =
    props.posts.map(post =>
        <Post message={post.message}
            likesCount={post.likesCount}
            postAuthor={props.postAuthor}
            isYouLike={post.isYouLike}
            date={post.date}
            id={post.id}
            key={post.id}
            likeIt={props.likeIt}
            dontLikeIt={props.dontLikeIt} />)
Answer 1

Я бы компоненту Post сделал стейт со значением isLiked куда по дефолту положить значение из пропс isYouLike={post.isYouLike}.

constructor(props) {
    super();
    this.state = {
      isLiked: props.isYouLike
    };
  }

После этого по клику тоглить это значение в стейте и потом менять не src картинки, так как alt остается тот же. А рендерить полностью новую картинку img

onClick = () => this.setState(prevState => ({ isLiked: !prevState.isLiked }));
{this.state.isLiked ? <img src={likePicture} alt="Нравится" /> :  <img src={onClickLikePicture} alt="Не нравится" /> : }
READ ALSO
Как распарить файл объектов с одинаковыми ключами в JSON?

Как распарить файл объектов с одинаковыми ключами в JSON?

У меня есть текстовый файл с множеством объектов с одинаковыми именами и множеством координат, как его распарсить в jsonКак правильно его распарсить?...

214
Проблема с количеством товаров в корзине при занесении её в local storage [дубликат]

Проблема с количеством товаров в корзине при занесении её в local storage [дубликат]

написал функцию которая принимает id нового товара и заносит её в корзину которая лежит в local srorageКогда кликаешь по одному товару то всё работает...

231
Вызвать обновление двух компонентов из одного без Redux

Вызвать обновление двух компонентов из одного без Redux

Есть четыре компонента: Post, PostMaker, CommentSection и CommentFormPost включает в себя как раз вызов всех трех

141
Angular ошибка ERROR TypeError: is undefined

Angular ошибка ERROR TypeError: is undefined

ЗдраствуйтеПытаюсь сделать обработчик который будет создавать масив разделов в зависимости от того есть ли для него ресурсы или нет

222