redux-subspace是为一个非常相似的用例创建的(事实上,我们也一直在将 2 个单独的应用程序从 angular 1 迁移到 react/redux 并在它们之间共享组件)。它允许您拥有一个商店并为您的共享组件隔离其中的一部分。
基本概念是父应用程序将组件的 reducer 组合到它的 store 中,然后创建子 store 以返回简化的状态树和命名空间调度的操作。
注意:我没有使用带 redux 的 angular 并且我不知道如何将两者集成,所以我只会展示如何创建子商店并希望它对你有用(如果你确实让它工作,我很想知道,这样我们就可以在我们的文档中扩展我们支持的框架)。
import { createStore, combineReducers } from 'redux'
import { subspace, namespaced } from 'redux-subspace'
const component1 = (state = { value: 1 }, action) => {
switch (action.type) {
case 'INCREMENT':
return { ...state, value: state.value + 1 }
default:
return state
}
}
const component2 = (state = { value: 10 }, action) => {
switch (action.type) {
case 'DECREMENT':
return { ...state, value: state.value - 1 }
default:
return state
}
}
const reducer = combineReducers({
component1: namespaced('component1')(component1),
component2: namespaced('component2')(component2)
})
const store = createStore(reducer)
const component1Store = subspace((state) => state.subApp1, 'subApp1')(store)
const component2Store = subspace((state) => state.subApp2, 'subApp2')(store)
console.log('store state:', store.getState()) // { "component1": { "value": 1 }, "component2": { "value": 10 } }
console.log('component1Store state:', component1Store.getState()) // { "value": 1 }
console.log('component2Store state:', component2Store.getState()) // { "value": 10 }
现在将动作分配到这些子商店也只会影响它们的状态
component1Store.dispatch({ type: 'INCREMENT'})
console.log('store state:', store.getState()) // { "component1": { "value": 2 }, "component2": { "value": 10 } }
console.log('component1Store state:', component1Store.getState()) // { "value": 2 }
console.log('component2Store state:', component2Store.getState()) // { "value": 10 }
component2Store.dispatch({ type: 'INCREMENT'})
console.log('store state:', store.getState()) // { "component1": { "value": 2 }, "component2": { "value": 10 } }
console.log('component1Store state:', component1Store.getState()) // { "value": 2 }
console.log('component2Store state:', component2Store.getState()) // { "value": 10 }
请注意,INCREMENT
进入 的动作component2Store
并没有改变 的状态component1Store
。如果我们派发一个DECREMENT
动作,情况就会逆转
component1Store.dispatch({ type: 'DECREMENT'})
console.log('store state:', store.getState()) // { "component1": { "value": 2 }, "component2": { "value": 10 } }
console.log('component1Store state:', component1Store.getState()) // { "value": 2 }
console.log('component2Store state:', component2Store.getState()) // { "value": 10 }
component2Store.dispatch({ type: 'DECREMENT'})
console.log('store state:', store.getState()) // { "component1": { "value": 2 }, "component2": { "value": 9 } }
console.log('component1Store state:', component1Store.getState()) // { "value": 2 }
console.log('component2Store state:', component2Store.getState()) // { "value": 9 }
此时,您需要弄清楚如何将这些子存储注入到您的共享组件中。
希望这对你有用。
免责声明:我是redux-subspace的作者