แก้ไข:ด้วยการแนะนำHooks
นี้เป็นไปได้ที่จะใช้ลักษณะการทำงานของวงจรชีวิตเช่นเดียวกับสถานะในส่วนประกอบการทำงาน ปัจจุบัน
Hooks เป็นข้อเสนอคุณสมบัติใหม่ที่ให้คุณใช้สถานะและคุณสมบัติการตอบสนองอื่น ๆ โดยไม่ต้องเขียนคลาส พวกเขาถูกปล่อยออกมาใน React เป็นส่วนหนึ่งของv16.8.0
useEffect
hook สามารถใช้เพื่อจำลองพฤติกรรมวงจรชีวิตและuseState
สามารถใช้เพื่อจัดเก็บสถานะในองค์ประกอบของฟังก์ชัน
ไวยากรณ์พื้นฐาน:
useEffect(callbackFunction, [dependentProps]) => cleanupFunction
คุณสามารถใช้กรณีการใช้งานของคุณในตะขอเช่น
const grid = (props) => {
console.log(props);
let {skuRules} = props;
useEffect(() => {
if(!props.fetched) {
props.fetchRules();
}
console.log('mount it!');
}, []); // passing an empty array as second argument triggers the callback in useEffect only after the initial render thus replicating `componentDidMount` lifecycle behaviour
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
useEffect
ยังสามารถส่งคืนฟังก์ชันที่จะทำงานเมื่อยกเลิกการต่อเชื่อมส่วนประกอบ สามารถใช้เพื่อยกเลิกการเป็นสมาชิกของผู้ฟังโดยจำลองพฤติกรรมของcomponentWillUnmount
:
เช่น componentWillUnmount
useEffect(() => {
window.addEventListener('unhandledRejection', handler);
return () => {
window.removeEventListener('unhandledRejection', handler);
}
}, [])
ในการกำหนดuseEffect
เงื่อนไขให้กับเหตุการณ์เฉพาะคุณอาจระบุอาร์เรย์ของค่าเพื่อตรวจสอบการเปลี่ยนแปลง:
เช่น componentDidUpdate
componentDidUpdate(prevProps, prevState) {
const { counter } = this.props;
if (this.props.counter !== prevState.counter) {
// some action here
}
}
ตะขอเทียบเท่า
useEffect(() => {
// action here
}, [props.counter]); // checks for changes in the values in this array
หากคุณรวมอาร์เรย์นี้ตรวจสอบให้แน่ใจว่าได้รวมค่าทั้งหมดจากขอบเขตคอมโพเนนต์ที่เปลี่ยนแปลงตลอดเวลา (อุปกรณ์ประกอบฉากสถานะ) มิฉะนั้นคุณอาจต้องอ้างอิงค่าจากการแสดงผลก่อนหน้านี้
มีรายละเอียดปลีกย่อยบางอย่างในการใช้useEffect
; Here
ตรวจสอบของ API
ก่อน v16.7.0
คุณสมบัติของคอมโพเนนต์ของฟังก์ชันคือไม่สามารถเข้าถึงฟังก์ชันวงจรชีวิตของ Reacts หรือthis
คีย์เวิร์ดได้ คุณต้องขยายReact.Component
คลาสถ้าคุณต้องการใช้ฟังก์ชันวงจรชีวิต
class Grid extends React.Component {
constructor(props) {
super(props)
}
componentDidMount () {
if(!this.props.fetched) {
this.props.fetchRules();
}
console.log('mount it!');
}
render() {
return(
<Content title="Promotions" breadcrumbs={breadcrumbs} fetched={skuRules.fetched}>
<Box title="Sku Promotion">
<ActionButtons buttons={actionButtons} />
<SkuRuleGrid
data={skuRules.payload}
fetch={props.fetchSkuRules}
/>
</Box>
</Content>
)
}
}
ส่วนประกอบของฟังก์ชันมีประโยชน์เมื่อคุณต้องการแสดงผลคอมโพเนนต์ของคุณเท่านั้นโดยไม่ต้องใช้ตรรกะเพิ่มเติม