Я знаю, что этот вопрос уже задавали пару раз, но в большинстве случаев решение состоит в том, чтобы справиться с этим в родительском элементе, поскольку поток ответственности только нисходящий. Однако иногда вам нужно убить компонент одним из его методов. Я знаю, что не могу изменить его свойства, и если я начну добавлять логические значения в качестве состояния, для простого компонента это станет действительно беспорядочным. Вот чего я пытаюсь добиться: небольшой компонент окна ошибки с символом «x», чтобы его отклонить. Получение ошибки через его свойства отобразит ее, но я бы хотел закрыть ее из собственного кода.
class ErrorBoxComponent extends React.Component {
dismiss() {
// What should I put here?
}
render() {
if (!this.props.error) {
return null;
}
return (
<div data-alert className="alert-box error-box">
{this.props.error}
<a href="#" className="close" onClick={this.dismiss.bind(this)}>×</a>
</div>
);
}
}
export default ErrorBoxComponent;
И я бы использовал это в родительском компоненте так:
<ErrorBox error={this.state.error}/>
В разделе Что здесь поставить? , Я уже пробовал:
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
Что вызывает красивую ошибку в консоли:
Предупреждение: unmountComponentAtNode (): узел, который вы пытаетесь размонтировать, был отрисован React и не является контейнером верхнего уровня. Вместо этого попросите родительский компонент обновить свое состояние и выполнить повторную визуализацию, чтобы удалить этот компонент.
Следует ли мне копировать входящие реквизиты в состояние ErrorBox и манипулировать им только внутренне?
Ответы:
Как и в том приятном предупреждении, которое вы получили, вы пытаетесь сделать что-то, что является антипаттерном в React. Это нет-нет. React предназначен для размонтирования родительских и дочерних отношений. Теперь, если вы хотите, чтобы дочерний элемент отключился, вы можете смоделировать это с помощью изменения состояния в родительском элементе, которое запускается дочерним элементом. позвольте мне показать вам код.
это очень простой пример. но вы можете увидеть грубый способ передать родителю действие
При этом вам, вероятно, следует пройти через магазин (действие отправки), чтобы ваш магазин содержал правильные данные, когда он идет на рендеринг.
Я делал сообщения об ошибках / статусе для двух отдельных приложений, оба прошли через магазин. Это предпочтительный метод ... Если хотите, я могу опубликовать код, как это сделать.
РЕДАКТИРОВАТЬ: вот как я настроил систему уведомлений с помощью React / Redux / Typescript
Прежде всего, следует отметить несколько моментов. это в машинописном тексте, поэтому вам нужно удалить объявления типов :)
Я использую lodash пакетов npm для операций и имена классов (псевдоним cx) для встроенного назначения имен классов.
Прелесть этой настройки в том, что я использую уникальный идентификатор для каждого уведомления, когда действие его создает. (например, notify_id). Этот уникальный идентификатор - это
Symbol()
. Таким образом, если вы хотите удалить любое уведомление в любой момент времени, вы можете это сделать, потому что вы знаете, какое из них нужно удалить. Эта система уведомлений позволит вам складывать столько, сколько вы хотите, и они исчезнут, когда анимация будет завершена. Я подключаюсь к событию анимации, и когда оно завершается, я запускаю код для удаления уведомления. Я также установил запасной тайм-аут, чтобы удалить уведомление на случай, если обратный вызов анимации не сработает.уведомление-действия.ts
уведомление-reducer.ts
app.tsx
в базовом рендере для вашего приложения вы будете рендерить уведомления
user-notification.tsx
класс уведомления пользователя
источник
Вместо того, чтобы использовать
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);
попробуйте использовать
источник
<div id="c1"><div id="c2"><div id="react-root" /></div></div>
. Что делать, если внутренний текстc1
заменяется?В большинстве случаев достаточно просто скрыть элемент, например так:
Или вы можете отображать / повторно отображать / не отображать через родительский компонент, например
Наконец, есть способ удалить узел html, но я действительно не знаю, хорошая ли это идея. Может быть, кто-нибудь, кто знает React изнутри, что-нибудь скажет по этому поводу.
источник
Я был на этом посте около 10 раз и просто хотел оставить здесь свои два цента. Можно просто размонтировать условно.
Все, что вам нужно сделать, это удалить его из DOM, чтобы размонтировать.
Пока
renderMyComponent = true
компонент будет отображаться. Если вы установитеrenderMyComponent = false
, он отключится от DOM.источник
Это не подходит для всех ситуаций, но вы можете условно
return false
внутри самого компонента, если определенные критерии соблюдены или не выполнены.Он не отключает компонент, но удаляет весь отображаемый контент. На мой взгляд, это было бы плохо, только если у вас есть прослушиватели событий в компоненте, которые следует удалить, когда компонент больше не нужен.
источник