Cuộc thảo luận này đã được một thời gian và câu trả lời của @Alexander T. đã cung cấp một hướng dẫn tốt để theo dõi những người mới hơn của React như tôi. Và tôi sẽ chia sẻ một số kiến thức bổ sung về việc gọi cùng một API nhiều lần để làm mới thành phần, tôi nghĩ đó có thể là một vấn đề phổ biến mà người mới có thể gặp phải lúc đầu.
componentWillReceiveProps(nextProps)
, từ tài liệu chính thức :
Nếu bạn cần cập nhật trạng thái để đáp ứng với thay đổi prop (ví dụ: để đặt lại trạng thái), bạn có thể so sánh this.props và nextProps và thực hiện chuyển đổi trạng thái bằng cách sử dụng this.setState () trong phương thức này.
Chúng tôi có thể kết luận rằng đây là nơi chúng tôi xử lý các đạo cụ từ thành phần chính, có các lệnh gọi API và trạng thái cập nhật.
Dựa trên ví dụ của @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 (...)
}
}
Cập nhật
componentWillReceiveProps()
sẽ bị phản đối
Đây chỉ là một số phương thức (tất cả chúng trong Doc ) trong vòng đời mà tôi nghĩ sẽ liên quan đến việc triển khai API trong trường hợp chung:
Bằng cách tham khảo sơ đồ trên:
Triển khai API trong componentDidMount()
Kịch bản thích hợp để có lệnh gọi API ở đây là nội dung (từ phản hồi của API) của thành phần này sẽ ở trạng thái tĩnh, componentDidMount()
chỉ kích hoạt một lần trong khi thành phần được gắn, thậm chí các đạo cụ mới được truyền từ thành phần chính hoặc có hành động để dẫn re-rendering
.
Các thành phần kiểm tra sự khác biệt để kết xuất lại nhưng không gắn kết lại .
Trích dẫn từ doc :
Nếu bạn cần tải dữ liệu từ một điểm cuối từ xa, đây là một nơi tốt để khởi tạo yêu cầu mạng.
- Triển khai API trong
static getDerivedStateFromProps(nextProps, prevState)
Chúng ta nên lưu ý rằng có hai loại cập nhật thành phần , setState()
trong thành phần hiện tại sẽ không dẫn phương thức này kích hoạt, nhưng kết xuất lại hoặc đạo cụ mới từ thành phần cha mẹ thì có. Chúng tôi có thể phát hiện ra rằng phương pháp này cũng kích hoạt trong khi lắp.
Đây là nơi thích hợp để triển khai API nếu chúng tôi muốn sử dụng thành phần hiện tại như mẫu và các tham số mới cho API là các đạo cụ đến từ thành phần chính .
Chúng tôi nhận được phản hồi khác nhau từ API và trả lại một cái mới state
ở đây để thay đổi nội dung của thành phần này.
Ví dụ:
Chúng tôi có một danh sách thả xuống cho các Xe khác nhau trong thành phần chính, thành phần này cần hiển thị chi tiết của xe đã chọn.
- Triển khai API trong
componentDidUpdate(prevProps, prevState)
Khác với static getDerivedStateFromProps()
, phương thức này được gọi ngay lập tức sau mỗi kết xuất ngoại trừ kết xuất ban đầu. Chúng tôi có thể có lệnh gọi API và hiển thị sự khác biệt trong một thành phần.
Mở rộng ví dụ trước:
Thành phần để hiển thị chi tiết Xe hơi có thể chứa danh sách loạt xe này, nếu chúng tôi muốn kiểm tra phiên bản sản xuất 2013, chúng tôi có thể nhấp hoặc chọn hoặc ... mục danh sách để dẫn đầu tiên setState()
để phản ánh điều này hành vi (chẳng hạn như làm nổi bật mục danh sách) trong thành phần này và trong phần sau componentDidUpdate()
chúng tôi gửi yêu cầu của chúng tôi với các tham số (trạng thái) mới. Sau khi nhận được phản hồi, chúng tôi setState()
một lần nữa để hiển thị nội dung khác nhau của các chi tiết Xe hơi. Để ngăn điều sau componentDidUpdate()
gây ra vòng lặp vô cực, chúng ta cần so sánh trạng thái bằng cách sử dụng prevState
ở đầu phương thức này để quyết định xem chúng ta có gửi API và hiển thị nội dung mới hay không.
Phương pháp này thực sự có thể được sử dụng giống như static getDerivedStateFromProps()
với các đạo cụ, nhưng cần xử lý các thay đổi props
bằng cách sử dụng prevProps
. Và chúng ta cần hợp tác componentDidMount()
để xử lý lệnh gọi API ban đầu.
Trích dẫn từ doc :
... Đây cũng là một nơi tốt để thực hiện các yêu cầu mạng miễn là bạn so sánh các đạo cụ hiện tại với các đạo cụ trước đó ...
componentDidMount
cuộc gọi lại.