⊗jsrxPmRDDA 33 of 57 menu

Redux иловасида action жўнатиш

Энди бизда реакциялар слайсини янгилаш учун редьюсер мавжуд. Ҳозирча биз фойдаланувчи реакция тугмасини босганда ишга тушадиган 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.jsx файлидаги UserVotes функцияси ичида useDispatch хуки учун dispatch ни эълон қилинг ва овоз бериш тугмалари босилганда voteClicked экшени жўнатишни амалга оширинг, унга талабанинг id си ва vote номини ўтинг, дарсда кўрсатилганидек.

StudentsList ва StudentPage компонентлари учун версткада овоз бериш тугмаларини чиқаринг.

azuzlbyuzpt