createStore(reducer, [initialState], [enhancer])
Crea un store de Redux que mantiene el árbol de estado de tu aplicación. Solo debe haber un único store en tu aplicación.
Argumentos
reducer
(Función): Una función reductora que devuelve el siguiente árbol de estado, dado el árbol de estado actual y el una acción.[
initialState
] (cualquier cosa): El estado inicial. Puedes opcionalmente especificarlo para hidratar la aplicación con el estado del servidor en aplicaciones universales, o restaurar una sesión anterior serializada. Si crear elreducer
concombineReducers
, este debe ser un objeto plano con la misma forma usada ahí. De otra forma, eres libre de pasar cualquier cosa que elreducer
pueda entender.[
enhancer
] (Función): El potenciador del store. Puedes opcionalmente especificarlo para mejorar el store con funcionalidad de terceros como los middlewares, time travel, persistencia, etc. El único potenciador de store que viene con Redux esapplyMiddleware()
.
Regresa
(Store
): Un objeto que contiene el estado actual de la aplicación. La única forma de cambiar su estado es despachando acciones. Además deberías suscribirte a los cambios de estado para actualizar la UI.
Ejemplo
import { createStore } from 'redux'
function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return state.concat([ action.text ])
default:
return state
}
}
let store = createStore(todos, [ 'Use Redux' ])
store.dispatch({
type: 'ADD_TODO',
text: 'Read the docs'
})
console.log(store.getState())
// [ 'Use Redux', 'Read the docs' ]
Consejos
¡No crees más de un Store en la aplicación! En cambio, usa
combineReducers
un solo reducer principal a partir de varios..Es tu decisión la forma del estado. Puedes usar objetos planos o algo como Immutable. Si no estas seguro, usa objetos planos.
Si tu estado es un objeto plano, ¡Asegúrate de nunca modificarlo! Por ejemplo, en vez de regresar algo como
Object.assign(state, newData)
en tus reducers, regresaObject.assign({}, state, newData)
. De esta forma no vas a sobreescribir elstate
anterior. Además puedes hacerreturn { ...state, ...newData }
si habilitas la propuesta del operador spread.En aplicaciones universales que corren en el servidor, crea una instancia del store en cada petición de forma que estén aisladas. Despacha unas pocas acciones para obtener datos a la instancia del store y espera que se completen antes de renderizar la aplicación en el servidor.
Cuando un store es creado, Redux despacha una acción falsa para que tu reducer llene el store con su estado inicial. No se supone que manejes esa acción directamente. solo recuerda que tu reducer debe devolver alguna clase de estado inicial si el estado provisto como primer argumento es
undefined
, y ya esta listo.Para aplicar multiples potenciadores de stores, probablemente quieras usar
compose()
.