js.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. function createStore(reducer) {
  2. let state = reducer(undefined, {}) //стартовая инициализация состояния, запуск редьюсера со state === undefined
  3. let cbs = [] //массив подписчиков
  4. const getState = () => state //функция, возвращающая переменную из замыкания
  5. const subscribe = cb => (cbs.push(cb), //запоминаем подписчиков в массиве
  6. () => cbs = cbs.filter(c => c !== cb)) //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
  7. const dispatch = action => {
  8. const newState = reducer(state, action) //пробуем запустить редьюсер
  9. if (newState !== state) { //проверяем, смог ли редьюсер обработать action
  10. state = newState //если смог, то обновляем state
  11. for (let cb of cbs) cb() //и запускаем подписчиков
  12. }
  13. }
  14. return {
  15. getState, //добавление функции getState в результирующий объект
  16. dispatch,
  17. subscribe //добавление subscribe в объект
  18. }
  19. }
  20. function reducer(state, {type, ШО, СКОКА, Цена}){ //объект action деструктуризируется на три переменных
  21. if (!state){ //начальная уборка в ларьке:
  22. return {
  23. пиво: {
  24. количество: 100,
  25. цена: 38,
  26. },
  27. чипсы: {
  28. количество: 100,
  29. цена: 21,
  30. },
  31. сиги: {
  32. количество: 100,
  33. цена: 55,
  34. }
  35. }
  36. }
  37. if (type === 'КУПИТЬ'){ //если тип action - КУПИТЬ, то:
  38. return {
  39. ...state, //берем все что было из ассортимента
  40. [ШО]: state[ШО] - СКОКА //и уменьшаем то, что покупается на количество
  41. }
  42. }
  43. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  44. }
  45. // return {
  46. //
  47. // }
  48. let store = createStore(reducer);
  49. const actionByeBeer = СКОКА => ({type: 'КУПИТЬ', ШО: 'пиво', СКОКА})
  50. const actionByeСrisps = СКОКА => ({type: 'КУПИТЬ', ШО: 'чипсы', СКОКА})
  51. const actionByeSigarets = СКОКА => ({type: 'КУПИТЬ', ШО: 'сиги', СКОКА})
  52. console.log(store.getState().пиво)
  53. console.log(store.getState().сиги)
  54. document.body.append(productCard)
  55. for (let elementProduct in store.getState()) {
  56. const productCard = document.getElementById('card')
  57. const product = document.getElementById('product')
  58. product.innerText = card
  59. const amount = document.getElementById('amount')
  60. amount.innerText = store.getState()[card].количество + `шт`
  61. const price = document.getElementById('price')
  62. price.innerText = store.getState()[card].цена + `грн`
  63. productCard.append(product)
  64. productCard.append(amount)
  65. productCard.append(price)
  66. console.log(card)
  67. }
  68. const list = document.createElement("select")
  69. document.body.append(list)
  70. const choicePrice = document.createElement('div')
  71. document.body.append(choicePrice)
  72. for (let name of Object.keys(store.getState())) {
  73. let product = document.createElement("option")
  74. product.innerText = name
  75. list.append(product)
  76. }
  77. const inputAmount = document.createElement('input')
  78. inputAmount.id = "amount"
  79. inputAmount.type = 'number'
  80. inputAmount.min = "0"
  81. document.body.append(inputAmount)
  82. let total = document.createElement('div');
  83. inputAmount.oninput = list.onchange = () => {
  84. total.innerText = 15 * inputAmount.value;
  85. }
  86. document.body.append(total)
  87. const buttonBuy = document.createElement('button')
  88. buttonBuy.innerText = 'Купить'
  89. document.body.append(buttonBuy)
  90. // buttonBuy.onclick = () => {
  91. // const actionByeBeer = СКОКА => ({type: 'КУПИТЬ', ШО: 'пиво', СКОКА})
  92. // }
  93. const person = {
  94. name: 'Иван',
  95. fatherName: 'Иванович',
  96. surname: "Иванов"
  97. }
  98. const {["name"]:nameOrSurname} = person //деструктуризация с использованием ключа, вычисленного с помощью выражения
  99. console.log(nameOrSurname)