Я пытаюсь реализовать приложение с большим диалоговом окном. Часто компонент должен запускать диалог в режиме «огонь-и-забыть», поэтому у меня есть функция create_dialog()
, которая принимает элемент React.DOM
и добавляет его в массив dialogs
в состоянии компонента App
(компонент верхнего уровня) который в своей функции render()
отображает все диалоги.ReactJS: Переместить состояние компонента
Это прост в использовании и прекрасно работает, но теперь я хочу иметь возможность свести к минимуму диалоги и показать небольшой предварительный просмотр в панели задач. Способ, которым я пытался это сделать, - добавить новый массив previews
в состояние App
s, и при минимизации диалога я удалю его из dialogs
и добавлю его в previews
, который отображается в другом элементе на странице.
Проблема заключается в том, что элементы React.DOM.*
- это просто облегченные ссылки, которые не хранят состояние, поэтому при минимизации диалогов все состояние теряется, потому что компоненты диалога должны быть перемонтированы (и насколько я знаю, нет никакого способа действительно переместите элемент DOM в ReactJS). Есть ли простой способ перемещения/копирования состояния компонента без внесения в него изменений? Или есть другой подход?
var Application = React.createClass(
{
getInitialState: function()
{
return {dialogs: [], previews: []};
},
render: function()
{
return (
<div>
<div id="previews">{this.state.previews}</div>
{this.state.dialogs}
</div>
);
},
...
});
var g_app = React.renderComponent(<Application />, ...);
function create_dialog(header, content)
{
var new_dialog_state = g_app.state.dialogs.slice();
new_dialog_state.push(<Dialog header={header}>{content}</Dialog>);
g_app.setState({dialogs: new_dialog_state});
}
var Item = React.createClass(
{
onButtonClick: function()
{
create_dialog('Item info', <ItemInfo data={this.state.item_info} />);
},
...
});
вам, вероятно, нужно, чтобы скрыть их вместо того, чтобы удалить их из йот см [отслеживанием состояния детей] (http://facebook.github.io/react/docs/multiple-components.html#stateful-children). а также, кажется, не совсем правильно, как вы используете «состояние» – codeboy
Но даже если бы я прятался, а не удалял их, мне все равно было бы нужно их состояние. И да, я не люблю помещать элементы DOM в состояние, это было только первое решение, которое мне пришло в голову. –
Хорошо, я решил проблему, сохранив внешние компоненты состояния. Компоненты теперь используют только свои «реквизиты», которые устанавливаются отдельным объектом «Store». –