Переписывание диалогового окна / всплывающего компонента DevExtreme в эквивалент MaterialUI (react / javascript)

#reactjs #material-ui #dialog #popup

Вопрос:

Я отказываюсь от использования компонентов DevExtreme/DevExpress, и последним из них является мой компонент всплывающего окна / диалога.

Старое всплывающее окно работало так, что оно отображалось в фоновом режиме. Всплывающее окно отображается, но скрыто до тех пор, пока visible ему не будет передан атрибут. Я закодировал его следующим образом:

             <UniversalPopupComponent
                popupDefinition={ownerDatabaseView}
                popupValues={databaseRowData}
                onSubmit={this.myPopupSubmitted}
                onCancel={this.myPopupCancelled}
                visible={this.state.popupVisibility}
            />
 

Компонент пользовательского интерфейса Material, похоже, работает по-другому. Для начала, как мне указать, чтобы диалоговое окно MaterialUI отображалось только при нажатии кнопки, где вызывается компонент диалога, прежде чем я перейду к части фактического добавления данных и обработки данных, которые передаются внутри для создания содержимого?

В настоящее время у меня есть прогресс MUI (PopupMUI.js) :

 class UniversalPopupComponent extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            open: this.props.open
        }
    }

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

    render() {

        return (
            <Dialog open={this.state.open} onClose={this.handleClickClose}>
                <DialogContent>
                    placeholder
                </DialogContent>
                <DialogActions>
                    <Button onClick={this.handleClickClose}> Close </Button>
                    <Button onClick={this.handleClickClose}> Submit </Button>
                </DialogActions>
            </Dialog>

        )
    }

}

export default UniversalPopupComponent;
 

и в App.js содержит следующие связанные вещи:

 class App extends React.Component {
state = {
    open: false,
};

handlePopupOpen = () => {
    this.setState({open:true})

}

render() {
      return (
         <div> ...
                <Button onClick={this.handlePopupOpen}> Open Menu </Button>
                <UniversalPopupComponent open={this.state.open} />
         ... </div>
)}
 

Я не могу заставить диалоговое окно открыться таким образом, передав состояние «открыто» как «истина» в диалоговое окно внутри компонента с реквизитами.

Однако, если у меня есть ниже, то диалоговое окно открывается нормально и закрывается тоже нормально (нажмите закрыть определяется как просто setState({открыть:ложь})

                 <Button onClick={this.handlePopupOpen}> Open Menu </Button>
                <Dialog open={this.state.open} onClose={this.handleClickClose}>
                    <DialogContent>
                        placeholder
                    </DialogContent>
                    <DialogActions>
                        <Button onClick={this.handleClickClose}> Close </Button>
                        <Button onClick={this.handleClickClose}> Submit </Button>
                    </DialogActions>
        </Dialog>
 

Я еще не настроился на передачу каких-либо данных, так как большая проблема заключается в том, что диалоговое окно не откроется, чтобы я мог начать настройку всего и переписать части.

Ответ №1:

Так что мой глупый мозг совершенно забыл, что, как только что-то находится в конструкторе, оно не обновляется. Так что я передавал open реквизит, но написал его только один раз.

Я просто добавил componentDidUpdate функцию, которая сравнивает текущее состояние Open с новым состоянием Open из prop, если они отличаются, напишите новое состояние prop.

Затем я добавил обратный вызов, чтобы, когда что-то закрывается, оно устанавливало состояние открыто на false, что обновляет компонент и закрывает меню.