2016-02-15 29 views
10

Đây là tiếp theo với chủ đề tôi đăng herecombineReducers gây code để phá vỡ

Sau rất nhiều xử lý sự cố tôi thấy rằng mã này hoạt động mà không bất kỳ vấn đề

import React from 'react'; 
import { createStore, combineReducers, applyMiddleware } from 'redux'; 
import createLogger from 'redux-logger'; 
import thunkMiddleware from 'redux-thunk'; 
import { Provider } from 'react-redux'; 
import DataTableReducer from './reducers/DataTableReducer'; 
import DimensionPickerReducer from './reducers/DimensionPickerReducer'; 

const loggerMiddleware = createLogger(); 
const store = createStore(
    DimensionPickerReducer, 
    applyMiddleware(
     thunkMiddleware, 
     loggerMiddleware 
    ) 
); 

export default store; 

Nhưng nếu tôi thay thế giảm duy nhất của tôi với một kết hợp cuộc gọi giảm tốc như

import React from 'react'; 
import { createStore, combineReducers, applyMiddleware } from 'redux'; 
import createLogger from 'redux-logger'; 
import thunkMiddleware from 'redux-thunk'; 
import { Provider } from 'react-redux'; 
import DataTableReducer from './reducers/DataTableReducer'; 
import DimensionPickerReducer from './reducers/DimensionPickerReducer'; 

const loggerMiddleware = createLogger(); 
const store = createStore(
    combineReducers({ 
     DataTableReducer, 
     DimensionPickerReducer 
    }), 
    applyMiddleware(
     thunkMiddleware, 
     loggerMiddleware 
    ) 
); 

export default store; 

Tôi ngay lập tức bắt đầu nhận được lỗi bởi kiểm soát DimensionPicker rằng đạo cụ bắt buộc không được chỉ định.

Vì vậy, phương pháp combinedReducer không hoạt động đối với tôi.

Tôi đã tải lên một dự án mẫu tại đây hiển thị sự cố.

https://github.com/abhitechdojo/MovieLensReact

Bạn sẽ phải chạy npm install sau khi làm một git clone

Trả lời

20

Với gia giảm kết hợp cửa hàng của bạn sẽ có cấu trúc dữ liệu như thế:

{ 
    DimensionPickerReducer: { 
     dimenisionName: '', 
     pickerIsLoading: false, 
     pickerError: '', 
     currentAttribute: '', 
     attributeList: [] 
    }, 
    DataTableReducer: { 
     tableData: [], 
     tableIsLoading:false, 
     tableError: '' 
    } 
} 

Vì vậy, bạn nên điều chỉnh container của bạn để làm việc với cửa hàng kết hợp. Ví dụ trong DimensionPickerContainer.js bạn nên thay đổi mapStateToProps chức năng:

const mapStateToProps = (state) => { 
    return { 
     attributeList : state.DimensionPickerReducer.attributeList, 
     currentAttribute : state.DimensionPickerReducer.currentAttribute 
    } 
} 

Bạn cũng có thể đặt tên làm giảm của bạn trong cửa hàng, vì vậy họ sẽ không nhìn xấu xí trong cấu trúc dữ liệu. Ví dụ. combineReducers({ dimensionPicker: DimensionPickerReducer, dataTable: DataTableReducer})

+0

và cấu trúc dữ liệu kết hợp ban đầu sẽ được khai báo ở đâu? trước đó tôi đã khai báo các cấu trúc dữ liệu riêng lẻ cho trạng thái ban đầu trong các bộ giảm tốc tương ứng. Bây giờ nếu tôi phải có một cấu trúc dữ liệu cho tất cả trạng thái ban đầu. những gì sẽ là một nơi tốt để tuyên bố nó? –

+2

Cấu trúc dữ liệu vẫn nên được khai báo trong bộ giảm tốc tương ứng. Và nếu bạn muốn tải dữ liệu ban đầu đến cửa hàng của bạn, nơi tốt nhất là nơi bạn khai báo 'createStore()', chỉ cần chuyển nó làm đối số thứ hai. Thêm thông tin về điều này: https://github.com/reactjs/redux/blob/master/docs/api/createStore.md – xCrZx

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