Это обсуждение длилось некоторое время, и ответ @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()
будет устаревшим.
Вот только некоторые методы (все они в Документе ) в жизненном цикле, которые, я думаю, будут связаны с развертыванием API в общем случае:
Обращаясь к диаграмме выше:
Развернуть API в componentDidMount()
Правильный сценарий для вызова API здесь заключается в том, что содержимое (из ответа API) этого компонента будет статическим, componentDidMount()
срабатывать только один раз, пока компонент монтируется, даже новые реквизиты передаются из родительского компонента или требуют действий re-rendering
.
Компонент проверяет разницу для повторного рендеринга, но не для повторного монтирования .
Цитата из документа :
Если вам нужно загрузить данные с удаленной конечной точки, это хорошее место для создания экземпляра сетевого запроса.
- Развернуть 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, но необходимо обрабатывать изменения props
, используя prevProps
. И нам нужно сотрудничать с componentDidMount()
для обработки первоначального вызова API.
Цитата из документа :
... Это также хорошее место для выполнения сетевых запросов, если вы сравниваете текущие реквизиты с предыдущими ...
componentDidMount
обратном вызове .