Я пишу код JSX, чтобы создать кнопку сброса, в которой я могу сбросить значение таймера, используя «состояние». Проблема в том, что когда я нажимаю кнопку, ничего не происходит вместо того, чтобы изменить значение. (Даже когда я хотите отобразить консольное сообщение через функцию сброса, ничего не происходит)
Создал переменную «state.timer», чтобы добавить значение для отображения. Функция для сброса значения «таймер» и изменения его на 0. Кнопка, которая вызывает функцию сброса для сброса.
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
class Timer extends React.Component {
constructor(props) {
super(props);
this.state = {
timer: 90
};
function resetTime() {
this.setState({ timer: 0 });
}
}
render() {
return (
<div className = "App">
<h2>{this.state.timer}</h2>
<button onClick = {this.resetTime}>Reset</button>
</div>
);
}
}
ReactDOM.render(<Timer />, document.getElementById("root"));
Ожидается отображение 0, когда я нажимаю кнопку сброса, вместо этого значение по-прежнему отображается 90.
ничего не меняется, я думаю, что кнопка onClick не работает.
Я изменил код функции сброса, протестировав его через msg display console.info, но тоже ничего не происходит. Я думаю, что кнопка нажатия не работает. Вот мой код: codeandbox.io/s/033xl8kjmn



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Состояние соответствует экземпляру компонента, не является статической переменной вашего класса. Вместо доступа через Timer.setState вызовите его из экземпляра с помощью this.setState.
Попробуйте что-нибудь вроде этого. Вам нужно будет привязать функцию к конструктору.
import React from "react";
import ReactDOM from "react-dom";
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
timer: 90
};
this.resetTime = this.resetTime.bind(this);
}
resetTime() {
this.setState({ timer: 0 });
}
render() {
return (
<div className = "App">
<h2>{this.state.timer}</h2>
<button onClick = {this.resetTime}>Reset</button>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Вы также можете использовать функции стрелок, но этот метод основан на предложенной функции свойства класса. Чтобы использовать этот подход, вы должны включить свойства класса преобразования или включить этап-2 в Бабеле. Если вы используете Create-React-App, оно уже будет настроено.
resetTime =()=> {
this.setState({ timer: 0 });
}
Или вы можете использовать стрелочные функции resetTime = () => { ... } вместо привязки в конструкторе.
У тебя было несколько ошибок.
this вместо Timer при доступе к setState (например: this.setState())context не потерялся (например: onPress = {()=>this.resetTime()} )Написание const {timer} = this.state; точно так же, как const timer = this.state.timer;
Думайте об этом как о более простом и элегантном способе доступа к свойствам.
Зачем это отделять? Хорошо, если у вас есть несколько свойств в состоянии (не только таймер). Это означало бы, что вам придется писать this.state.timer, this.state.someOtherProperty, this.state.somethingElse. Зачем делать это и усложнять чтение, когда можно просто сделать это.
const {timer, someOtherProperty, somethingElse} = this.state;
import React from "react";
export default class Timer extends React.Component {
constructor(props) {
super(props);
this.state = {
timer: 90
};
}
resetTime() {
this.setState({ timer: 0 });
}
render() {
const { timer } = this.state;
return (
<div className = "App">
<h2>{timer}</h2>
<button onClick = {() => this.resetTime()}>Reset</button>
</div>
);
}
}
Рабочий пример здесь.
const {таймер} = this.state. Пожалуйста, как начинающий программист, объясните мне этот код. Вы вызываете this.state.timer через этот код? поскольку я не понял {timer}, я знаю только this.state.variableName, чтобы вызвать значение состояния.
Вы обращаетесь к методу setState статически.. это должно быть
this.setState({timer:0})...