Đây là cách tôi triển khai nó trong một ứng dụng hiện tại (dựa trên mã của Dan từ vấn đề GitHub!)
// Based on https://github.com/rackt/redux/issues/37#issue-85098222
class ReducerRegistry {
constructor(initialReducers = {}) {
this._reducers = {...initialReducers}
this._emitChange = null
}
register(newReducers) {
this._reducers = {...this._reducers, ...newReducers}
if (this._emitChange != null) {
this._emitChange(this.getReducers())
}
}
getReducers() {
return {...this._reducers}
}
setChangeListener(listener) {
if (this._emitChange != null) {
throw new Error('Can only set the listener for a ReducerRegistry once.')
}
this._emitChange = listener
}
}
Tạo một cá thể đăng ký khi bootstrapping ứng dụng của bạn, chuyển qua các bộ giảm tốc sẽ được bao gồm trong gói mục nhập:
// coreReducers is a {name: function} Object
var coreReducers = require('./reducers/core')
var reducerRegistry = new ReducerRegistry(coreReducers)
Sau đó, khi định cấu hình cửa hàng và tuyến đường, hãy sử dụng chức năng mà bạn có thể cung cấp cho sổ đăng ký giảm tốc để:
var routes = createRoutes(reducerRegistry)
var store = createStore(reducerRegistry)
Trường hợp các chức năng này trông giống như:
function createRoutes(reducerRegistry) {
return <Route path="/" component={App}>
<Route path="core" component={Core}/>
<Route path="async" getComponent={(location, cb) => {
require.ensure([], require => {
reducerRegistry.register({async: require('./reducers/async')})
cb(null, require('./screens/Async'))
})
}}/>
</Route>
}
function createStore(reducerRegistry) {
var rootReducer = createReducer(reducerRegistry.getReducers())
var store = createStore(rootReducer)
reducerRegistry.setChangeListener((reducers) => {
store.replaceReducer(createReducer(reducers))
})
return store
}
Đây là một ví dụ trực tiếp cơ bản được tạo với thiết lập này và nguồn của nó:
Nó cũng bao gồm các cấu hình cần thiết để cho phép tải lại nóng cho tất cả các bộ giảm tốc của bạn.