ในบทที่เกี่ยวกับการออกแบบรูปร่างสถานะเอกสารแนะนำให้เก็บสถานะของคุณไว้ในอ็อบเจ็กต์ที่คีย์ด้วย ID:
เก็บทุกเอนทิตีในอ็อบเจ็กต์ที่จัดเก็บโดยมี ID เป็นคีย์และใช้ ID เพื่ออ้างอิงจากเอนทิตีหรือรายการอื่น
พวกเขาไปสู่สถานะ
คิดว่าสถานะของแอปเป็นฐานข้อมูล
ฉันกำลังทำงานเกี่ยวกับรูปร่างสถานะสำหรับรายการตัวกรองซึ่งบางส่วนจะเปิดอยู่ (แสดงในป๊อปอัป) หรือมีตัวเลือกที่เลือกไว้ เมื่อฉันอ่าน "คิดว่าสถานะของแอปเป็นฐานข้อมูล" ฉันคิดว่ามันเป็นการตอบสนอง JSON เนื่องจากจะส่งคืนจาก API (ฐานข้อมูลสนับสนุน)
ดังนั้นฉันคิดว่ามันเป็น
[{
id: '1',
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
{
id: '10',
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: '1',
}]
อย่างไรก็ตามเอกสารแนะนำรูปแบบที่ชอบมากกว่า
{
1: {
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
10: {
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: '1',
}
}
ในทางทฤษฎีมันไม่ควรเรื่องตราบเท่าที่ข้อมูล serializable (ภายใต้หัวข้อ "รัฐ")
ดังนั้นฉันจึงใช้วิธีอาร์เรย์ของวัตถุอย่างมีความสุขจนกระทั่งฉันเขียนตัวลด
ด้วยวิธี object-keyed-by-id (และการใช้ไวยากรณ์การแพร่กระจายแบบเสรี) OPEN_FILTER
ส่วนของตัวลดจะกลายเป็น
switch (action.type) {
case OPEN_FILTER: {
return { ...state, { ...state[action.id], open: true } }
}
ในขณะที่วิธีอาร์เรย์ของอ็อบเจ็กต์จะยิ่งมี verbose มากขึ้น (และฟังก์ชันตัวช่วยพึ่งพา)
switch (action.type) {
case OPEN_FILTER: {
// relies on getFilterById helper function
const filter = getFilterById(state, action.id);
const index = state.indexOf(filter);
return state
.slice(0, index)
.concat([{ ...filter, open: true }])
.concat(state.slice(index + 1));
}
...
ดังนั้นคำถามของฉันมีสามเท่า:
1) ความเรียบง่ายของตัวลดแรงจูงใจในการดำเนินการด้วยวิธี object-keyed-by-id หรือไม่? มีข้อดีอื่น ๆ สำหรับรูปร่างของรัฐนั้นหรือไม่?
และ
2) ดูเหมือนว่าวิธี object-keyed-by-id ทำให้ยากต่อการจัดการกับ JSON มาตรฐานเข้า / ออกสำหรับ API (นั่นเป็นเหตุผลที่ฉันใช้อาร์เรย์ของวัตถุในตอนแรก) ดังนั้นถ้าคุณใช้แนวทางนั้นคุณเพียงแค่ใช้ฟังก์ชันเพื่อแปลงไปมาระหว่างรูปแบบ JSON และรูปแบบรูปร่างของรัฐหรือไม่? ดูเหมือนจะไม่เป็นระเบียบ (แม้ว่าคุณจะสนับสนุนแนวทางดังกล่าว แต่ก็เป็นส่วนหนึ่งของเหตุผลของคุณที่ว่ามันไม่เกะกะน้อยกว่าตัวลดอาร์เรย์ของวัตถุด้านบน?)
และ
3) ฉันรู้ว่า Dan Abramov ได้ออกแบบ redux ให้เป็นไปตามทฤษฎีโดยไม่เชื่อเรื่องพระเจ้า - โครงสร้างข้อมูล (ตามที่แนะนำโดย"ตามแบบแผนสถานะระดับบนสุดคือวัตถุหรือคอลเล็กชันคีย์ - ค่าอื่น ๆ เช่นแผนที่ แต่ในทางเทคนิคแล้วอาจเป็นได้ ประเภท "เน้นของฉัน) แต่จากที่กล่าวมาข้างต้นเป็นเพียง "แนะนำ" ให้เก็บวัตถุไว้ด้วย ID หรือมีจุดเจ็บปวดอื่น ๆ ที่คาดไม่ถึงที่ฉันจะพบโดยใช้อาร์เรย์ของวัตถุที่ทำให้เป็นเช่นนั้นฉันควรจะยกเลิกสิ่งนั้น วางแผนและพยายามที่จะยึดติดกับวัตถุที่คีย์ด้วย ID?