Задать вопрос
@usica

Криво работает input на странице с роутером?

Многостраничное приложение, на странице, т.е, в дочернем компоненте, который вызывается через роутер, странно работает input, который меняет состояние родительского компонента: после ввода первого символа происходит прокрутка к началу дочернего компонента и фокус из input'а пропадает.
Точно такой же input в родительском компоненте работает нормально. В дочернем без роутера тоже работает.

class App extends Component {
  constructor() {
        super();
        this.state = {
          input:'',
        };
        this.handleChange = this.handleChange.bind(this);
  }
  handleChange(event) {
        this.state.input = event.target.value;
        this.setState({input: this.state.input});
  }
  render() {
    return(
      <div>
      <br /><br /><br /><br /><br /><br />
        <input type=''
                        name='input'
                        value={this.state.input}
                        onChange={this.handleChange}
                        placeholder='основной компонент'
                /><br />
                <Switch>
                  <Route exact path="/" component={() => (
                   <PageIndex input={this.state.input} f={this.handleChange} /> )}/>
               </Switch>
      </div>)
  }
}


const PageIndex = (p) => {
  return (
    <div><hr /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
      <input type=''
                        name='input'
                        value={p.input}
                        onChange={p.f}
                        placeholder='дочерний компонент'
                />
      </div>
  )
}

Проблема именно с вводом текста в инпут. Изменение состояния родителя по клику на кнопку работает без дерганья вверх.
Не могу понять, в чем проблема.
  • Вопрос задан
  • 54 просмотра
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 2
@lnked
class App extends Component {
  state = {
    input: '',
  };

  handleChange = (event) => {
    event.persist();
    this.setState({ input: event.target.value });
  }

  render() {
    const { input } = this.state;

    return(
      <div>
        <br /><br /><br /><br /><br /><br />
        <input type=''
          name='input'
          value={input}
          onChange={this.handleChange}
          placeholder='основной компонент'
        />
        <br />
        <Switch>
          <Route
            exact
            path="/"
            render={props => (
              <PageIndex {...props} input={input} onChange={this.handleChange} />
            )}
          />
        </Switch>
      </div>
    );
  }
}

const PageIndex = ({ input, onChange }) => {
  return (
    <div>
      <hr /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
      <input
        name='input'
        value={input}
        onChange={onChange}
        placeholder='дочерний компонент'
      />
    </div>
  )
}
Ответ написан
@usica Автор вопроса
Ошибка здесь:
<Route exact path="/" component={() => (<PageIndex input={this.state.input} f={this.handleChange} /> )}/>

Правильно так:
<Route exact path="/" render={props => <PageIndex input={this.state.input} f={this.handleChange} />} />
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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