Tengo una situación en la que deseo "vincular" una parte de 2 tiendas Redux juntas (sé que esto es inusual), pero no puedo encontrar la forma de filtrar las acciones de manera adecuada.
Tengo un componente reutilizable, que tiene muchos estados complejos dentro y, por lo tanto, tiene una tienda Redux para administrar esto. Como esto está dentro de una biblioteca, en lugar de una aplicación, no puedo usar la regla anterior de "fuente única de la verdad", ya que rompería el modelo de encapsulación.
La forma en que configuro mi tienda es la siguiente, que divide correctamente partes de la tienda.
const createStore = () => { const reducer = combineReducers({ a: aReducer, b: bReducer, c: cReducer, }); const composeEnhancers = composeWithDevTools({}); const store = create(reducer, composeEnhancers(applyMiddleware(ReduxThunk))); return store; }; Luego tengo un montón de acciones, por ejemplo, aquí hay una que opera en la parte a de la tienda y en la parte b de la tienda:
const foo = (payload) => ({ type: "A.FOO", payload, }); const bar = (payload) => ({ type: "B.BAR", payload, }); Esencialmente, deseo vincular dos instancias de tienda, de modo que cualquier operación que ocurra en a store1 , también ocurra en store2 . Tengo una lista de type conocidos que están disponibles, pero no estoy seguro de cómo accedo a ellos.
Puedo hacer esto de una manera primitiva que copia TODAS las operaciones:
const [store1, setStore1] = useState(); const [store2, setStore2] = useState(); useEffect(() => { if (store1 && store2) { const store1_dispatch = store1.dispatch; const store2_dispatch = store2.dispatch; const dispatch = (...args) => { store1_dispatch(...args); store2_dispatch(...args); }; store1.dispatch = dispatch; store2.dispatch = dispatch; } }, [store1, store2]); return ( <> <ComponentA onStoreCreated={setStore1} /> <ComponentB onStoreCreated={setStore2} /> </> ); Pero esto rompe varias cosas. ¿Alguien puede ver una forma en que pueda lograr esto simplemente copiando todas las acciones que operan en a o tienen un tipo de acción que comienza con A.* ?