Совместное использование действий Redux между несколькими редукторами

Это очень упрощенное описание проблемы, с которой я столкнулся с моим приложением React / Redux:


Описание проблемы:

Предположим, у меня есть веб-приложение с двумя представлениями, представлением ProductList и представлением ProductOfTheDay. Каждое представление имеет свой собственный файл «хранилища»; состояние удержания, редуктор, действия и т. д., связанные с представлением.

Пусть государственная структура каждого магазина будет следующей:

// ProductList store state  
const productListState = {
  products: Product[]
};

// ProductOfTheDay store state
const productOfTheDayState = {
  product: Product
};

// Product
interface Product {
  hasAddedToCart: boolean
  ...
}

Когда пользователь находится в представлении ProductList, он видит список элементов пользовательского интерфейса продукта (есть некоторый компонент Product.tsx, который принимает Product и отображает себя). Когда пользователь находится в представлении ProductOfTheDay, он видит один элемент пользовательского интерфейса продукта.

Теперь предположим, что на каждом элементе пользовательского интерфейса продукта есть кнопка, которая позволяет пользователю добавить этот конкретный продукт в свою диаграмму покупок. При нажатии этой кнопки отправляется действие addToCart, которое обновит соответствующий объект Product в моем состоянии, чтобы он имел hasAddedToCart: true).


Вот в чем проблема:

Мои редукторы не знают который, в котором находится пользователь, когда они нажимают «Добавить в корзину». Следовательно, они не знают, добавляет ли пользователь продукт из представления ProductList в свою корзину или же добавляет продукт из представления ProductOfTheDay в свою корзину. В результате редукторы не знают, следует ли им обрабатывать действие.


Решение №1:

Я могу отправить действие addToCart с параметром index: dispatch(addToCart(index));. Если это index >= 0, то я знаю, что мой редуктор ProductList справляется с этим, а мой редуктор ProductOfTheDay игнорирует его. Если index === -1, то знаю, что надо делать наоборот.

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


Решение №2:

Вместо действия addToCart используйте действия addProductFromListToCart и addProductOfTheDayToCart. Мне не нравится этот подход, потому что эти действия, в конце концов, выполняют практически идентичные преобразования в разных срезах состояния.


Решение №3:

Добавьте магазин Cart со следующей структурой:

{
  cart: {
    [productId]: boolean
  }
}

Затем я могу отправить addToCart(productId), и он будет обрабатываться только редуктором Cart. Мне этот подход пока нравится больше всего ...


Просьба о помощи:

Сталкивались ли другие с этой проблемой дизайна? Как вы структурируете свои действия / редукторы для борьбы с этим? Если что-то неясно, дайте мне знать, и я помогу уточнить.

Спасибо!!

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

azium 22.08.2018 21:24

Учитывая мою текущую структуру состояния, они должны знать, как найти соответствующий Product в моем состоянии. Параметр index, который я передаю в addToCart, позволяет каждому редуктору найти соответствующий Product. Нет, у меня нет редуктора Cart ... позвольте мне подумать, как это будет работать.

sir_thursday 22.08.2018 21:27

что происходит после того, как вы что-то добавляете в корзину? разве вам не нужно где-нибудь хранить текущее состояние корзины?

azium 22.08.2018 21:28

Предположим в моем случае, что у нас нет состояния корзины. Может быть, вместо addToCart вы можете думать о нажатии кнопки как о markProductAsFavorite или что-то в этом роде?

sir_thursday 22.08.2018 21:30

Мне нравится идея иметь магазин Cart, позвольте мне опубликовать его в качестве третьего решения.

sir_thursday 22.08.2018 21:31

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

azium 22.08.2018 21:38

Позвольте нам продолжить обсуждение в чате.

sir_thursday 22.08.2018 21:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
155
0

Другие вопросы по теме