#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
мелкой копии, которую вы создаете для каждой функции, и, похоже, в вашем коде нет ничего неправильного.