React - бесконечный render

188
25 декабря 2020, 02:10

В componentDidUpdate делаю второй поход за данными, что бы после добавления новой задачи( компонент AddTaskInput), изменения статуса или удаления (компонент Task), что бы ре-рендерить TaskList, но рендер происходит сразу же и получается зацикливание. Проверку в componentDidUpdate делал по примеру. Как избежать зацикливания?

import React from 'react'
import { Task } from './Task'
import { AddTaskInput } from './AddTaskInput.jsx'
export class TaskList extends  React.Component {
  constructor(props) {
    super(props)
    console.log("constructor")
    this.state = {
      tasks:null,
      isLoading: true
    }
  }
  getTodos() {
    fetch('api/tasks')
      .then(response => response.json())
      .then(tasks => this.setState({  
        tasks,
        isLoading: false,
      }));
  }

  componentDidMount() {
    this.getTodos()
    console.log('DidMount')
  }
  componentDidUpdate(prevState){
    if(prevState.tasks !== this.state.tasks){
      this.getTodos()
    }
  }

  render() {
    console.log("render")
    return this.state.isLoading ? 
      '...Loading...' : (
        <>
          <AddTaskInput/>
          <div className="listWrapper">
            <ul className="taskList">
              <Task
                tasks = {this.state.tasks}
              />
            </ul>
          </div>
        </>
      ) 
  }
}
Answer 1

Вы пытаетесь сравнить два массива

prevState.tasks !== this.state.tasks

так в js не работает и выражение всегда будет истинно, т.е. вы бесконечно будете вызывать getTodos(), который в свою очередь меняет стейт, что опять приводит к вызову componentDidUpdate.

Вместо componentDidUpdate лучше сделайте отдельные методы для добавления задачи и для удаления задачи, в которых после необходимых действий будете вызывать getTodos()

READ ALSO
Асинхронное движение изображений в js (canvas)

Асинхронное движение изображений в js (canvas)

Предположим имеется 1 изображение машиныНеобходимо создать два объекта Image с этой машиной и двигать эти два изображения асинхронно

128
Что именно идентифицирует посетителя сайта?

Что именно идентифицирует посетителя сайта?

Изучая backend, столкнулся с такой проблемой недопонимания: есть сайт, сервер Nodejs (в принципе, какой угодно, но меня интересует именно Nodejs) и зашел...

114
Настройка JqueryUi slider pips

Настройка JqueryUi slider pips

Никак не получается добиться желаемого результата со slider-ом жуквэриЕсть шаг в 5, хотелось бы получить labels в виде 1,5,10,15,20 и т

123
Передача данных с формы в jquery

Передача данных с формы в jquery

Есть вот такой код формыОн по сути отправляет директорию, в которой расположено изображение и само название изображения

110