Как установить состояние в рендеринге, реагировать на родной

Когда я хочу установить состояние в жизненном цикле рендеринга, он выдает мне эту ошибку

Warning: Cannot update during an existing state transition (such as within render or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to componentWillMount.

changeInitial(){
   this.setState({initialLoad: false});
}

render() {
    if (this.state.initialLoad) {
        Animated.timing(this.state.listPosition, {
            toValue: 350,
            duration: 2000,
        }).start(() => this.changeInitial());
    }
 }

Как сказано в предупреждении, вы не должны вызывать setState() во время render(). Вам нужно будет переделать свой компонент, чтобы этого не делать.

Code-Apprentice 25.06.2018 13:22

Причина ошибки в том, что если вы установитеState в рендере, это вызовет повторный рендеринг и т. д. Вы получите бесконечный цикл.

bennygenel 25.06.2018 13:25

Вы должны более подробно рассказать о том, что вам действительно нужно, или привести пример ... Чтобы мы могли предоставить вам нужное место. Все возможно ...: D

Seyha 25.06.2018 13:32

вы должны написать свой if внутри метода componentDidMount()

reisdev 25.06.2018 13:38

setState в рендере вызовет повторный рендеринг .. вы получите бесконечный цикл.

Selmi Karim 25.06.2018 13:42
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
3 969
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не должны использовать setState() внутри метода render(), потому что он запускает повторный рендеринг внутри рендеринга, вызывая ошибку. Лучше всего это сделать внутри метода componentDidMount(), например:

changeInitial(){
   this.setState({initialLoad: false});
}
componentDidMount(){
    if (this.state.initialLoad) {
       Animated.timing(this.state.listPosition, {
           toValue: 350,
           duration: 2000,
       }).start(() => this.changeInitial());
    }
}
render() {
    // Your component template here
}

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