@doppelgangerz
JavaScript

Что я не верно делаю при перезаписи state?

Здравствуйте, почему state не переписывается на новый и какие ошибки и плохие практики вы видете в моем коде?
class Li extends React.Component {
  render() {
    return (
      <li>{this.props.text}</li>
    )
  }
}

class Elem extends React.Component {
  render() {
    return (<div className="element">
      <ul>
        <Li text={this.props.text}/>
      </ul>
    </div>)
  }
}

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {text: 'hello world'};
  }
  render() {
    return (
      <div className="pageWrapper">
        <h1>To Do List</h1>
        <input placeholder="Введите текст" onChange={this.submitText} type="text" className="inp"/>
        <Elem text={this.state.text}/>
      </div>
    )
  }
  submitText() {
    let inpValue = document.querySelector(".inp").value;
    this.setState({
      text: inpValue
    });
  }
}

ReactDOM.render(<App />, document.querySelector("#app"));
  • Вопрос задан
  • 116 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега React
Контекст потерялся. Ну и не надо пытаться достучаться до элемента через querySelector - он доступен как свойство target объекта события.

submitText = (e) => {
  this.setState({
    text: e.target.value,
  });
}
Ответ написан
rockon404
@rockon404 Куратор тега React
Frontend Developer
1. Прямые обращения к DOM используются в очень редких исключениях. Например:
document.body.classList.add('someClass');

2. Метод submitText, следует переименовать в handleChange. Вы не делаете никаких submit по изменению input.
3. При передаче в input метод теряет контекст надо либо делать bind:
constructor(props) {
  super(props);
  this.state = {text: 'hello world'};
  this.handleChange = this.handleChange.bind(this);
}

либо использовать свойство класса:
class App extends React.Component {
  // ...
  hanldeCHange = e => {
    this.setState({
      text: e.target.value,
  });
  // ...
}

4. Исправленный код:
<input onChange={this.handleChange} />

class App extends React.Component {
  // ...
  hanldeCHange = e => {
    this.setState({
      text: e.target.value,
  });
  // ...
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы