อีกทางเลือกหนึ่งหากคุณใช้ react-redux และต้องการการดำเนินการนั้นในที่เดียวหรือสามารถสร้าง HOC ได้ดี (ส่วนประกอบอื่น ๆ ที่สูงกว่าไม่จำเป็นต้องเข้าใจว่าสิ่งสำคัญคือสิ่งนี้อาจทำให้ html ของคุณขยายตัวได้) ทุกที่ที่คุณต้องการ การเข้าถึงนั้นคือการใช้mergepropsโดยมีการส่งผ่านพารามิเตอร์เพิ่มเติมไปยังการดำเนินการ:
const mapState = ({accountDetails: {stateOfResidenceId}}) => stateOfResidenceId;
const mapDispatch = (dispatch) => ({
pureUpdateProduct: (stateOfResidenceId) => dispatch({ type: types.UPDATE_PRODUCT, payload: stateOfResidenceId })
});
const mergeProps = (stateOfResidenceId, { pureUpdateProduct}) => ({hydratedUpdateProduct: () => pureUpdateProduct(stateOfResidenceId )});
const addHydratedUpdateProduct = connect(mapState, mapDispatch, mergeProps)
export default addHydratedUpdateProduct(ReactComponent);
export const OtherHydratedComponent = addHydratedUpdateProduct(OtherComponent)
เมื่อคุณใช้ mergeProps สิ่งที่คุณส่งคืนจะถูกเพิ่มเข้าไปในอุปกรณ์ประกอบฉาก mapState และ mapDispatch จะทำหน้าที่ให้อาร์กิวเมนต์สำหรับ mergeProps เท่านั้น กล่าวอีกนัยหนึ่งฟังก์ชันนี้จะเพิ่มสิ่งนี้ให้กับอุปกรณ์ประกอบฉากของคุณ (ไวยากรณ์ typescript):
{hydratedUpdateProduct: () => void}
(โปรดทราบว่าฟังก์ชันจะส่งคืนการกระทำนั้นเองและไม่เป็นโมฆะ แต่ในกรณีส่วนใหญ่คุณจะไม่สนใจ)
แต่สิ่งที่คุณทำได้คือ:
const mapState = ({ accountDetails }) => accountDetails;
const mapDispatch = (dispatch) => ({
pureUpdateProduct: (stateOfResidenceId) => dispatch({ type: types.UPDATE_PRODUCT, payload: stateOfResidenceId })
otherAction: (param) => dispatch(otherAction(param))
});
const mergeProps = ({ stateOfResidenceId, ...passAlong }, { pureUpdateProduct, ... otherActions}) => ({
...passAlong,
...otherActions,
hydratedUpdateProduct: () => pureUpdateProduct(stateOfResidenceId ),
});
const reduxPropsIncludingHydratedAction= connect(mapState, mapDispatch, mergeProps)
export default reduxPropsIncludingHydratedAction(ReactComponent);
สิ่งนี้จะมอบสิ่งต่อไปนี้ให้กับอุปกรณ์ประกอบฉาก:
{
hydratedUpdateProduct: () => void,
otherAction: (param) => void,
accountType: string,
accountNumber: string,
product: string,
}
โดยรวมแล้วแม้ว่าการเลิกใช้งานอย่างสมบูรณ์ผู้ดูแลระบบ redux แสดงให้เห็นถึงการขยายการทำงานของแพคเกจเพื่อรวมความปรารถนาดังกล่าวไว้ในทางที่ดีซึ่งจะสร้างรูปแบบสำหรับฟังก์ชันเหล่านี้โดยไม่สนับสนุนการแยกส่วนของระบบนิเวศเป็นสิ่งที่น่าประทับใจ
แพคเกจเช่น Vuex ที่ไม่ดื้อรั้นไม่มีปัญหาเกือบมากมายกับผู้คนที่ใช้แอนตี้แพตเทิร์นในทางที่ผิดเพราะพวกเขาหลงทางในขณะเดียวกันก็รองรับไวยากรณ์ที่สะอาดขึ้นโดยมีแผ่นสำเร็จรูปน้อยกว่าที่คุณจะเก็บถาวรด้วย redux และแพ็คเกจสนับสนุนที่ดีที่สุด และแม้ว่าแพ็คเกจจะมีความหลากหลายมากขึ้น แต่เอกสารก็ยังเข้าใจได้ง่ายกว่าเพราะพวกเขาไม่หลงทางในรายละเอียดเช่นเอกสารซ้ำซ้อนมีแนวโน้มที่จะทำ