12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- function reducer(state, { type, ШО, СКОКА }) { // объект action деструктуризируется на три переменных
- if (!state) { // начальная уборка в ларьке:
- return {
- пиво: { "number": 100, "price": 10 },
- чипсы: { "number": 100, "price": 15 },
- сиги: { "number": 100, "price": 5 },
- бабло: { "в ларьке": 5, "в кармане": prompt("Введите сколько у вас денег в кармане", 0) }
- }
- }
- if (type === 'КУПИТЬ' && (state[ШО]["number"] - СКОКА) >= 0 && state["бабло"]["в кармане"] - state[ШО]["price"] * СКОКА >= 0) { //если тип action - КУПИТЬ, то:
- return {
- ...state, //берем все что было из ассортимента
- [ШО]: { ["number"]: state[ШО]["number"] - СКОКА, ["price"]: state[ШО]["price"] },// и уменьшаем то, что покупается на количество
- ["бабло"]: {
- ["в кармане"]: state["бабло"]["в кармане"] - state[ШО]["price"] * СКОКА,
- ["в ларьке"]: state["бабло"]["в ларьке"] + state[ШО]["price"] * СКОКА
- }
- }
- }
- return state // если мы не поняли, что от нас хотят в `action` - оставляем все как есть
- }
- function createStore(reducer) {
- let state = reducer(undefined, {}) // стартовая инициализация состояния, запуск редьюсера со state === undefined
- let cbs = [] // массив подписчиков
- const getState = () => state // функция, возвращающая переменную из замыкания
- const subscribe = cb => (cbs.push(cb), // пушим подписчиков в массиве
- () => cbs = cbs.filter(c => c !== cb)) // возвращаем функцию unsubscribe, которая удаляет подписчика из списка
- const dispatch = action => {
- const newState = reducer(state, action) // пробуем запустить редьюсер
- if (newState !== state) { // проверяем, смог ли редьюсер обработать action
- state = newState // если смог, то обновляем state
- for (let cb of cbs) cb() // и запускаем подписчиков
- }
- }
- return {
- getState, // добавление функции getState в результирующий объект
- dispatch,
- subscribe // добавление subscribe в объект
- }
- }
- const store = createStore(reducer);
- store.subscribe(() => console.log(store.getState()));
- store.subscribe(() => createTable());
- const tovaryEl = document.getElementById("tovary");
- const numberEl = document.getElementById("number");
- const tableEl = document.getElementById("table");
- tableEl.border = 1;
- for (let key in store.getState()) {
- if (key === "бабло") continue;
- let optionEl = document.createElement("option");
- optionEl.innerHTML = key;
- tovaryEl.appendChild(optionEl);
- }
- const buttonEl = document.getElementById("button");
- buttonEl.onclick = () => {
- store.dispatch({ type: "КУПИТЬ", ШО: tovaryEl.value, СКОКА: numberEl.value });
- }
- createTable();
- function createTable() {
- tableEl.innerHTML = "";
- createTr("Наименование", "Количество", "Цена за единицу");
- for (let [key, value] of Object.entries(store.getState())) {
- if (key === "бабло") continue;
- createTr(key, value.number, value.price);
- }
- createTr("Касса", "в ларьке:", store.getState()["бабло"]["в ларьке"]);
- createTr("Касса", "в кармане:", store.getState()["бабло"]["в кармане"]);
- }
- function createTr(td1, td2, td3) {
- const trEl = document.createElement("tr");
- const td1El = document.createElement("td");
- const td2El = document.createElement("td");
- const td3El = document.createElement("td");
- td1El.innerText = td1;
- td2El.innerText = td2;
- td3El.innerText = td3;
- trEl.append(td1El, td2El, td3El);
- tableEl.appendChild(trEl);
- }
|