Идея дизайна
Целью разработки декоратора изначально было выделение логики написания бизнес-всплывающих компонентов. Обычно разработчики хотят, чтобы бизнес-всплывающие компоненты вызывались так же, как window.alert
, и возвращали объект promise для контроля потока. Это делается для стандартизации определения всплывающих компонентов и предоставления им единого API.
Использование декоратора withFloatLayer
Декоратору требуется передать объект JSON, ключи которого будут использоваться в качестве методов вызова, а значения — для рендеринга всплывающего слоя.
import React from "react";
import {message} from "antd";
import withFloatLayer from "@yushicheng/react-floatlayer";
import TestDialog from "@/TestDialog";
@withFloatLayer({
//callTestDialog — это метод пробуждения всплывающего окна
callTestDialog:TestDialog
})
class TestPage extends React.Component {
render(){
return (
<button onClick={this.handleClick}>{"Пробудить всплывающее окно"}</button>
)};
handleClick=async ()=>{
try{
// Метод open пробуждает всплывающее окно
await this.porps.$floatLayer.callTestDialog.open();
// После метода open используется метод close для закрытия и уничтожения всплывающего окна
this.porps.$floatLayer.callTestDialog.close()
}catch(error){
// Перехватывает исключения, выброшенные методом reject во всплывающем окне
message.error(error.message)
}
};
}
export default TestPage;
Как определить всплывающий слой?
Продолжая предыдущий пример, я упростил определение TestDialog. Теперь давайте посмотрим, как мы должны определять этот всплывающий компонент.
API $promise
Имя | Описание |
---|---|
resolve | Функция-перехватчик для успешного завершения асинхронного процесса |
reject | Функция-перехватчик для неудачного завершения асинхронного процесса |
close | Специальная оболочка для внутреннего закрытия всплывающего окна |
import React from "react";
import {Modal} from "antd";
/*
Этот компонент не требует какого-либо декоратора. Определение метода похоже на дочерние компоненты в компоненте <Route> в react-router.
Как только этот компонент помещается в декоратор withFloatLayer, объект $promise добавляется к его props для управления асинхронным процессом.
*/
export default class TestDialog extends React.Component {
render(){
return (
<Modal
visible={true}
title="Тестирование всплывающего окна"
onOk={this.handleResolve}
onCancel={this.handleCancel}
>
<div>{"Отображаемый контент"}</div>
</Modal>
)};
handleResolve=()=>{
// Использует интерфейс promise в props
this.props.$promise.resolve();
};
handleCancel=()=>{
this.props.$promise.close();
};
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )