Какой жизненный цикл компонента использовать для выполнения каких-либо действий перед render ()?

Мне нужно проверить, являются ли некоторые реквизиты (из магазина redux) пустым объектом или нет. Если он пуст, я хочу, чтобы страница перенаправлялась на другую страницу, а не вызывала render().

Текущий поток выглядит примерно так:

constructor(props) {
   this.checkObject();
}

checkObject() {
  if (Object.keys(someObj).length === 0 && someObj.constructor === Object) {
    this.props.history.push("/some-other-route");
  }
}

render() {
   // some code
}

Однако, когда я делаю console.info, render() вызывается после checkObject(), что вызывает некоторые ошибки, потому что render() нужен непустой объект для правильного отображения содержимого. По этой причине я не хочу реагировать даже на вызов render(), если объект пуст (что я проверяю через checkObject()), и просто перенаправлять на другую страницу.

Итак, есть ли метод жизненного цикла, который будет выполнять мой код перенаправления до вызова render()?

render будет называться не смотря ни на что. Однако вы можете сделать this.state.isValid: this.checkObject() и в рендере this.state.isValid ? <JSX> : null
Rajesh 15.01.2019 08:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
1 331
4

Ответы 4

Вернуться внутрь рендера

constructor(props) {
    this.checkObject();
}

checkObject() {
    return Object.keys(someObj).length === 0 && someObj.constructor === Object
}

render() {
    if (this.checkObject()) return <Redirect to=/some-other-route" />

    //rest of code not run if object is empty
}

Вы можете использовать компонент Redirect для response-router в рендере.

import { Redirect } from 'react-router'
render(){

 (checkIfObjectEmpty)?<Redirect to = '/some_route'/>:<JSX>

}

Обновлять: Добавьте super(props) в свой конструктор. Думаю, это должно решить проблему. В этом случае нет необходимости в componentWillMount(). Ваш код должен работать нормально.

Небезопасное и временное решение:
Вы можете использовать componentWillMount().

The first true life cycle method called is componentWillMount(). This method is only called one time, which is before the initial render.

constructor(props) {

}

checkObject() {
  if (Object.keys(someObj).length === 0 && someObj.constructor === Object) {
    this.props.history.push("/some-other-route");
  }
}

componentWillMount() {
  this.checkObject();
}

render() {
   // some code
}

componentWillMount () небезопасен, так как он устарел.

Harikrishnan 15.01.2019 08:28

Спасибо. Это небезопасно, но еще не устарело. Но это хороший момент, если такого метода не будет, как мы могли бы делать такие вещи до рендеринга. Я не люблю помещать это в render(), потому что при каждом рендере (например, после setState()) код запускается, а в этом нет необходимости.

saman.shahmohamadi 15.01.2019 08:44

Документация React предпочитает метод constructor() для инициализации состояний, а для вызовов API вы можете использовать componentDidMount().

Harikrishnan 15.01.2019 09:21

Как было сказано в вопросе, он / она не хочет, чтобы рендер вызывал.

saman.shahmohamadi 15.01.2019 09:38

history.push() - это побочный эффект, который не препятствует первоначальному рендерингу компонента, поэтому он принадлежит к componentDidMount.

Поскольку результат зависит от свойств, проверка может перейти к getDerivedStateFromProps, чтобы предоставить флаг redirect в компоненте с локальным состоянием. В компоненте, который подключен к Redux, это можно сделать в mapStateToProps:

connect(({ someObj }) => ({ redirect: !Object.keys(someObj) }))(...)

Компонент не должен отображаться, если он будет перенаправлять:

componentDidMount() {
  if (this.props.redirect)
    this.props.history.push("/some-other-route");
}

render() {
   return !this.props.redirect && (
     ...
   );
}

Как правильно упоминается в другом ответе, компонент <Redirect> является декларативной альтернативой прямому вызову history.push().

Другие вопросы по теме