#reactjs #redux #high-order-component
Вопрос:
У меня есть модальное окно, которое открывается, если пользователь дважды нажал кнопку. Но я хочу использовать его в другом компоненте, поэтому я хочу сделать его многоразовым. Модальное использование состояний из Redux («Случайная активность», то есть данные, и «Повторная активность», которая является логической). Итак, меня смущает рефакторинг кода.
Это начальный код
class RepeatedModal extends Component {
closeRepeatedToast = () => {
this.props.closeRepeatedToast(false);
};
render() {
const { repeatedActivity, randomActivity, classes } = this.props;
return (
<div>
<Modal
aria-labelledby="transition-modal-title"
aria-describedby="transition-modal-description"
className={classes.modal}
open={repeatedActivity}
onClose={this.closeRepeatedToast}
closeAfterTransition
BackdropComponent={Backdrop}
BackdropProps={{
timeout: 500,
}}
>
<Fade in={repeatedActivity}>
<div className={classes.modalPaper}>
<h2 id="transition-modal-title">
"{randomActivity.activity}" was already saved
</h2>
</div>
</Fade>
</Modal>
</div>
);
}
}
export default ModalComponent(
withStyles(styles, { withTheme: true })(RepeatedModal)
);
Это код после рефакторинга.
const RepeatedModal = ({data}) => ((
<div>
<Modal
aria-labelledby="transition-modal-title"
aria-describedby="transition-modal-description"
className={classes.modal}
open={repeatedActivity}
onClose={this.closeRepeatedToast}
closeAfterTransition
BackdropComponent={Backdrop}
BackdropProps={{
timeout: 500,
}}
>
<Fade in={repeatedActivity}>
<div className={classes.modalPaper}>
<h2 id="transition-modal-title">
"{randomActivity.activity}" was already saved
</h2>
</div>
</Fade>
</Modal>
</div>
))
export default ModalComponent(
withStyles(styles, { withTheme: true })(RepeatedModal)
);
и специальные
const ModalComponent = (WrappedComponent) => {
return class extends Component {
closeRepeatedToast = () => {
this.props.closeRepeatedToast(this.data);
};
render() {
return <WrappedComponent {...this.props} data={this.state.data} />;
}
};
};
export default ModalComponent;
Комментарии:
1. Итак, вы создали компонент более высокого порядка. Есть ли какой-то вопрос или проблема? Ваш HOC, похоже, отсутствует
state.data
и не используетcloseRepeatedToast
обратный вызов.2. непонятно, какую цель вы преследуете. расскажите подробнее о внешнем интерфейсе(реквизитах), который вам необходимо реализовать для этого, таких как обратные вызовы или значения по умолчанию и т.д. если вам нужно повторно использовать весь модальный — так почему бы просто не использовать его как компонент(не нужно использовать специальный), если вам нужно повторно использовать функциональность отдельно — так напишите его внутри пользовательского крючка react и примените к любому интерфейсу.
3. Дрю Риз, ты прав. Я не могу понять, как использовать обратный вызов closeRepeatedToast и данные .