@SSSSTTTTAAAASSSS

Почему кнопка срабатывает со второго раза?

Разбираюсь с react-om и js. Пытаюсь сделать компонент - счетчик.
Но не пойму, почему он мне показывает правильное количество нажатий, но после обновления первое нажатие всегда неучитывается.
Ниже код
import React, {useState} from 'react';
import classes from './LikeButton.module.css'
import DishesService from "../../API/DischesService.js";

const LikeButton = ({dish, changedLikes}) => {
    const [likes, setLikes] = useState(dish)

    function increment() {
        setLikes({...likes, likes:likes.likes+1})
        likesById(likes)
    }

    function decrement() {
        setLikes({...likes, likes:likes.likes-1})
        likesById(likes)
    }

    async function likesById(likes) {
        await DishesService.likesByID(likes)
    }

    return (
        <div>
            <button
                className={classes.likeButton}
                onClick={() => {
                    increment()
                    changedLikes(likes)
                }}
            >
                <img src={require('../../Images/Likes/like.png')} alt=''/>
            </button>
            <button
                className={classes.likeButton}
                onClick={() => {
                    decrement()
                    changedLikes(likes)
                }}
            >
                <img src={require('../../Images/Likes/dislike.png')} alt=''/>
            </button>
            <p>{likes.likes}</p>
        </div>
    );
};
export default LikeButton;

При том, что на сервер функцией async function likesById(likes) отправляются неизмененные likes функциями increment/decrement, а изначальное состояние.

Пробовал изменять условия при нажатии кнопки и передавать ссылкой а не функцией - эффекта не дало.
Не пойму почему setLikes - отрабатывает не сразу...
  • Вопрос задан
  • 815 просмотров
Решения вопроса 1
@Scoo909010
likesById нужно вызывать в useEffect, потому что это асинхронная операция.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы