การสนทนานี้มีมาระยะหนึ่งแล้วและคำตอบของ @Alexander T. ให้คำแนะนำที่ดีในการปฏิบัติตามสำหรับ React รุ่นใหม่เช่นฉัน และฉันจะแบ่งปันความรู้เพิ่มเติมเกี่ยวกับการเรียก API เดียวกันหลาย ๆ ครั้งเพื่อรีเฟรชส่วนประกอบฉันคิดว่าน่าจะเป็นปัญหาทั่วไปที่มือใหม่อาจต้องเผชิญในตอนเริ่มต้น
componentWillReceiveProps(nextProps)
จากเอกสารอย่างเป็นทางการ :
หากคุณต้องการอัปเดตสถานะเพื่อตอบสนองต่อการเปลี่ยนแปลง prop (เช่นเพื่อรีเซ็ต) คุณสามารถเปรียบเทียบ 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 ที่นี่เป็นที่เนื้อหา (จากการตอบสนองของเอพีไอ) ของส่วนนี้จะเป็นแบบคงที่เพียงไฟไหม้ครั้งเดียวในขณะที่องค์ประกอบที่มีการติดตั้งอุปกรณ์ประกอบฉากใหม่จะถูกส่งผ่านจากองค์ประกอบปกครองหรือมีการดำเนินการเพื่อนำไปสู่componentDidMount()
คอมโพเนนต์ตรวจสอบความแตกต่างเพื่อเรนเดอร์ใหม่แต่ไม่ติดตั้งใหม่
อ้างจากdoc :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
prevProps
และเราจำเป็นต้องร่วมมือcomponentDidMount()
เพื่อจัดการการเรียก API ครั้งแรก
อ้างจากdoc :
... นี่เป็นสถานที่ที่ดีในการร้องขอเครือข่ายตราบเท่าที่คุณเปรียบเทียบอุปกรณ์ประกอบฉากปัจจุบันกับอุปกรณ์ประกอบฉากก่อนหน้า ...
componentDidMount
โทรกลับ