В настоящее время у меня есть компонент HOC, который я хотел бы перенести, чтобы использовать реакционные хуки, и в основном просто начинаю думать об этой идее.
Этот компонент HOC в основном предоставляет функциональность для обернутого компонента для отображения диалогового окна предупреждения. Компонент HOC управляет своим собственным состоянием, что облегчает отображение обернутого компонента в диалоговом окне. Обернутый компонент просто должен вызвать функцию, переданную реквизиту для его отображения.
Вот как теперь выглядит HOC:
function withAlertDialog(WrappedComponent) {
return class extends Component {
constructor(props) {
super(props);
this.state = {
alertDialogOpen: false,
alertMessage: ""
};
}
displayAlert = message => {
this.setState({alertDialogOpen: true, alertMessage: message});
}
closeAlertDialog = () => {
this.setState({alertDialogOpen: false});
}
render() {
return (
<React.Fragment>
<WrappedComponent
onDisplayAlert={this.displayAlert}
onCloseAlert={this.closeAlertDialog} />
<MyAlertDialogComponent
open={this.state.alertDialogOpen}
onClose={this.closeAlertDialog} />
</React.Fragment>
);
}
}
}
Это более простой случай, фактический используемый HOC намного сложнее, но идея все еще следует. Обернутый компонент теперь может вызывать this.props.onDisplayAlert('some message here');
для отображения предупреждения. Обернутый компонент также не должен отображать MyAlertDialogComponent
в своей собственной функции визуализации. По сути, обернутый компонент не должен беспокоиться о том, как обрабатывается MyAlertDialogComponent
, все, что он знает, это то, что вызов this.props.onDisplayAlert
как-то отобразит диалоговое окно с предупреждением. Повторное использование этого HOC экономит много строк кода.
Как можно было бы изменить это на реализацию реакционных хуков? Я попытался осмотреться, но большинство статей и самой документации используют HOC с одним обернутым компонентом и в действительности не управляют другим компонентом в дополнение к этому. Я хотел бы понять, как перейти к идеологии «реагировать на крючки», но сохранить тот же уровень удобства, что вам не нужно отображать MyAlertDialogComponent
в каждом компоненте, который хочет его использовать.