Spec-Zone.ru › Redux 3

Магазин

В предыдущих разделах мы определили действия, которые представляют собой факты о том, «что произошло», и редукторы, которые обновляют состояние в соответствии с этими действиями.

Магазин — это объект, который объединяет их. Магазин выполняет следующие задачи:

  • Хранит состояние приложения;
  • Обеспечивает доступ к состоянию через getState();
  • Разрешает обновление состояния через dispatch(action);
  • Регистрирует слушателей через subscribe(listener);
  • Обрабатывает отмену регистрации слушателей через функцию, возвращаемую subscribe(listener).

Важно отметить, что в приложении Redux будет только один магазин. Если вы хотите разделить логику обработки данных, используйте составление редукторов, а не множество магазинов.

Создать магазин легко, если у вас есть редуктор. В предыдущем разделе мы использовали combineReducers() для объединения нескольких редукторов в один. Теперь мы импортируем его и передадим в createStore().

import { createStore } from 'redux'
import todoApp from './reducers'
let store = createStore(todoApp)

Вы можете указать начальное состояние в качестве второго аргумента функции createStore(). Это полезно для гидратации состояния клиента, чтобы оно соответствовало состоянию приложения Redux, работающего на сервере.

let store = createStore(todoApp, window.STATE_FROM_SERVER)

Отправка действий

Теперь, когда мы создали магазин, давайте проверим, работает ли наша программа! Даже без пользовательского интерфейса мы можем протестировать логику обновления.

import {
  addTodo,
  toggleTodo,
  setVisibilityFilter,
  VisibilityFilters
} from './actions'

// Log the initial state
console.log(store.getState())

// Every time the state changes, log it
// Note that subscribe() returns a function for unregistering the listener
let unsubscribe = store.subscribe(() =>
  console.log(store.getState())
)

// Dispatch some actions
store.dispatch(addTodo('Learn about actions'))
store.dispatch(addTodo('Learn about reducers'))
store.dispatch(addTodo('Learn about store'))
store.dispatch(toggleTodo(0))
store.dispatch(toggleTodo(1))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))

// Stop listening to state updates
unsubscribe()

Вы можете увидеть, как это приводит к изменению состояния, хранящегося в магазине:

Мы определили поведение нашего приложения до того, как начали писать пользовательский интерфейс. Мы не будем делать этого в этом руководстве, но на этом этапе вы можете написать тесты для своих редукторов и создателей действий. Вам не нужно будет имитировать ничего, потому что они просто чистые функции. Вызовите их и сделайте утверждения о том, что они возвращают.

Исходный код

index.js

import { createStore } from 'redux'
import todoApp from './reducers'

let store = createStore(todoApp)

Следующие шаги

Прежде чем создавать пользовательский интерфейс для нашего приложения задач, мы сделаем небольшое отступление, чтобы увидеть как данные передаются в приложении Redux.

© 2015–2017 Dan Abramov
Licensed under the MIT License.
http://redux.js.org/docs/basics/Store.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API