ปรับปรุงความพยายามในการสื่อสารระหว่าง Redux Store และ API ที่คล้ายกับ REST นี่คือแพ็คเกจของฟังก์ชันตัวสร้างการดำเนินการและตัวลดที่สร้างขึ้นด้วย axios และ redux-promise-middleware ที่จัดการการจัดการสถานะทรัพยากรสำหรับคุณ... สิ่งที่คุณต้องมีคือ URL!
ไคลเอนต์สรุป API ที่คุณใช้งานอยู่ คุณสามารถสร้างไคลเอนต์ใหม่ได้โดยระบุ URL พื้นฐานสำหรับ API
นำเข้า { createClient } จาก 'redux-supermodel'const client = createClient('https://example.com/api/v1')ภายในไคลเอนต์ของคุณ คุณสามารถเริ่มกำหนดทรัพยากรได้ ทรัพยากรแต่ละรายการแสดงถึงจุดสิ้นสุดที่คุณสามารถโต้ตอบได้
// URL แบบเต็มจะเป็น https://example.com/api/v1/blogsconst blogs = client('blogs')// https://example.com/api/v1/commentsconst comment = client('comments' ) เริ่มต้นด้วยคำจำกัดความทรัพยากรของคุณ สมมติว่า http://example.com/api/posts/latest จะส่งคืนออบเจ็กต์ JSON พร้อมด้วย title คุณสมบัติและ body
// resources.jsimport { createClient } จาก 'redux-supermodel'const client = createClient('http://example.com/api')// GET http://example.com/api/posts/latest/// / { title: 'โพสต์บล็อกล่าสุดของฉัน', body: 'สวัสดีชาวโลก!' } ส่งออก const post = ลูกค้า ('โพสต์', { url: 'โพสต์/ล่าสุด' }) post.fetch() คุณสามารถใช้ connect ส่วนประกอบที่มีลำดับสูงกว่าเพื่อแนบสถานะทรัพยากรของคุณเข้ากับส่วนประกอบของคุณและเชื่อมโยงผู้สร้างการดำเนินการใดๆ ที่คุณต้องการใช้ โดยส่วนใหญ่แล้ว คุณจะดึงข้อมูลบางอย่างออกมาเมื่อส่วนประกอบประกอบเข้าด้วยกัน หากนี่เป็นส่วนประกอบเดียวที่จะใช้ทรัพยากร คุณสามารถรีเซ็ตได้เมื่อส่วนประกอบยกเลิกการต่อเชื่อม โดยปกติแล้ว create และ update การดำเนินการ ผู้สร้างจะเชื่อมโยงกับปุ่มหรือตัวจัดการส่งในแบบฟอร์มของคุณ
// MyComponent.jsimport React, { Component } จาก 'react'import { เชื่อมต่อ } จาก 'react-redux'import { post } จาก './resources'export class MyComponent ขยาย Component {
async componentDidMount() { ลอง { const res = await this.props.fetchPost()
// ผู้สร้างแอคชั่น AJAX คือคำมั่นสัญญา ดังนั้นคุณสามารถรอให้พวกเขา // จัดการกับข้อผิดพลาดหรือดำเนินการบางอย่างหลังจากเสร็จสิ้น console.log(res)} catch (error) { // redux-supermodel จะติดตามสถานะข้อผิดพลาดสำหรับคุณ แต่ // คุณสามารถทำสิ่งของคุณเองได้ alert('มีเรื่องเลวร้ายเกิดขึ้น!')}
-
// หากคุณเคยเข้าถึงทรัพยากรภายในบริบทขององค์ประกอบเดียวและ
// ลูก ๆ ของมัน คุณสามารถรีเซ็ตทรัพยากรเมื่อยกเลิกการต่อเชื่อมเพื่อล้างสถานะ redux ของคุณ
componentWillUnmount = () => this.props.resetPost()
render() {const { เริ่มต้น, ข้อผิดพลาด, หัวเรื่อง, เนื้อความ, fetchPost } = this.propsif (! เริ่มต้น) { ถ้า (ข้อผิดพลาด) {return <div className="error">{error.message}</div> } อื่น ๆ {return <div className="loading">กำลังโหลด...</div>
}}ส่งคืน ( <div><h1>{title}</h1><div className="body"> {body}</div><div className="error"> {error.message}</div>< ประเภทปุ่ม = "ปุ่ม" onClick={fetchPost}>รีเฟรช</button> </div>)
}} ฟังก์ชันส่งออก mapProps (สถานะ) {
const { พร้อม ข้อผิดพลาด เพย์โหลด } = โพสต์ (สถานะ)
const { data: { title, body } = {} } = เพย์โหลด
กลับ { พร้อม ข้อผิดพลาด หัวเรื่อง เนื้อหา }} การกระทำ const = {
fetchPost: () => post.fetch({ id: 'ล่าสุด' }),
resetPost: post.reset,} ส่งออกการเชื่อมต่อเริ่มต้น (mapProps, การดำเนินการ) (MyComponent) เพย์โหลดอาจเป็นออบเจ็กต์ขนาดใหญ่ที่มีข้อมูลจำนวนมากเกี่ยวกับคำขอและการตอบกลับ HTTP ซึ่งส่วนใหญ่คุณไม่จำเป็นต้องใช้เมื่อคุณเรนเดอร์ส่วนประกอบของคุณ ดังนั้นฉันขอแนะนำให้ใช้การเรียก mapProps เพื่อลดความซับซ้อนของเพย์โหลดเหลือเพียง สิ่งที่คุณต้องการ พยายามหลีกเลี่ยงการใช้เพย์โหลดโดยตรง ลองอ่านโพสต์บล็อกนี้เพื่ออ่านเพิ่มเติม
สำหรับรายละเอียดเกี่ยวกับ mapProps โปรดอ่านเอกสารประกอบ react-redux Connect()
npm install --save redux-supermodel redux-promise-middleware
คุณจะต้องเพิ่มมิดเดิลแวร์ redux-promise-middleware และตัวลด redux-supermodel ไปยัง Redux Store ของคุณ
// store.jsimport { createStore, ApplyMiddleware, เขียน, CombineReducers } จาก 'redux'import PromiseMiddleware จาก 'redux-promise-middleware'import { ลดเป็นทรัพยากร } จาก 'redux-supermodel'const rootReducer = รวม Reducers ({ ทรัพยากร }) ส่งออก เขียนเริ่มต้น (applyMiddleware (promiseMiddleware ())) (createStore) (rootReducer)