У меня есть компонент, который является предупреждением Modal. Для анимации модального окна я использую Transition из semantic-ui-react. Но работает только несколько анимаций (pulse,bounce, flash), и то только при монтировании компонента, и не работает, пока я закрываю Modal. Также не работает свойство duration.
class Alert extends React.Component {
state = {
open: true
};
close = () => {
this.setState({
open: false
});
};
render() {
const { open } = this.state;
return (
<Transition animation = "fade" duration = {1000} visible = {open}>
<Modal
size = "mini"
closeOnDimmerClick = {false}
closeOnEscape = {false}
open = {this.state.open}
onClose = {this.close}>
<Modal.Content>
<p>
Hello user
</p>
</Modal.Content>
<Modal.Actions>
<Button color = "blue" onClick = {this.close}>
Ok
</Button>
</Modal.Actions>
</Modal>
</Transition>
);
}
}
Почему такое странное поведение? Что я делаю неправильно?





Modal размонтируется задолго до того, как Transition сможет его анимировать, один из способов — позволить Transition размонтировать модальное окно:
class Alert extends React.Component {
state = {
open: true
};
close = () => {
this.setState({
open: false
});
};
render() {
const { open } = this.state;
return (
<Transition
animation = "fade"
duration = {1000}
unmountOnHide = {true}
visible = {open}
>
<Modal
size = "mini"
closeOnDimmerClick = {false}
closeOnEscape = {false}
open = {true}
onClose = {this.close}
>
<Modal.Content>
<p>Hello user</p>
</Modal.Content>
<Modal.Actions>
<Button color = "blue" onClick = {this.close}>
Ok
</Button>
</Modal.Actions>
</Modal>
</Transition>
);
}
}
Я надеюсь, что это помогает!
Alert компонент не будет размонтирован, Modal будет размонтирован, Transition компонент должен быть смонтирован, чтобы он мог применять переходы своих дочерних элементов. Что вы хотите сделать, вам нужно выполнить какую-то логику после закрытия модального окна? Вы можете просто использовать метод close, который вы уже определили в компоненте.
Компонент IAlert будет использоваться приложением из любого места. Можно ли оставить его в DOM, а монтировать/размонтировать только Modal?
Ничего страшного. На самом деле, компонент Transition монтирует только свои дочерние элементы в DOM, переопределяя их className для добавления переходных классов css; ничего не будет в фактическом DOM, если у него нет детей. Изучите пример, который я приложил к ответу, вы увидите его сами.
Да, это сработало. Но компонент никогда не размонтируется. Я ставлю
componentWillUnmount, и он никогда не вызывается. Не могли бы вы попробовать это.