Что происходит с «оставшимся» выполнением кода при повторном рендеринге компонента?

Допустим, используя React.js, у меня есть родительский компонент, у которого есть список в состоянии:

myList: [1, 2, 3]

Я делаю .map() для myList и визуализирую новый компонент для каждого элемента в списке. Итак, у моего родительского приложения теперь есть дочерние компоненты.

Допустим, внутри этого дочернего компонента я запускаю метод myMethod и где-то в середине этого метода я обновляю переменную состояния myList родительского компонента.

Это вызовет повторный рендеринг дочерних компонентов (включая текущий компонент) (правильно?), который выполняет myMethod, но еще не завершил выполнение всех строк этого метода.

Главный вопрос:

Что произойдет с любыми оставшимися строками кода внутри метода myMethod, которые идут после строки, вызывающей повторную визуализацию компонента метода?

(Будут ли они по-прежнему выполняться или выполнение прервется? Что-то более тонкое?)

Почему бы им прервать? Кроме того, вы столкнулись с конкретной проблемой, или это просто общий вопрос?

charlietfl 06.04.2019 14:40

разве это не должен быть бесконечный цикл? дочерние элементы обновляют состояние родителя, родитель снова перерисовывает своих дочерних элементов

AlexZvl 06.04.2019 14:43

Я предполагаю, что любой оставшийся код будет прерван, поскольку компонент будет повторно отображаться. Но я не знаю, как React работает на этом уровне, поэтому не знаю, поэтому и спрашиваю. У меня есть конкретная ситуация, когда я хочу сначала обновить состояние некоторого родительского компонента, вызывая повторную визуализацию дочернего элемента, в то время как дочерний элемент все еще должен выполнить некоторый код, включая запрос axios к бэкэнду.

Rik Schoonbeek 06.04.2019 14:43
setState является асинхронным, поэтому он не обновляет состояние вашего родительского компонента немедленно. Таким образом, оставшийся код внутри метода myMethod не будет прерван. Весь оставшийся код выполняется и только после того, как состояние родительского компонента будет обновлено, это вызовет повторную визуализацию. А также, если вы хотите, вы можете обновить состояние дочернего компонента (после того, как ваш запрос axios к серверной части был разрешен) внутри того же метода myMethod.
Sahil Raj Thapa 07.04.2019 13:01
Поведение ключевого слова "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) для оценки ваших знаний,...
2
4
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

setState является асинхронным, поэтому он не обновляет состояние вашего родительского компонента немедленно. Таким образом, оставшийся код внутри метода myMethod не будет прерван. Весь оставшийся код выполняется и только после того, как состояние родительского компонента будет обновлено, это вызовет повторную визуализацию. А также, если вы хотите, вы можете обновить состояние дочернего компонента (после того, как ваш запрос axios к серверной части был разрешен) внутри того же метода myMethod.

например:

import React, { Component } from "react";
import ReactDOM from "react-dom";

const getRandomInt = (min, max) => {
  return Math.floor(Math.random() * (max - min + 1)) + min;
};

class Parent extends Component {
  state = {
    list: [1, 2, 3]
  };

  parentHandler = value => {
    this.setState({ list: [...this.state.list, value] }, () =>
      console.info("parent component state updated")
    );
  };

  render() {
    return (
      <div>
        {this.state.list.map(item => (
          <Child key = {item} item = {item} parentHandler = {this.parentHandler} />
        ))}
      </div>
    );
  }
}

class Child extends Component {
  state = {
    id: 24
  };

  fakePromsise = () => {
    const newId = getRandomInt(24, 60);
    return new Promise((resolve, reject) => {
      setTimeout(() => resolve(newId), 5000);
    });
  };

  childHandler = listItem => {
    let newItem = listItem + getRandomInt(10, 1000);
    // handling parent state
    this.props.parentHandler(newItem);
    // handling fake promise
    // and when the promise resolves
    // update the component state
    this.fakePromsise().then(data =>
      this.setState(
        {
          id: data
        },
        () => console.info("child component state updated")
      )
    );
    // after the loop completes
    // parent state is updated
    for (let i = 0; i < 5000; i++) {
      console.info("i", i);
    }
  };

  render() {
    return (
      <div>
        <h1 onClick = {() => this.childHandler(this.props.item)}>
          {this.props.item} click me!!!
        </h1>
        <p>Id: {this.state.id}</p>
      </div>
    );
  }
}

ReactDOM.render(<Parent />, document.getElementById('root'));

you can use the example and see the console result. Just click the h1 tag. After which new Child component is added and the clicked Child component id is changed.

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