Функция React вызывается несколько раз(каждую секунду)

#javascript #reactjs #react-native #asynchronous #material-ui

Вопрос:

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

 class ComponentName extends React.Component {  constructor(props) {  super(props);  this.state = {  countries: [],  isButtonDisabled: false,  formError: false,  showModalCta: false,  showModal: false,  iframeUrl: ''  };  }   handleClose = () =gt; {  this.setState({  showModal: false  });  };    handleShowModal = () =gt; {  this.setState({  showModal: true  })  }    showModalContent = () =gt; {  const { classes } = this.props;  const { iframeUrl } = this.state;    getiframeUrl().then((res) =gt; {  this.setState({  iframeUrl: res.level2VerificationUrl  });  });   return (  lt;Paper className={classes.modalPaper}gt;  lt;iframe src={iframeUrl} width="500px" height="500px" /gt;  lt;/Papergt;  );  };   render() {  const {  classes, history, firstName, lastName, country, region, address, city, dob, phone, smsCode, postalCode, actions  } = this.props;  const {  countries, formError, isButtonDisabled, showCta, showModal  } = this.state;   return (  lt;divgt;   lt;Modal className={classes.modal} open={showModal} onClose={this.handleClose}gt;  {this.showModalContent()}  lt;/Modalgt;  lt;/divgt;  );  } }  

Это в значительной степени вызывает эту функцию, чтобы получать URL-адрес каждую секунду. Но я не совсем понимаю, почему такое поведение. Я проводил исследования по этому вопросу, но ответов нет. Есть ли какой-нибудь способ предотвратить это? Спасибо!

Комментарии:

1. Какая функция запускается повторно? Что такое this.showModalContent() ?

2. У вас есть this.setState вызов функции визуализации ( this.showModalContent ). Это означает, что каждый раз, когда компонент выполняет рендеринг, он будет вызывать this.setState , что, в свою очередь, приведет к повторному запуску компонента, вызывающему бесконечный цикл.

3. @JacobSmit Я приношу извинения за путаницу. Я случайно неправильно написал название функции. Я просто исправил это. Таким образом, он вызывает функцию «getiframeUrl», которая, как кажется, находится в функции стрелки «showModalContent» несколько раз. Но опять же, это может быть побочным эффектом вызова функции showModalContent необычным способом

4. Без дополнительной информации о том, как должен функционировать ваш компонент, мое первоначальное предложение состояло бы в том, чтобы загрузить URL-адрес iframe через getiframeUrl() в componentDidMount() и удалить вызов из this.showModalContent() .

Ответ №1:

showModalContent будет выполняться при каждом «изменении состояния» компонента (при каждом рендеринге). Там (из того, что я вижу) вы вызываете обещание (getiframeUrl) и устанавливаете состояние компонента (что заставляет его изменять состояние).

Следовательно: Визуализация -gt; showModalContent -gt;gt; изменение состояния -gt;gt;gt; повторная визуализация -gt;gt;gt;gt; showModalContent -gt;gt;gt;gt;gt; … (бесконечный цикл).

Мой совет заключается в том, что вы выполняете setState iframeUrl только в компонентдидмоунте. Что-то вроде этого:

 componentDidMount() {  const { iframeUrl } = this.state;   getiframeUrl().then((res) =gt; {  this.setState({  iframeUrl: res.level2VerificationUrl  });  }); }  showModalContent = () =gt; {  const { classes } = this.props;   return (  lt;Paper className={classes.modalPaper}gt;  lt;iframe src={iframeUrl} width="500px" height="500px" /gt;  lt;/Papergt;  );  };