ShadowOfCasper
@ShadowOfCasper
Middle User Interface Web Developer

Можно ли отрендерить реакт-компонент императивно?

Дано:
Сервис на реакт, бОльшая часть работы которого лежит за аутентификацией.
Синглтон для ajax, который ничего не знает о реакте. Просто абстрактный класс.
Компонент Alert - каркас самого уведомления. И AlertRenderer - обёртка для алертов, которая порталит их (ReactDOM.createPortal(...)) в общую обёртку алертов на уровне App.js

Нужно:
Создать механизм обработки общих ошибок от сервера. Т.е ajax ловит ошибку, и если её обработка самим мной мне запревенчена опциями вызова метода ajax, то императивно вызывать рендер конкретного компонента, отдавая ему пропы так же императивно.
То есть хотелось бы чего-то типа
import Alert from './components/common/Alert'
 .catch(error) {
   Alert.set({textError: `${error.code}: ${error.message}`})
}


Я понимаю что можно было бы написать нативный класс для алертов со своим чистым ждаваскриптовым методом рендера не наследуясь от реакта, но это будет дубликат. Где-то я завязываю алерты на стейт компонента и вызываю из jsx, но в данном случае мне нужно вызвать его так.
Можно, конечно, обойти проблему - в стейт app.js сложить объект для массива ошибок, в нём же сетнуть в класс ajax колбэк, который бы этот массив пополнял при возникновении ошибки, но 1 - это излишне, мне не нужна реактивность стейта для простой обработки ajax ошибок, а 2 - мне интересно есть ли вообще у реакта возможность императивного рендера компонентов
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
ShadowOfCasper
@ShadowOfCasper Автор вопроса
Middle User Interface Web Developer
https://ru.reactjs.org/blog/2015/10/01/react-rende...
class AlertCaller {
    constructor(options) {
        this.state = {
            children: options.textError
        }
        this._render();
    }
    
    _render() {
        ReactDOM.render(
        <Alert {...this.state} />,
        document.getElementById("alerts")
        );
    }
    destroy() {
        ReactDOM.unmountComponentAtNode(this._container);
    }
}

thanx Роман Александрович for resolving way
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы