Estoy tratando de establecer el estado inicial de un estado redux basado en un parámetro de elemento de objeto directamente dentro del estado de la saga redux. Tiene que estar en este archivo (larga historia), así que decido ponerlo en este archivo. Entonces, mi primer pensamiento es escribir una función en el archivo redux para hacer el trabajo. Sin embargo, no estoy seguro de cómo acceder al estado que necesitaré desde otro archivo redux. Investigué y vi que puede usar la siguiente sintaxis para hacerlo en funciones de generador
const state = yield select();Así que probé esto en una función javascript de vainilla y, como se esperaba, no funcionó. ¿Hay alguna manera de que pueda hacer lo siguiente?
const initialState = { currentAccountId: fetchAndReturnId(), currentName: '', }; function fetchAndReturnId() { const state = yield select(); const { accounts } = state.global.accounts; const charityAccount = accounts.find(acc => acc.type === 'charity'); return charityAccount.id; }Solo me preguntaba si alguien más tenía alguna otra solución. ¡Gracias!
Puedes hacer una función para ello.
Aquí hay un ejemplo para ti:
const initial = async () => { const id = await getId(); const name = await getName(); return { currentAccountId: id, currentName: name, }; };A menos que haga cosas avanzadas como inyectar reductores, lo que está tratando de hacer realmente no tiene sentido para mí. El estado inicial se llama "inicial" porque se establece ANTES de cualquier otra cosa relacionada con redux, incluida la configuración de cualquier estado o la ejecución de cualquier saga. Por lo general, no puede configurar initalState en función de otro estado redux, porque no hay otro estado en ese momento.
Dicho esto, hay algunas otras cosas que puedes hacer. Si necesita establecer el mismo estado inicial para varios reductores, puede extraerlo a alguna constante y luego usarlo en ambos lugares.
const INITIAL_DATA = 'foo'; const reducer1 = (state = INITIAL_DATA, action) => ... const reducer2 = (state = INITIAL_DATA, action) => ...Si es algo dinámico, como datos obtenidos de BE, probablemente no sea un estado inicial, sino algo que establecería mediante acciones de reducción más adelante en el ciclo de vida de la aplicación.
const reducer = (state = null, action) => { if (action.type === 'FETCHED_DATA') return action.data return state } function * saga() { const data = yield fetchData(); yield put({type: 'FETCHED_DATA', data}); } O si tiene otra saga, que necesita leer el estado redux existente y luego enviarlo al reductor que maneja una parte diferente del estado redux, puede usar el efecto de select .
function * saga() { const data = yield select(getDataFromStateSlice1); yield put({type: 'STORE_DATA_IN_STATE_SLICE_2', data}); }De todos modos, dado que lo que está tratando de hacer no tiene sentido para mí, probablemente me esté perdiendo algo en su pregunta, siéntase libre de dar más detalles.