2016-06-20 13 views
18

Tôi bị kẹt với bit này và tôi không thể tiến triển - tôi đoán giải pháp rất đơn giản nhưng tôi không thể tìm ra. Tôi đang cố gắng để thêm mục trong giảm tốc để dữ liệu ở trong sẽ giống này:Redux - Cách thêm mục nhập vào mảng trong bộ giảm số

state = { 
    entryId: { 
    entryName: ["something", "something2", "something3" /* and so on... */] 
    } 
}; 

Cho đến nay đây là gần nhất tôi nhận được, nhưng, thay vì thêm entry độc đáo mới, nó được thay thế một trong những đã được lưu trữ rồi. Ngoài ra tôi cần để có thể thêm mặt hàng này vào trạng thái trống rỗng nơi entryId, entryName chưa hề tồn tại để tránh lỗi:

switch(type) { 
    case ADD_ENTRY: 
    return { 
     ...state, 
     [entryId]: { 
     ...state[entryId], 
     [entryName]: { 
      [uniqueEntry]: true 
     } 
     } 
    }; 
} 

Bất kỳ ý tưởng những gì tôi đang làm sai?

+0

Bạn có thể viết thêm ngữ cảnh cho ví dụ không? Ví dụ: bạn có thể chỉ ra _shape_ của hành động bạn đang xử lý bộ giảm giới hạn không? –

+0

Tôi đang gửi một cái gì đó như thế này: addEntry ({entryId, entryName, uniqueEntryid}) – eloleon

+0

Hãy thử cách này: [link] (https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage -2% 2Cstage-3 & code = const% 20state% 20% 3D% 20% 7B% 0D% 0A% 20% 20entryId% 3A% 20% 7B% 0D% 0A% 20% 20% 20% 20% Tên% 3A% 20% 5B % 22something% 22% 2C% 20% 22something2% 22% 2C% 20% 22something3% 22% 5D% 0D% 0A% 20% 20% 7D% 0D% 0A% 7D% 3B% 0D% 0A% 0D% 0Aconst% 20newState % 20% 3D% 20% 7B% 0D% 0A% 20% 20% 5B% 22entryId% 22% 5D% 3A% 7B% 0D% 0A% 20% 20% 20% 20% 5B% 22entryName% 22% 5D% 3A % 20% 5B ... trạng thái% 5B% 22entryId% 22% 5D% 5B% 22entryName% 22% 5D% 2C% 22something4% 22% 5D% 0D% 0A% 20% 20% 7D% 0D% 0A% 7D% 3B % 0D% 0A% 0D% 0Aconsole.log (newState)% 3B & thử nghiệm = true & loose = false & spec = false) – jzm

Trả lời

22

Nếu bạn đang cố gắng để thêm một phần tử vào cuối của mảng entryName bạn nên làm:

return { 
    ...state, 
    [entryId]: { 
    ...state[entryId], 
    [entryName]: [ 
     ...state[entryId][entryName], 
     uniqueEntry 
    ] 
    } 
}; 

ES6 lây lan với mảng hoạt động như sau:

const array1 = [1, 2, 3]; 
const array2 = [4, 5, 6]; 
const eight = 8; 

const newArray = ['stuff', ...array1, 'things', ...array2, ...[7, eight], 9]; 
console.log(newArray); // ["stuff", 1, 2, 3, "things", 4, 5, 6, 7, 8, 9] 

Kiểm tra ra this gist có ví dụ về điều gì đó rất giống với những gì bạn đang làm.

Tôi cũng thấy tập hợp các ví dụ này cực kỳ hữu ích. Rất nhiều công cụ tuyệt vời ở đây:

https://github.com/sebmarkbage/ecmascript-rest-spread

Cập nhật:

Nếu entryName được khởi tạo để undefined như bạn nói trong bình luận của bạn, bạn có thể làm điều này:

return { 
    ...state, 
    [entryId]: { 
    ...state[entryId], 
    [entryName]: [ 
     ...state[entryId][entryName] || [], 
     uniqueEntry 
    ] 
    } 
}; 

Tôi nghĩ đây là một ví dụ khá tuyệt về việc nó có thể hoạt động như thế nào với React/redux bằng cách sử dụng cấu trúc dữ liệu lồng nhau. FWIW, nó được đề nghị với tôi nhiều lần để san bằng trạng thái của bạn càng nhiều càng tốt.

+0

Cảm ơn dannyid! Tôi đã thử cùng một điều và vấn đề là trạng thái ban đầu là một đối tượng trống để dòng này '... nhà nước [entryId] [entryName]' sẽ ném lỗi – eloleon

+0

Ahh, đó là một phần quan trọng của thông tin! Bạn có thể cập nhật câu hỏi của bạn và tôi sẽ cập nhật câu trả lời của tôi? – jaybee

+0

Tôi sẽ cập nhật câu hỏi ngay bây giờ.BTW Tôi đã làm việc xung quanh vấn đề của tôi với cách tiếp cận khá giống hệt như bạn "|| []" – eloleon

Các vấn đề liên quan