2016-08-31 36 views
28

Tôi có bộ giảm tốc và để tính toán trạng thái mới, tôi cần dữ liệu từ hành động và dữ liệu từ một phần của trạng thái không được trình giảm tốc này quản lý. Cụ thể, trong trình giảm tốc tôi sẽ hiển thị bên dưới, tôi cần quyền truy cập vào trường accountDetails.stateOfResidenceId.Làm cách nào để truy cập trạng thái bên trong bộ giảm tốc Redux?

initialState.js:

export default { 
    accountDetails: { 
     stateOfResidenceId: '', 
     accountType: '', 
     accountNumber: '', 
     product: '' 
    }, 
    forms: { 
     blueprints: [ 

     ] 
    } 
}; 

formsReducer.js:

import * as types from '../constants/actionTypes'; 
import objectAssign from 'object-assign'; 
import initialState from './initialState'; 
import formsHelper from '../utils/FormsHelper'; 
export default function formsReducer(state = initialState.forms, action) { 
    switch (action.type) { 
    case types.UPDATE_PRODUCT: { 
     //I NEED accountDetails.stateOfResidenceId HERE 
     console.log(state); 
     const formBlueprints = formsHelper.getFormsByProductId(action.product.id); 
     return objectAssign({}, state, {blueprints: formBlueprints}); 
    } 

    default: 
     return state; 
    } 
} 

index.js (root giảm):

import { combineReducers } from 'redux'; 
import accountDetails from './accountDetailsReducer'; 
import forms from './formsReducer'; 

const rootReducer = combineReducers({ 
    accountDetails, 
    forms 
}); 

export default rootReducer; 

Tôi làm cách nào để truy cập trường này?

+0

[Cập nhật trạng thái dựa trên trạng thái của ứng dụng là một chất chống -pattern] (https://stackoverflow.com/questions/35851837/redux-and-within-a-reducer-accessing-a-different-reducer-how) – Igorsvee

+5

Tuyên bố đó không có ý nghĩa gì cả. Toàn bộ điểm của một hàm giảm tốc là bạn đưa ra quyết định dựa trên * trạng thái hiện tại * và hành động. – markerikson

Trả lời

41

Tôi sẽ sử dụng thunk cho điều này, đây là một ví dụ:

export function updateProduct(product) { 
    return (dispatch, getState) => { 
    const { accountDetails } = getState(); 

    dispatch({ 
     type: UPDATE_PRODUCT, 
     stateOfResidenceId: accountDetails.stateOfResidenceId, 
     product, 
    }); 
    }; 
} 

Về cơ bản bạn sẽ có được tất cả các dữ liệu bạn cần hành động trên, sau đó bạn có thể gửi dữ liệu đó để giảm tốc của bạn.

Chúc may mắn!

-1

Khi gửi một hành động, bạn có thể chuyển một tham số. Trong trường hợp này, bạn có thể vượt qua accountDetails.stateOfResidenceId để thực hiện hành động và sau đó chuyển nó vào bộ giảm tốc dưới dạng tải trọng.

3

Tùy chọn của bạn là viết logic hơn ngoài việc chỉ sử dụng combineReducers hoặc bao gồm nhiều dữ liệu hơn trong hành động. Câu hỏi thường gặp về Redux đề cập đến chủ đề này: http://redux.js.org/docs/faq/Reducers.html#reducers-share-state.

Ngoài ra, tôi hiện đang làm việc trên một bộ trang mới cho tài liệu Redux về chủ đề "Cấu trúc Hộp số", mà bạn có thể thấy hữu ích. Các trang WIP hiện tại là https://github.com/markerikson/redux/blob/structuring-reducers-page/docs/recipes/StructuringReducers.md.

+0

Cảm ơn câu trả lời của bạn. Tôi đã khám phá một số tài nguyên bạn đã liên kết và sẽ tiếp tục làm như vậy. Tuy nhiên, câu hỏi cho bạn, vì bạn dường như có kiến ​​thức. Một câu trả lời khác cho thấy việc sử dụng 'thunk'. Bạn có nghĩ rằng đây sẽ là một giải pháp tốt cho vấn đề của tôi? Nếu nó sẽ làm cho một mớ hỗn độn của mã của tôi hoặc không phải là một thực hành tốt nhất nó không phải là một giải pháp tôi muốn theo đuổi, nhưng tôi không cảm thấy đủ hiểu biết để xác định hiệu quả lâu dài của những lựa chọn này. – Tylerlee12

+1

Yup, khối là phương pháp cơ bản tiêu chuẩn để quản lý các hiệu ứng phụ và thực hiện logic phức tạp liên quan đến nhiều công văn và sử dụng trạng thái ứng dụng hiện tại. Hoàn toàn bình thường khi viết một hàm thunk đọc trạng thái ứng dụng hiện tại, và thực hiện những việc như gửi điều kiện, gửi nhiều hành động, hoặc lấy một phần của tiểu bang và bao gồm điều đó trong một hành động được gửi đi. Tôi có một số ví dụ về các mẫu thunk phổ biến tại https://gist.github.com/markerikson/ea4d0a6ce56ee479fe8b356e099f857e. – markerikson

0

Tôi khuyên bạn nên chuyển nó vào trình tạo tác vụ. Vì vậy, một nơi nào đó bạn sẽ có một người sáng tạo hành động mà làm điều gì đó như thế này:

updateProduct(arg1, arg2, stateOfResidenceId) { 
    return { 
    type: UPDATE_PRODUCT, 
    stateOfResidenceId 
    } 
} 

Tại nơi mà bạn kích hoạt các hành động, giả sử bạn đang sử dụng phản ứng, bạn có thể sử dụng

function mapStateToProps(state, ownProps) { 
    return { 
    stateOfResidenceId: state.accountdetails.stateOfResidenceId 
    } 
} 

và kết nối thành phần phản ứng của bạn bằng cách sử dụng kết nối của phản ứng-redux.

connect(mapStateToProps)(YourReactComponent); 

Lúc này, trong phản ứng thành phần mà bạn kích hoạt các updateProduct hành động, bạn nên có stateOfResidenceId như một chỗ dựa, và bạn có thể vượt qua nó để tạo hành động của bạn.

Nghe có vẻ phức tạp, nhưng nó thực sự là về sự tách biệt các mối quan tâm.

0

Bạn có thể cố gắng sử dụng:

redux-named-reducers

nào cho phép bạn để có được trạng thái bất cứ nơi nào trong mã của bạn như sau:

const localState1 = getState(reducerA.state1) 
const localState2 = getState(reducerB.state2) 
Các vấn đề liên quan