Основной проблемой является способ указания компонента Login
:
<Route
path="/login"
exact
component={() => (
<Login
onChangeName={this.changeName.bind(this)}
onChangePass={this.changePass.bind(this)}
name={this.state.name}
password={this.state.password}
/>
)}
/>
При использовании этого синтаксиса дочерний элемент маршрута выглядит как совершенно новый тип компонента с каждымрендеринг (поскольку каждый раз это будет новый экземпляр функции стрелки), поэтому предыдущий компонент Login будет полностью размонтирован, а новый смонтирован.
Вместо этого вы можете добавить в конструктор класса следующее:
this.LoginComponent = () => {
return (
<Login
onChangeName={this.changeName}
onChangePass={this.changePass}
name={this.state.name}
password={this.state.password}
/>
);
};
И затем используйте следующий синтаксис:
<Route path="/login" exact component={this.LoginComponent} />
Разница в том, что при указании реквизита component
со встроенной функцией стрелки тип компонента будет распознаваться как различный при каждом рендеринге.,Определив функцию один раз в конструкторе, тип компонента будет распознаваться React как непротиворечивый при повторном рендеринге, и он не будет повторно монтироваться.
Я сделал несколько других настроек, чтобы получить работающийпример.Вот полный код:
![Edit vkm9lkm63](https://codesandbox.io/static/img/play-codesandbox.svg)