Js-HW11.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. function createStore(reducer){
  2. let state = reducer(undefined, {})
  3. let callbacks = []
  4. const getState = () => state
  5. const dispatch = (action) => {
  6. const newState = reducer(state, action)
  7. if(newState !== state) {
  8. state = newState
  9. }
  10. for(let cb of callbacks) {
  11. cb()
  12. }
  13. }
  14. const subscribe = (callback) => (callbacks.push(callback),
  15. () => callbacks = callbacks.filter(c => c !== callback))
  16. return {
  17. getState,
  18. dispatch,
  19. subscribe
  20. }
  21. }
  22. function reducer(state, {type, item, number, price}){ //объект action деструктуризируется на три переменных
  23. if (!state){ //начальная уборка в ларьке:
  24. return {
  25. items :
  26. [
  27. {
  28. name: 'beer',
  29. price: 35,
  30. number: 100
  31. },
  32. {
  33. name: 'chips',
  34. price: 50,
  35. number: 100
  36. },
  37. {
  38. name: 'cigarettes',
  39. price: 45,
  40. number: 100
  41. },
  42. {
  43. name: 'gum',
  44. price: 15,
  45. number: 100
  46. }
  47. ],
  48. money: 0
  49. }
  50. }
  51. if (type === 'BUY'){ //если тип action - КУПИТЬ, то:
  52. console.log(state.items)
  53. return {
  54. ...state, //берем все что было из ассортимента
  55. items: state.items.filter(i => i.name === item), //и уменьшаем то, что покупается на количество
  56. money: state.money += state.items.filter(i => i.price === price)
  57. }
  58. }
  59. return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
  60. }
  61. const store = createStore(reducer)
  62. // console.log(store.getState())
  63. let $select = document.createElement('select')
  64. let $table = document.createElement('table');
  65. let $num = document.createElement('input')
  66. $num.type = 'number'
  67. let btn = document.createElement('button')
  68. $num.min = '1';
  69. console.log(store.getState().items)
  70. let money = document.createElement('div')
  71. for(let item of store.getState().items) {
  72. let $tr = document.createElement('tr')
  73. let $td = document.createElement('td')
  74. let $td2 = document.createElement('td')
  75. let $td3 = document.createElement('td')
  76. $td.innerText = item.name
  77. $td2.innerText = item.price
  78. $td3.innerText = item.number
  79. let $option = document.createElement('option')
  80. $option.innerHTML = item.name
  81. $select.append($option)
  82. btn.innerHTML = 'buy'
  83. $tr.append($td, $td2, $td3)
  84. $table.append($tr)
  85. btn.onclick = (e) => {
  86. // console.log(store.getState().items, item)
  87. // console.log(item.number - +$num.value >= 0 )
  88. if(item.number - +$num.value >= 0 ) {
  89. // console.log(+$num.value, item.number)
  90. let [selected] = store.getState().items.filter(i => i.name === $select.value)
  91. selected.number = item.number - +$num.value
  92. // console.log(selected.number)
  93. if(item.number > 0) {
  94. console.log(store.getState())
  95. store.dispatch({type: 'BUY', item: selected.name, number: item.number - +$num.value})
  96. console.log(store.getState())
  97. }
  98. }
  99. }
  100. console.log(store.getState())
  101. store.subscribe(() => money.innerHTML = `Cashbox: ${+store.getState().money}`)
  102. store.subscribe(() => $td3.innerHTML = `${item.number}`)
  103. document.body.append($select, $num, btn, $table)
  104. }
  105. document.body.appendChild(money)