Добавить очки к пользовательской оценке react

#reactjs

#reactjs

Вопрос:

Я пытаюсь добавлять баллы в профиль пользователя при каждом нажатии кнопки. Очки должны накапливаться.

Я могу добавлять баллы в профиль при переходе к модальному компоненту (у которого есть кнопка для добавления баллов, которую можно нажать только один раз). Однако, когда я перезагружаю модал, теперь с отключенной кнопкой, баллы все еще обновляются, но становятся нулевыми.

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

проблема в «баллах». Все остальное работает должным образом.

 const EventLog = ({ current, logPointsNow, logPoints }: IEventLog) => {
  const [dateLogged, setDateLogged] = useState("");
  const [points, setPoints] = useState("");

  useEffect(() => {
    if (current) {
      setDateLogged(current.dateLogged);
    }
  }, [current]);

  const handleClick = () => {
    setDateLogged(Date());
    setPoints(points   String(50));
  };

  useEffect(() => {
    const updatedDate = {
      dateLogged,
    };
    logPointsNow(updatedDate);
  }, [dateLogged]);

  useEffect(() => {
    const meetingPoints = {
      points,
    };
    logPoints(meetingPoints);
  }, [points]);

  return (
    <IonContent>
      <UserPoints />
      <IonButton
        type="submit"
        expand="block"
        onClick={handleClick}
        disabled={arrivalTime ? true : false}
      >
        Log
      </IonButton>
      <IonItem>
        <IonLabel>Points earned: {points}</IonLabel>
      </IonItem>
    </IonContent>
  );
};

const mapStateToProps = (state: IEventLogReduxProps) => ({
  current: state.event.current,
});

export default connect(mapStateToProps, { logPointsNow, logPoints })(EventLog);
  

Вот компонент для получения информации о пользователе:

 const UserPoints = ({ auth }: IUserP) => {
  return (
    <IonItem>
      {auth!.user.points}
      {auth!.user.name}
    </IonItem>
  );
};

const mapStateToProps = (state: IAuthReduxProps) => ({
  auth: state.auth,
});

export default connect(mapStateToProps, null)(UserPoints);
  

Комментарии:

1. Я предполагаю, что текущий реквизит обновляется где-то в цепочке, углубляясь в ваш компонент, а затем запускает useEffect , который устанавливает pointsNow в current. Удалите current из массива при первом useEffect, чтобы он запускался только один раз при загрузке.

2. Проблема не в PointsNow. Я изменю название, чтобы не вызывать путаницы.

3. Я согласен, что ваш pointsNow работает должным образом при начальной загрузке … но я умоляю вас добавить консольный журнал в этот useEffect с именем console.log(‘[срабатывает]’) и посмотреть, срабатывает ли он, когда вы этого ожидаете.

Ответ №1:

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

   useEffect(() => {
    if (current) {
      setPointsNow(current.pointsNow);
    }
  }, []);
  

Комментарии:

1. Проблема не в PointsNow. Я изменю название, чтобы не вызывать путаницы.

Ответ №2:

Если удаление ваших зависимостей помогло бы, то я бы не стал лгать о зависимостях, когда вы не хотите, чтобы ваш первый эффект использования изменял pointsNow только тогда, когда он был изменен, тогда я бы предпочел иметь начальное значение для pointsNow (у вас есть «»), тогда я бы изменил первый эффект использования на:

 useEffect( () => {
    if (current amp;amp; pointsNow === "") {
        setPointsNow(current.pointsNow);
    }
}, [current]);
  

И еще одна вещь, которая не имеет ничего общего с вашей текущей проблемой: я думаю, вы используете «useEffect» больше, чем вам нужно. Конечно, вы хотите вызывать «точки входа» при изменении точек, но почти каждый вызов функции зависит от чего-то, и с этой логикой мы бы передали каждую логику useEffect.

Я не знаю, как это будет расти так быстро, когда я неправильно понял, но сейчас вы могли бы просто иметь функцию handlerFunction, которая вызывает «logPoints» и вызывать эту функцию handleFunction при изменении точек. Теперь, когда я не делаю ошибок, вы меняете очки только в двух разных местах один раз в первом useEffect, а затем в «handleClick».

Комментарии:

1. Проблема не в PointsNow. Я изменю название, чтобы не вызывать путаницы.

Ответ №3:

Я исправил 1-ю проблему:

Я могу добавлять баллы в профиль при переходе к модальному компоненту (у которого есть кнопка для добавления баллов, которую можно нажать только один раз). Однако, когда я перезагружаю модал, теперь с отключенной кнопкой, баллы все еще обновляются, но становятся нулевыми.

Выполнив следующее:

 useEffect(()=>{
  
 if(dateLogged) {
  const meetingPoints = {
  points
};
logPoints(meetingPoints)
 }

}, [points])