Я работаю над приложением React, моим первым, и я борюсь с тем, как реализовать пользовательские интерактивные popovers. У меня есть бизнес-требование, чтобы иметь popover с кнопками yes/no. Это поповер запускается с помощью кнопки («pobtn»), который живет в строке в таблице в представлении:Является ли [мое использование] реакцией-бутстрапом «реагировать»?
+- View ---------------------+ +- View ---------------------+
| +- Table ----------------+ | click | +- Table ----------------+ |
| | +- Row --------------+ | | --> | | +- Row --------------+ | |
| | | ... | | | pobtn | | | ... | | |
| | +--------------------+ | | | | +--------------------+ | |
| | +- Row --------------+ | | ,--------. +- Row --------------+ | |
| | | ... [pobtn] | | | | Yes/No |>| ... [pobtn] | | |
| | +--------------------+ | | `--------' +--------------------+ | |
| | +- Row --------------+ | | | | +- Row --------------+ | |
| | | ... | | | | | | ... | | |
| | +--------------------+ | | | | +--------------------+ | |
| | ... | | | | ... | |
| +------------------------+ | | +------------------------+ |
+----------------------------+ +----------------------------+
The View, Стол и Роу являются все компоненты. Табличные данные извлекаются в представлении и помещаются в таблицу через реквизиты, и это стекает вниз в строку, что, я понимаю, является «правильным способом» для этого и имеет смысл. Там не так много местного штата.
Проблема связана с popover. «Правильно», чтобы сделать это, похоже, будет включать компонент Поповера вдоль каждой кнопки и нажимать реквизиты вниз для скрытых/видимых, я думаю. Это не кажется очень большим, но ближе к правильному способу сделать это в моем сознании.
Однако реагировать-самозагрузки поповер (который я использовал, потому что время), кажется, не работает таким образом:
var content = <MyRowPopoverContent/>;
<OverlayTrigger trigger='click' placement='left' overlay={<Popover>{content}</Popover>
<button className="btn btn-primary small"><i className="fa fa-trash-o"></i> Delete</button>
</OverlayTrigger>
При нажатии на кнопку запуска, он создает DIV крепится к корпусу и позиционирует себя рядом с элементом запуска, подобно тому, как он работает нормально (не реагирует). Похоже, я мог бы подключить DIV к другому контейнеру, но это не очень хорошо документировано. Во всяком случае, содержание наложения (т.е. MyRowPopoverContent) что-то вроде:
this.handleNoClick: function(){
// Re-click the button to close; gross.
$('[data-row-id="'+this.props.row.key+'"]').find('.fa-trash-o').parents('button').first().click();
},
this.handleYesClick: function(){
// Do stuff...update store which would re-render the view.
// Re-click the button to close; gross.
$('[data-row-id="'+this.props.row.key+'"]').find('.fa-trash-o').parents('button').first().click();
},
this.render: function(){
<div>
<div>Are you sure?</div>
<input placeholder="Reason"/>
<button onClick={this.handleYesClick}>Yes</button> <button onClick={this.handleNoClick}>No</button>
</div>
}
Я приступил к реализации функции handleYesClick
, пытаясь сделать обработку ошибок, асинхронные события и т.д., и все это кажется очень отрывочны, или, по крайней мере, хрупкий. Я предполагаю, что вопрос: мне нужен интерактивный popover, как мне это сделать? Похоже, что всплывающее окно будет частью локального состояния кнопки или строки, или, может быть, это ползет вверх, как кажется большинству вещей.
Поскольку реакция-бутстрап уже обеспечивает один, было бы неплохо использовать это, но я не уверен, как «подключить его» со всем остальным.
Обновление: Если бы это был простой статический поп, который был бы торт; показывая/скрывая его через реквизит, и нажатие pobtn
довольно тривиально. Часть, с которой я сталкиваюсь, - это интерактивный контент внутри popover - имея do что-то (например, событие для обновления магазина), покажите spinner, определите, что-то работает, покажите сообщение об ошибке или исчезните. Даже нажав на кнопку «Нет» и сделать поповер исчезают не ясно (я в настоящее время найти его с JQuery и .click()
кнопку еще раз.) Выполнение что все через реквизита от родителя кажется страшно ...
Вместо того чтобы иметь всю логику в popover, вы могли бы вместо этого сохранить логику внутри компонентов более высокого уровня и передать обратные вызовы, которые затем кнопки будут звонить при нажатии? – badAdviceGuy
Перечитайте свой вопрос и предложите альтернативу ниже. Способ Реагирования - это дети без гражданства, но если вы чувствуете, что родители становятся слишком толстыми с логикой, вы можете подтолкнуть логику к дереву. Это компромисс между инкапсуляцией и безгражданством. – akarve