Трехэтапное руководство по интеграции Redux в более крупное приложение Polymer 2, демонстрирующее рабочий пример.
Шаг 2 показывает, как использовать Redux Reselect в полимерном приложении. Если вы уже знакомы с Redux Reselect и хотите узнать больше о вызове конечных точек API с помощью Redux, переходите к Шагу-3!
// If you want to clone this tutorial: git clone https://github.com/JaySunSyn/ReduxTodo.git
и не забудьте раскомментировать импорт шага 2 в index.html
<!-- <link rel="import" href="/step-1/my-app.html"> --> <link rel="import" href="/step-2/my-app.html"> <!-- <link rel="import" href="/step-3/my-app.html"> -->
В предыдущем посте мы поместили всю логику редукции в один файлredux-mixin.html
. (см. каталог/step-1/
).
Это может стать довольно запутанным, потому что:
- Редукторы, скорее всего, взорвутся.
- В наших элементах Polymer мы жестко кодируем типы действий и пути состояний. Если что-то меняется, нам нужно менять это везде.
- Не повторяйся. Если наши требования к нормализации объекта меняются, мы хотим выполнить это изменение в одном месте.
Итак, давайте создадим еще 3 файла:
Селекторы
redux-selectors.html
Во-первых, давайте установим повторный выбор
npm install --save reselect
Селекторы подобны вычисляемым свойствам в Polymer. Мы создаем их централизованно в нашем приложении Polymer. Они могут зависеть от нескольких аргументов и пересчитываться при изменении соответствующего состояния.
= ›Селекторы могут вычислять производные данные, позволяя Redux сохранять минимально возможное состояние.
= ›Селекторы работоспособны. Селектор не пересчитывается, пока не изменится один из его аргументов.
= ›Селекторы можно компоновать. Их можно использовать в качестве входных данных для других селекторов.
Давайте посмотрим на облегченную версию нашего селекторного кода:
У нас есть два селектора. todos
, который просто возвращает массив задач состояния и todosUpper
, который возвращает версию нашего массива задач в верхнем регистре. Они пересчитываются каждый раз, когда state.todo.todos
изменяется.
Давайте посмотрим, как изменяются свойства нашего <todo-list>
элемента при наличии селекторов.
До:
static get properties() { return { todos: { type: Array, statePath: ‘todos’, // hard coded }, }; }
После:
static get properties() { return { todos: { type: Array, statePath: App.select.todos, // cool }, // let's get also the upper case version todosUpperCase: { type: Array, statePath: App.select.todosUpper, }, }; }
Теперь мы можем ссылаться на вычисленные селекторы в атрибуте statePath
наших элементов - что намного чище.
Действия
redux-actions.html
В предыдущем посте мы включили соответствующие действия в каждый элемент. Добавим все действия в один файл. На более позднем этапе мы можем включить геттер наших действий в ReduxMixin
, что сэкономит нам немного писательской работы.
Код довольно прост:
Поскольку мы будем включать геттер действий в миксин, нам не нужно писать геттер в каждом элементе Polymer.
Редукторы
Как и в случае с действиями, давайте просто поместим редукторы в отдельный файл.
Здесь особо ничего не изменилось. Мы делаем Reducer доступным в глобальном пространстве только через App.rootReducer
.
ReduxMixin
redux-mixin.html
Место, где все сочетается.
Обратите внимание, что App.ReduxMixin
основан на ActionsMixin
, где мы определяем геттер действий.
Использование его в наших полимерных элементах
Мы расширяем наш элемент с App.ReduxMixin
, чтобы включить магию Redux. Обратите внимание, что нам больше не нужно писать геттер действий. Мы ссылаемся на действие, которое мы отправляем, с помощью App.actions.remove
и передаем нашу задачу.
Намного лучше, правда?
Джалал Фатхи - внештатный разработчик программного обеспечения и основатель стартапа. Увлечен веб-технологиями и влюблен в Polymer. Узнайте больше о том, как он может помочь вам в создании вашего следующего цифрового продукта. Он работает, где хочет, и старается поймать хорошую волну, где только может. Он написал эту биографию самостоятельно, а писал от третьего лица.
Затем узнайте, как мы можем асинхронно вызывать конечную точку API с помощью промежуточного программного обеспечения.