Это очень упрощенное описание проблемы, с которой я столкнулся с моим приложением 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. Мне этот подход пока нравится больше всего ...
Просьба о помощи:
Сталкивались ли другие с этой проблемой дизайна? Как вы структурируете свои действия / редукторы для борьбы с этим? Если что-то неясно, дайте мне знать, и я помогу уточнить.
Спасибо!!
Учитывая мою текущую структуру состояния, они должны знать, как найти соответствующий Product в моем состоянии. Параметр index, который я передаю в addToCart, позволяет каждому редуктору найти соответствующий Product. Нет, у меня нет редуктора Cart ... позвольте мне подумать, как это будет работать.
что происходит после того, как вы что-то добавляете в корзину? разве вам не нужно где-нибудь хранить текущее состояние корзины?
Предположим в моем случае, что у нас нет состояния корзины. Может быть, вместо addToCart вы можете думать о нажатии кнопки как о markProductAsFavorite или что-то в этом роде?
Мне нравится идея иметь магазин Cart, позвольте мне опубликовать его в качестве третьего решения.
ну .. даже «пометить продукт как любимый» для меня означает наличие массива или набора избранного, который представляет собой список идентификаторов продуктов. изменение фактического продукта кажется мне плохим решением ... и в вашем конкретном случае это очень плохо, так как у вас, похоже, нет редуктора "продуктов", но редукторы, основанные на представлениях, что также довольно необычно.
Позвольте нам продолжить обсуждение в чате.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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