ตอบสนองและRedux
ทั้งสองต้องการฟังก์ชั่นที่บริสุทธิ์ควบคู่ไปกับการไม่สามารถใช้งานได้ในการคาดการณ์
หากคุณไม่ปฏิบัติตามสองสิ่งนี้แอปของคุณจะมีข้อบกพร่องซึ่งเป็นเรื่องที่พบได้บ่อยที่สุดReact/Redux
ไม่สามารถติดตามการเปลี่ยนแปลงและไม่สามารถแสดงซ้ำได้เมื่อstate/prop
การเปลี่ยนแปลงของคุณ
ในแง่ของ React ให้พิจารณาตัวอย่างต่อไปนี้:
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
สถานะถูกจัดเก็บโดยวัตถุสถานะซึ่งได้เพิ่มคุณสมบัติเท่านั้น แอพนี้แสดงผลคุณสมบัติของแอป ไม่ควรแสดงสถานะเสมอเมื่อมีสิ่งใดเกิดขึ้น แต่ควรตรวจสอบว่ามีการเปลี่ยนแปลงเกิดขึ้นในวัตถุสถานะหรือไม่
เช่นนั้นเรามีฟังก์ชั่นเอฟเฟกต์pure function
ซึ่งเราใช้เพื่อส่งผลกระทบต่อสถานะของเรา คุณเห็นว่ามันคืนสถานะใหม่เมื่อรัฐจะมีการเปลี่ยนแปลงและส่งกลับสถานะเดียวกันเมื่อไม่จำเป็นต้องปรับเปลี่ยน
นอกจากนี้เรายังมีshouldUpdate
ฟังก์ชันที่ตรวจสอบการใช้ตัวดำเนินการ === ว่าสถานะเก่าและสถานะใหม่เหมือนกันหรือไม่
ในการทำผิดพลาดในแง่ของการตอบโต้คุณสามารถทำสิ่งต่อไปนี้ได้:
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
คุณสามารถทำผิดพลาดได้โดยตั้งค่าสถานะโดยตรงและไม่ใช้effects
ฟังก์ชัน
function doMistake(newValue) {
this.state = newValue
}
ไม่ควรทำข้างต้นและeffects
ควรใช้เฉพาะฟังก์ชันเพื่ออัปเดตสถานะ
ในแง่ของการตอบสนองที่เราเรียกว่าเป็นeffects
setState
สำหรับ Redux:
combineReducers
ยูทิลิตี้ของ Redux ตรวจสอบการเปลี่ยนแปลงการอ้างอิง
connect
วิธีการของ React-Redux จะสร้างส่วนประกอบที่ตรวจสอบการเปลี่ยนแปลงการอ้างอิงสำหรับทั้งสถานะรูทและค่าส่งคืนจากmapState
ฟังก์ชั่นเพื่อดูว่าองค์ประกอบที่ถูกห่อจำเป็นต้องแสดงอีกครั้งหรือไม่
- การดีบักเวลาเดินทางจำเป็นต้องใช้ตัวลดที่
pure functions
ไม่มีผลข้างเคียงเพื่อให้คุณสามารถข้ามระหว่างสถานะต่าง ๆ ได้อย่างถูกต้อง
คุณสามารถละเมิดสามข้อข้างต้นได้อย่างง่ายดายโดยใช้ฟังก์ชั่นไม่บริสุทธิ์เป็นตัวลด
ต่อไปนี้ถูกนำมาโดยตรงจากเอกสาร redux:
Array.prototype.reduce(reducer, ?initialValue)
มันเรียกว่าลดเพราะมันเป็นชนิดของฟังก์ชั่นที่คุณจะส่งผ่านไปยัง
มันสำคัญมากที่ตัวลดยังคงบริสุทธิ์อยู่ สิ่งที่คุณไม่ควรทำในอุปกรณ์ลดแรงดันไฟฟ้า:
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
รับอาร์กิวเมนต์เดียวกันควรคำนวณสถานะถัดไปและส่งคืน ไม่แปลกใจ. ไม่มีผลข้างเคียง ไม่มีการเรียก API ไม่มีการกลายพันธุ์ เพียงแค่คำนวณ
window.getElementById
ฯลฯ ดังนั้นการเรียกใช้ฟังก์ชันเดียวกันด้วยพารามิเตอร์เดียวกันอาจมีผลลัพธ์ที่แตกต่างกันขึ้นอยู่กับผลข้างเคียง ซึ่งการเปลี่ยนตำแหน่งจะล้มเหลว