ฉันหมายความว่าพวกเขาเหมือนเหตุการณ์มากกว่าสถานะ!
ฉันจะไม่พูดอย่างนั้น ฉันคิดว่าอินดิเคเตอร์การโหลดเป็นกรณีที่ยอดเยี่ยมของ UI ที่อธิบายได้ง่ายว่าเป็นฟังก์ชันของสถานะ: ในกรณีนี้คือตัวแปรบูลีน แม้ว่าคำตอบนี้จะถูกต้อง แต่ฉันก็อยากจะให้รหัสบางส่วนไปด้วย
ในasync
ตัวอย่างใน Redux repo ตัวลดจะอัปเดตฟิลด์ที่เรียกว่าisFetching
:
case REQUEST_POSTS:
return Object.assign({}, state, {
isFetching: true,
didInvalidate: false
})
case RECEIVE_POSTS:
return Object.assign({}, state, {
isFetching: false,
didInvalidate: false,
items: action.posts,
lastUpdated: action.receivedAt
ส่วนประกอบใช้connect()
จาก React Redux เพื่อสมัครสมาชิกสถานะของร้านค้าและส่งคืนisFetching
เป็นส่วนหนึ่งของmapStateToProps()
ค่าส่งคืนดังนั้นจึงมีอยู่ในอุปกรณ์ประกอบฉากของส่วนประกอบที่เชื่อมต่อ:
function mapStateToProps(state) {
const { selectedReddit, postsByReddit } = state
const {
isFetching,
lastUpdated,
items: posts
} = postsByReddit[selectedReddit] || {
isFetching: true,
items: []
}
return {
selectedReddit,
posts,
isFetching,
lastUpdated
}
}
สุดท้ายคอมโพเนนต์ใช้isFetching
เสาในrender()
ฟังก์ชันเพื่อแสดงฉลาก "กำลังโหลด ... " (ซึ่งอาจเป็นสปินเนอร์แทน):
{isEmpty
? (isFetching ? <h2>Loading...</h2> : <h2>Empty.</h2>)
: <div style={{ opacity: isFetching ? 0.5 : 1 }}>
<Posts posts={posts} />
</div>
}
ยิ่งไปกว่านั้นฉันควรทำอย่างไรเมื่อต้องใช้กล่องโต้ตอบยืนยันดั้งเดิมหรือกล่องโต้ตอบการแจ้งเตือนในแอป redux / react ควรวางการกระทำหรือตัวลดลงที่ไหน?
ผลข้างเคียงใด ๆ (และการแสดงกล่องโต้ตอบนั้นเป็นผลข้างเคียงอย่างแน่นอน) ไม่ได้อยู่ในตัวลด คิดว่าตัวลดขนาดเป็น "ผู้สร้างสถานะ" แบบแฝง พวกเขาไม่ได้ "ทำ" สิ่งต่างๆ
หากคุณต้องการแสดงการแจ้งเตือนให้ดำเนินการดังกล่าวจากส่วนประกอบก่อนส่งการดำเนินการหรือดำเนินการจากผู้สร้างการดำเนินการ เมื่อถึงเวลาที่การดำเนินการจะถูกส่งไปก็สายเกินไปที่จะดำเนินการผลข้างเคียงเพื่อตอบสนอง
สำหรับทุกกฎมีข้อยกเว้น บางครั้งตรรกะผลข้างเคียงของคุณซับซ้อนมากจนคุณต้องการจับคู่กับประเภทการกระทำเฉพาะหรือกับตัวลดเฉพาะ ในกรณีนี้ให้ตรวจสอบโครงการขั้นสูงเช่นRedux SagaและRedux ห่วง ทำสิ่งนี้เฉพาะเมื่อคุณพอใจกับ vanilla Redux และมีปัญหาที่แท้จริงของผลข้างเคียงที่กระจัดกระจายซึ่งคุณต้องการให้จัดการได้ง่ายขึ้น