prevProps и реквизит одинаковы

#reactjs

Вопрос:

Когда я использую componentDidUpdate для сравнения prevProps или prevState, я получаю то же самое, что и мои текущие реквизиты или состояние.

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

Итак, есть ли что-нибудь, что может вызвать эту проблему?

 import React, { Component } from "react";

import "./App.css";
import NavBar from "./components/navbar";
import Counters from "./components/counters";
// import Table from './components/table';

class App extends Component {
  constructor() {
    super();
    console.log("App - constructor");
  }

  componentDidMount() {
    console.log("App - componentDidMount");
  }

  state = {
    counters: [
      { id: 1, value: 0 },
      { id: 2, value: 1 },
      { id: 3, value: 2 },
      { id: 4, value: 0 },
    ],
  };

  resetHandler = () => {
    let counters = [...this.state.counters];
    let newCounters = counters.map((counter) => {
      counter.value = 0;
      return counter;
    });
    this.setState({ counters: newCounters });
  };

  deleteHandler = (id) => {
    let counters = [...this.state.counters];
    let newCounters = counters.filter((counter) => counter.id !== id);
    this.setState({ counters: newCounters });
  };

  incrementHandler = (id) => {
    let counters = [...this.state.counters];
    let newCounters = counters.map((counter) => {
      if (counter.id === id) {
        counter.value = counter.value   1;
      }
      return counter;
    });
    this.setState({ counters: newCounters });
  };

  componentDidUpdate(prevProps, prevState) {
    console.log("prevProps", prevProps);
    console.log("prevState", prevState);
  }

  render() {
    console.log("App - render");
    return (
      <>
        <NavBar
          totalCounters={this.state.counters.filter((c) => c.value > 0).length}
        />
        <main className="container">
          <Counters
            onReset={this.resetHandler}
            onIncrement={this.incrementHandler}
            onDelete={this.deleteHandler}
            counters={this.state.counters}
          />
        </main>
      </>
    );
  }
}

export default App;
 

Это счетчики :

 import React, { Component } from 'react';
import Counter from './counter'

class Counters extends Component {
  
  render() { 
    console.log("counters - render")
    const { onReset, counters, onDelete, onIncrement} = {...this.props}
    return ( 
      <div>
        <button className="btn btn-primary btn-sm m-2" onClick={onReset}>Reset</button>
        {counters.map( counter => 
          <Counter key={counter.id} 
            counter={counter}
            onDelete={onDelete}
            onIncrement={onIncrement} />)}
      </div>
     );
  }
}
 
export default Counters;
 

Это противоречит:

 import React, { Component } from 'react';

class Counter extends Component {

  getBadgeClasses() {
    let classes = "badge m-2 badge-";
    classes  = this.props.counter.value === 0 ? "warning" : "primary";
    return classes;
  }

  formatCount() {
    const { value } = {...this.props.counter}
    return value === 0 ? 'zero' : value
  }

  render() { 
    return (
      <div>
        <span className={this.getBadgeClasses()}>{this.formatCount()}</span>
        <button onClick={() => this.props.onIncrement(this.props.counter.id)} className="btn btn-secondary btn-sm m-2">Increment</button>
        <button onClick={() => this.props.onDelete(this.props.counter.id)} className="btn btn-danger btn-sm m-2">Delete</button>
      </div>
    )
  }
}
 
export default Counter;
 

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

1. Как вы проверили, совпадает ли предыдущий реквизит, состояние с текущим реквизитом, состоянием ?

2. Как вы используете onReset в Counters компоненте?

3. @KavinduVIndika Я проверяю это на консоли.

4. @lazy.lizard Я отредактировал сообщение и вставил код

5. Ну, я не вижу причин в state мелкой копии, которую вы создаете для каждой функции, и, похоже, в вашем коде нет ничего неправильного.