Отправка action в Redux приложении

Теперь у нас есть редьюсер для обновления слайса с реакциями. Сейчас нам необходимо добавить отправку action, которая будет срабатывать при клике пользователя по кнопке с реакцией. Но прежде, чтобы все полностью работало, нам нужно внести пару изменений.

Давайте откроем наше приложение с продуктами, а в нем файл productsSlice.js. Посмотрите на определение initialState. Видите? В объектах нет свойства с реакциями. Давайте это исправим. Теперь для первого объекта код будет таким. Изначально счетчики каждой из реакций мы выставим в 0:

{ id: '1', title: 'Product1', desc: 'This is an amazing product', price: '300', amount: '30', reactions: { good: 0, soso: 0, bad: 0, }, },

Во второй объект для инициализации добавьте свойство reactions сами. Это же свойство нам необходимо добавить ниже в код для редьюсера productAdded, чтобы в новых продуктах тоже был такой функционал. Давайте сделаем это для его метода prepare:

prepare(title, desc, price, amount, sellerId) { return { payload: { id: nanoid(), title, desc, price, amount, seller: sellerId, reactions: { good: 0, soso: 0, bad: 0, }, }, } },

Теперь приступим к отправке action. Откроем файл UserReactions.jsx, затем импортируем в него хук useDispatch и reactionClicked:

import { useDispatch } from 'react-redux' import { reactionClicked } from './productsSlice'

В начале кода в теле функции UserReactions первой строчкой (перед const userReactions ... ) пропишем:

const dispatch = useDispatch()

И навесим на кнопку реакции отправку reactionClicked при клике, при этом у нас будет передаваться id продукта и название реакции, по которой кликнули:

<button key={name} type="button" className="reaction-button" onClick={() => dispatch(reactionClicked({ productId: product.id, reaction: name })) } > {image} {product.reactions[name]} </button>

Нам осталось теперь вывести компонент с реакциями в верстке для наших страничек. Сделаем это в файле ProductsList.jsx перед элементом Link:

<UserReactions product={product} />

И точно также перед элементом Link на страничке продукта в файле ProductPage.jsx:

<UserReactions product={product} />

Теперь, когда все встало на свои места, мы можем запустить наше приложение. Попробуем покликать на кнопочки с реакциями. Можем добавить новый продукт и также понажимать на них. Теперь, где бы мы не кликали по кнопкам с реакциями, измененные значения будут отображаться для данного продукта на всех страницах. Посмотрите страницу отдельного продукта (на которой вы кликали по реакциям) и страницу с их списком и наоборот, для всех страниц число реакций для конкретного продукта будет одинаковым. Чудеса, да и только...

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

Откройте ваше приложение со студентами. В файле studensSlice.js объектам для инициализации добавьте свойство votes с соответствующими полями. Сделайте это и для редьюсера studentAdded.

Внутри функции UserVotes в файле UserVotes.jsx заведите dispatch для хука useDispatch и сделайте отправку экшена voteClicked по клику на кнопки голосования, передайте ему id студента и название vote, подобно тому, как показано в уроке.

Выведите кнопочки для голосования в верстке для компонентов StudentsList и StudentPage.



Чат с GPT Компилятор