Ця дискусія тривала деякий час, і відповідь @Alexander T. дала хороший посібник, щоб слідкувати за новими, як на мене, React. І я поділюсь додатковими ноу-хау щодо виклику одного і того ж API кілька разів, щоб оновити компонент, я думаю, що це, мабуть, поширена проблема, з якою стикається новачок на початку.
componentWillReceiveProps(nextProps)
, з офіційної документації :
Якщо вам потрібно оновити стан у відповідь на підтримку змін (наприклад, для його скидання), ви можете порівняти this.props та nextProps та виконати переходи стану, використовуючи this.setState () у цьому методі.
Ми можемо зробити висновок, що тут ми обробляємо реквізити з батьківського компонента, здійснюємо виклики API та стан оновлення.
Базуйтесь на прикладі @Alexander T.:
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {person: []};
}
componentDidMount() {
//For our first load.
this.UserList(this.props.group); //maybe something like "groupOne"
}
componentWillReceiveProps(nextProps) {
// Assuming parameter comes from url.
// let group = window.location.toString().split("/")[*indexParameterLocated*];
// this.UserList(group);
// Assuming parameter comes from props that from parent component.
let group = nextProps.group; // Maybe something like "groupTwo"
this.UserList(group);
}
UserList(group) {
$.getJSON('https://randomuser.me/api/' + group)
.then(({ results }) => this.setState({ person: results }));
}
render() {
return (...)
}
}
Оновлення
componentWillReceiveProps()
буде застарілим.
Ось лише деякі методи (усі вони в Doc ) у життєвому циклі, які, на мою думку, стосуються розгортання API в цілому:
Посилаючись на діаграму вище:
Розгортання API в componentDidMount()
Власний сценарій для виклику API тут полягає в тому, що вміст (з відповіді API) цього компонента буде статичним, componentDidMount()
запускається лише один раз, поки компонент монтується, навіть нові реквізити передаються з батьківського компонента або проводять дії re-rendering
.
Компонент перевіряє різницю, щоб повторно відобразити, але не перевстановити .
Цитата від doc :
Якщо вам потрібно завантажити дані з віддаленої кінцевої точки, це хороше місце для екземпляру мережевого запиту.
- Розгортання API в
static getDerivedStateFromProps(nextProps, prevState)
Слід зауважити , що існує два види компонента поновлення , setState()
в поточному компоненті б НЕ привести цей метод для запуску, але повторний рендеринг або нові підпори з батьківського компонента роблять. Ми могли дізнатися, що цей метод також спрацьовує під час монтажу.
Це правильне місце для розгортання API, якщо ми хочемо використовувати поточний компонент, як шаблон, а нові параметри для API - реквізити, що надходять від батьківського компонента .
Ми отримуємо іншу відповідь від API і повертаємо нову state
сюди, щоб змінити вміст цього компонента.
Наприклад: у
нас є випадаючий список для різних автомобілів у батьківському компоненті, цей компонент повинен відображати деталі вибраного.
- Розгортання API в
componentDidUpdate(prevProps, prevState)
static getDerivedStateFromProps()
Цей метод відрізняється від кожного виводу, окрім початкового відображення. У нас може бути різниця в дзвінках і рендерингу API в одному компоненті.
Розширити попередній приклад:
Компонент для відображення деталей автомобіля може містити перелік серій цього автомобіля, якщо ми хочемо перевірити виробництво 2013 року, ми можемо натиснути або вибрати або ... пункт списку, щоб першим setState()
відобразити це. поведінки (наприклад, виділення елемента списку) у цьому компоненті, а далі componentDidUpdate()
ми надсилаємо наш запит із новими параметрами (стан). Отримавши відповідь, ми setState()
знову надаємо різний зміст деталей автомобіля. Щоб наступне componentDidUpdate()
не спричинило цикл нескінченності, нам потрібно порівняти стан, скориставшись prevState
на початку цього методу, щоб вирішити, чи надсилаємо API та надаємо новий вміст.
Цей метод справді можна використовувати так само, як static getDerivedStateFromProps()
і для реквізиту, але потрібно впоратися зі змінами props
, використовуючи prevProps
. І нам потрібно співпрацювати, componentDidMount()
щоб обробити початковий виклик API.
Цитата від doc :
... Це також гарне місце для здійснення мережевих запитів, якщо ви порівнюєте поточний реквізит з попередніми реквізитами ...
componentDidMount
зворотного дзвінка.