Я скрывал/показывал компоненты реакции, не создавая их, например:
render: function() {
var partial;
if (this.state.currentPage === 'home') {
partial = <Home />;
} else if (this.state.currentPage === 'bio') {
partial = <Bio />;
} else {
partial = <h1>Not found</h1>
}
return (
<div>
<div>I am a menu that stays here</div>
<a href="#/home">Home</a> <a href="#/bio">Bio</a>
{partial}
</div>
);
}
но просто скажите, что компонент <Bio/>
имеет много внутреннего состояния. Каждый раз, когда я воссоздаю компонент, он теряет его внутреннее состояние и сбрасывает его в исходное состояние.
Я знаю, конечно, что я могу хранить данные для него где-то и передавать его через реквизит или просто глобально получить к нему доступ, но эти данные действительно не нужны для жизни вне компонента. Я мог бы скрыть/показать компоненты с помощью CSS (display:none
), но я бы предпочел скрыть/показать их, как указано выше.
Какая самая лучшая практика здесь?
EDIT: Возможно, лучший способ сформулировать проблему - использовать пример:
Игнорировать React и предположим, что вы просто использовали настольное приложение, в котором был диалог конфигурации с компонентом Tab под названием A, который имеет 2 вкладки с именами 1 и 2.
Скажите, что на вкладке A.1 есть текстовое поле электронной почты, и вы заполняете свой адрес электронной почты. Затем вы нажимаете на вкладку A.2 на секунду, а затем переходите к вкладке A.1. Что случилось? Ваш адрес электронной почты больше не будет, это было бы без reset, потому что внутреннее состояние не хранилось нигде.
Интернализация состояния работает, как предложено в одном из ответов ниже, но только для компонента и его непосредственных детей. Если у вас есть компоненты, произвольно вложенные в другие компоненты, скажите вкладки в вкладках в вкладках, единственный способ сохранить их внутреннее состояние - либо экстеризировать его где-нибудь, либо использовать подход display:none
, который фактически сохраняет все дочерние компоненты вокруг в любое время.
Мне просто кажется, что этот тип данных - это не данные, которые вы хотите загрязнять своим статусом приложения... или даже хотите даже подумать. Похоже, данные, которые вы должны иметь возможность контролировать на уровне родительского компонента, и хотите либо сохранить, либо отказаться, не используя подход display:none
и не касаясь себя информацией о том, как он хранится.