main.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. let select = document.querySelector("#select");
  2. let button = document.querySelector(".button");
  3. let input = document.querySelector("#input");
  4. let inputMoney = document.querySelector("#input-money")
  5. let table = document.querySelector(".table");
  6. function createStore(reducer){
  7. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  8. let cbs = [] //массив подписчиков
  9. const getState = () => state //функция, возвращающая переменную из замыкания
  10. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  11. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  12. const dispatch = action => {
  13. const newState = reducer(state, action) //пробуем запустить редьюсер
  14. if (newState !== state){ //проверяем, смог ли редьюсер обработать action
  15. state = newState //если смог, то обновляем state
  16. for (let cb of cbs) cb() //и запускаем подписчиков
  17. }
  18. }
  19. return {
  20. getState, //добавление функции getState в результирующий объект
  21. dispatch,
  22. subscribe //добавление subscribe в объект
  23. }
  24. };
  25. function reducer(state, {type, ШО, СКОКА, price}){ //объект action деструктуризируется на три переменных
  26. if (!state){ //начальная уборка в ларьке:
  27. return {
  28. пиво: {count: 100, price: 25},
  29. чипсы: {count: 100, price: 15},
  30. сиги: {count: 100, price: 30}
  31. }
  32. }
  33. if (type === 'КУПИТЬ' && state[ШО].count >= СКОКА && state[ШО].price <= price){ //если тип action - КУПИТЬ, то:
  34. return {
  35. ...state, //берем все что было из ассортимента
  36. [ШО]: {count: state[ШО].count - СКОКА, price: state[ШО].price} //и уменьшаем то, что покупается на количество
  37. }
  38. }
  39. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  40. }
  41. const store = createStore(reducer);
  42. store.subscribe(() => console.log(store.getState()));
  43. for(let [key, value] of Object.entries(store.getState())) {
  44. let option = document.createElement("option");
  45. console.log(key);
  46. option.innerText = key;
  47. select.appendChild(option);
  48. }
  49. let createTable = function() {
  50. let str = "<tr><td>Товар</td><td>Количество</td><td>Цена</td></tr>";
  51. for(let [key, value] of Object.entries(store.getState())) {
  52. str += `<tr><td>${key}</td><td>${value.count}</td><td>${value.price}</td></tr>`;
  53. }
  54. table.innerHTML = str;
  55. }
  56. store.subscribe(createTable);
  57. button.addEventListener("click", function() {
  58. store.dispatch({type: "КУПИТЬ", ШО: select.value, СКОКА: input.value, price: inputMoney.value});
  59. });
  60. createTable();