Добро пожаловать на доски Jr194!
По теме, я думаю, будет полезно сохранить currentLight
и lightMachine
в качестве значений, управляемых состоянием вашего компонента.Это помогает гарантировать, что вся ваша логика находится в одном и том же контексте, избегая таких странных ошибок, как «бла-бла не определено».
Во-вторых, вы, похоже, определили несколько функций, которые действительно можно сузить до одной.update, onHandleClick
и transition
все, кажется, пытаются сделать то же самое.
Наконец, рассмотрите возможность реорганизации кода в lightMachine
, чтобы он был немного более интуитивным, чтобы вы могли быстро перейти к следующемусвет.Вы уже знаете, какой текущий цвет у родительского ключа, действительно ли необходимо, чтобы его объект содержал другой ключ с тем же значением?
Рассмотрим следующий код:
class App extends React.Component {
state = {
currentLight: "green",
lightMachine: {
green: {
nextLight: "yellow"
},
yellow: {
nextLight: "red"
},
red: {
nextLight: "green"
}
}
};
transition = () => {
const currentLight = this.state.currentLight;
const nextLight = this.state.lightColors[currentLight].nextLight;
this.setState({
currentLight: nextLight
});
};
render() {
return (
<div>
<button onClick={this.transition}>Click Me</button>
<div>{this.state.currentLight}</div>
</div>
);
}
}
Это должно позволить вам быстро изменить свет, как и ожидалось.И вот песочница: https://codesandbox.io/s/4x08ovyjp7
Дайте мне знать, если у вас есть какие-либо вопросы:)
Также относительно вашего вопроса о том, почему currentLightState
выдает ошибку в вашем render
, когда выпоместите это в класс.Это не проблема React, это проблема JavaScript.
Давайте рассмотрим несколько примеров:
const test= "hello"
class Example extends React.Component{
state = {
greeting: "woof"
}
render(){
<div>{test}</div>
}
}
Как вы знаете, это не даст нам никакой ошибки.Мы подключаемся к переменной, которая определена вне нашего класса, и это совершенно нормально.
Теперь давайте посмотрим на это
class Example extends React.Component{
state = {
greeting: "woof"
}
test = this.state.greeting
render(){
<div>{test}</div>
}
}
Это дает нам ошибку.Почему, потому что в вашем методе рендеринга вы рассматриваете тест как переменную, а не так.В class
объекте, подобном тому, который вы написали, currentLightState
и теперь test
обрабатываются как properties
, а не как переменные.Чтобы получить доступ к свойству внутри класса, вам нужно использовать ключевое слово "this
", то, что вы уже делали с this.update, this.handleOnClick
и т. Д., Которые также являются свойствами.
Теперь мы знаем, что этот код будет работать.
class Example extends React.Component{
state = {
greeting: "woof"
}
test = this.state.greeting
render(){
<div>{this.test}</div>
}
}