Задать вопрос
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 - мне интересно есть ли вообще у реакта возможность императивного рендера компонентов
  • Вопрос задан
  • 64 просмотра
Подписаться 1 Средний 6 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽