【问题标题】:Reusability of a modal in ReactJSReactJS 中模态的可重用性
【发布时间】:2019-05-29 06:45:22
【问题描述】:

在没有太多代码重复的情况下制作模态动态。我该怎么办?

我使用渲染道具将状态与布局分开。

interface State {
    open: boolean;
}

interface InjectedModalProps {
    onCloseModal: () => void;
    onOpenModal: () => void;
    open: boolean;
}

interface ModalProps {
    children(props: InjectedModalProps): ReactNode;
}
class ModalProvider extends Component<ModalProps, State> {
    state: State = {
        open: false
    };
    onOpenModal = () => {
        this.setState({ open: true });
    };

    onCloseModal = () => {
        this.setState({ open: false });
    };

    render() {
        const { open } = this.state;
        const { children } = this.props;
        return (
            <Fragment>
                {children({
                    onCloseModal: this.onCloseModal,
                    onOpenModal: this.onOpenModal,
                    open
                })}
            </Fragment>
        );
    }
}

const BathroomModal: FunctionComponent<Props> = ({ edit }) => (
    <ModalProvider>
        {({ onCloseModal, open, onOpenModal }) => {
            return (
                <Fragment>
                    <Modal open={open} center onClose={onCloseModal}>
                        <Container>
                            <h1>Badkamer toevoegen</h1>
                            {edit && <DeleteButton>Verwijderen</DeleteButton>}
                            <Divider />
                            <p>
                                Lorem ipsum dolor sit amet consectetur adipisicing elit. Est dolores incidunt ipsa,
                                earum nobis beatae facilis, dolore harum vitae nihil molestias repudiandae non quisquam
                                ab. Omnis unde atque voluptate ipsa!
                            </p>
                            <ContentBlock>
                                <h4>Type</h4>
                                <BathroomInputTypes />
                                <h4>Toilet</h4>
                                <Field name="toilet" options={[0, 1, 2, 3, 4, 5]} component={InputWithToggle} />
                                <h4>Douche</h4>
                                <Field name="shower" options={[0, 1, 2, 3, 4, 5]} component={InputWithToggle} />
                                <h4>Bad</h4>
                                <Field name="bath" options={[0, 1, 2, 3, 4, 5]} component={InputWithToggle} />
                            </ContentBlock>
                            <Divider />
                            <PrimaryButton onClick={onCloseModal} type="button">
                                {!edit ? 'Badkamer toevoegen' : 'Wijzigingen opslaan'}
                            </PrimaryButton>
                        </Container>
                    </Modal>
                    <SecondaryButton onClick={onOpenModal} type="button">
                        Badkamer toevoegen
                    </SecondaryButton>
                </Fragment>
            );
        }}
    </ModalProvider>
);

所以这就是我想出的。但是我认为通过将Modal组件提取到ModalProvider中可以更加重用。我也可以把触发按钮放在那里。但是,我也希望触发按钮是动态的,因此我可以使用图标而不是按钮来打开模式。

【问题讨论】:

    标签: javascript reactjs typescript reusability


    【解决方案1】:

    我认为这是一个好的开始。我建议您考虑模态通常具有的所有东西(在相同的位置)并将它们放入 ModalProvider 中。正如您所建议的,如果您需要带有操作按钮的对话框样式模式,我会在右下角添加关闭按钮以及有条件的“确定”按钮或类似的按钮。

    这些按钮的文本,可以通过道具改变,但它们应该总是按钮。即使它是一个图标,它也应该在一个按钮组件中以维护语义 HTML。您可以将关闭按钮值作为道具传递给模态提供程序,如下所示:

    <ModalProvider buttonText={<Icon type='close' {...props} />}>
      {... modal contents ...}
    </ModalProvider>     
    

    【讨论】:

    • 是的,我也在考虑以这种方式实现它。但是,当从道具中获取按钮时,我正在努力实现 ModalProvider 中的按钮。你会如何建议这样做?我的意思是我不能给 {buttonText} 一个 onClick 动作,对吧?无论如何,感谢您花时间帮助我!
    • 您可以通过两种不同的方式进行操作。很可能你的 onclick 方法在 ModalProvider 中总是一样的,或者至少会有一个,所以你可以在 ModalProvider 中设置它。如果需要,可以向其添加 onCloseClick 属性以更改功能。否则,您可以将一个组件作为整个按钮的 prop closeButton={} 或 renderprop style closeButton={props => }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2022-11-19
    • 2023-03-29
    • 1970-01-01
    • 2017-08-30
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多