Dz11js.html 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel="stylesheet" href="style.css">
  9. </head>
  10. <body>
  11. <div id="parampampam">
  12. <div class="shop">
  13. <select id='range'>
  14. <option value="пиво">Пиво</option>
  15. <option value="чипсы">Чипсы</option>
  16. <option value="сиги">Сиги</option>
  17. </select>
  18. <input type='number' id='amount1' placeholder='количество' />
  19. <input type='number' id='money' placeholder='сумма' />
  20. <button id='buy'>Купить</button>
  21. </div>
  22. <div id="tovar">
  23. </div>
  24. <div id="price">
  25. </div>
  26. <p id="kassa">Собираюсь построить Зикурат: </p>
  27. </div>
  28. <script>
  29. setTimeout(function () {
  30. let parent = document.getElementById("price");
  31. parent.lastElementChild.remove();
  32. store.dispatch({ type: "КУПИТЬ", ШО: "пиво", СКОКА: 0 });
  33. }, 1);
  34. setTimeout(function () {
  35. let parent = document.getElementById("tovar");
  36. parent.lastElementChild.remove();
  37. store.dispatch({ type: "КУПИТЬ", ШО: "пиво", СКОКА: 0 });
  38. }, 1);
  39. function reducer(state, { type, ШО, СКОКА, ДЕНЬГИ }) { //объект action деструктуризируется на три переменных
  40. if (!state) { //начальная уборка в ларьке:
  41. return {
  42. пиво: { count: 100, price: 23 },
  43. чипсы: { count: 100, price: 18 },
  44. сиги: { count: 100, price: 41 },
  45. касса: 0,
  46. }
  47. }
  48. if (type === 'КУПИТЬ' && СКОКА >= 0) { //если тип action - КУПИТЬ, то:
  49. if (state[ШО].count >= СКОКА) {
  50. if (money.value >= (state[ШО].price * СКОКА)) {
  51. return {
  52. ...state, //берем все что было из ассортимента
  53. [ШО]: { count: state[ШО].count - СКОКА, price: state[ШО].price }, //и уменьшаем то, что покупается на количество
  54. касса: state.касса + +money.value
  55. // state[ШО].price * СКОКА()
  56. }
  57. }
  58. else {
  59. alert("Нужно больше золота!")
  60. }
  61. }
  62. else {
  63. alert('Извините товар едет!')
  64. }
  65. }
  66. else {
  67. alert('Наверное вам хватит ');
  68. }
  69. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  70. }
  71. function createStore(reducer) {
  72. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  73. let cbs = [] //массив подписчиков
  74. const getState = () => state //функция, возвращающая переменную из замыкания
  75. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  76. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  77. const dispatch = action => {
  78. const newState = reducer(state, action) //пробуем запустить редьюсер
  79. if (newState !== state) { //проверяем, смог ли редьюсер обработать action
  80. state = newState //если смог, то обновляем state
  81. for (let cb of cbs) cb() //и запускаем подписчиков
  82. }
  83. }
  84. return {
  85. getState, //добавление функции getState в результирующий объект
  86. dispatch,
  87. subscribe //добавление subscribe в объект
  88. }
  89. }
  90. const store = createStore(reducer)
  91. //запомнит функцию во внутреннем массиве cbs.
  92. //она будет запущена при любом успешном dispatch
  93. const unsubscribe = store.subscribe(() => console.log(store.getState()))
  94. // setTimeout(unsubscribe, 10000) //отпишемся через 10 секунд, например
  95. //происходит запуск редьюсера, который создает новый state.
  96. //dispatch запускает всех подписчиков из массива cbs
  97. store.dispatch({ type: 'КУПИТЬ', ШО: "пиво", СКОКА: 0 })
  98. // const buy = (ШО, СКОКА) => ({ type: 'КУПИТЬ', ШО, СКОКА })
  99. for (let [good, amount] of Object.entries(store.getState())) {
  100. console.log(good, amount);
  101. let p = document.createElement("p");
  102. let p1 = document.createElement("p")
  103. p.innerHTML = `Количество ${good}: ${amount.count}`;
  104. p1.innerHTML = `(Цена-${amount.price})`
  105. price.append(p1)
  106. tovar.append(p);
  107. buy.onclick = () => {
  108. store.dispatch({ type: "КУПИТЬ", ШО: range.value, СКОКА: amount1.value });
  109. kassa.innerHTML =
  110. "Собираюсь построить Зикурат: " + store.getState().касса
  111. };
  112. store.subscribe(
  113. () =>
  114. (p.innerHTML = `Количество ${good}: ${store.getState()[good].count
  115. }`)
  116. );
  117. }
  118. </script>
  119. </body>
  120. </html>