Обновление состояния после патча в React

Я пытаюсь выяснить, как автоматически обновлять состояние после запроса на исправление, чтобы при нажатии кнопки он автоматически добавлял свои лайки в счетчик. К сожалению, для обновления по-прежнему требуется загрузка страницы. Вы можете что-нибудь увидеть по этому поводу? Любая помощь очень ценится, спасибо.

import React, { Component } from "react";
import "./Like.css";

class Button extends Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: this.props.counter
    };
  }

  handleSubmit = event => {
    event.preventDefault();
    fetch(`http://localhost:3001/api/tracklists/${this.props.id}`, {
      method: "PATCH",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        tracklist: {
          title: this.props.title,
          url: this.props.url,
          genre: this.props.genre,
          tracklist: this.props.tracklist,
          likes: this.props.counter + 1
        }
      })
    })
      .then(response => response.json())
      .then(response => {
        this.setState({
          counter: this.props.counter
        });
      });
  };

  render() {
    return (
      <div className = "customContainer">
        <button onClick = {this.handleSubmit}>{this.state.counter}</button>
      </div>
    );
  }
}

export default Button;

response JSON, который вы получите, не может дать вам некоторую информацию, например, о новом количестве лайков?

keul 24.10.2018 15:22
Поведение ключевого слова "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
1
3 302
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать в SO

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

Вы пробовали использовать встроенный метод жизненного цикла React Component componentDidUpdate(prevProps)?

В вашем случае вы бы сделали

componentDidUpdate(prevProps) {
  // you always need to check if the props are different
  if (this.props.counter !== prevProps.counter) {
    this.setState({ counter: this.props.counter });
  }
}

Вы можете найти документацию здесь: https://reactjs.org/docs/react-component.html#componentdidupdate

При этом я не понимаю, почему вы не отображаете опору напрямую, а не дублируете ее в состоянии ... Например:

render() {
  return (
    <div className = "customContainer">
      <button onClick = {this.handleSubmit}>{this.props.counter}</button>
    </div>
  );
}

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