redux2.html 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Redux2</title>
  6. <style>
  7. td, th{
  8. border: 1px solid black;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <!-- <input type="text" id="tovar"> -->
  14. <select id='tovar'>
  15. <option value="пиво">пиво</option>
  16. <option value="чипсы">чипсы</option>
  17. <option value="сиги">сиги</option>
  18. </select>
  19. <input type="number" id="skok" placeholder="сколько надо?">
  20. <input type="number" id="bablo" placeholder="сколько денег?">
  21. <button id="btn">Купить</button>
  22. <p id="error"></p>
  23. <script>
  24. function reducer(state, {type, ШО, СКОКА, БАБЛО}){
  25. if (!state){
  26. return {
  27. пиво:{колво:100, цена: 10},
  28. чипсы:{колво:100, цена:20},
  29. сиги:{колво:100, цена:30},
  30. касса:2700
  31. }
  32. }
  33. if (type === 'КУПИТЬ'){
  34. if((ШО in state) && БАБЛО >= state[ШО].цена * СКОКА && state[ШО].колво - СКОКА >= 0){
  35. return {
  36. ...state,
  37. [ШО]:{колво:state[ШО].колво - СКОКА, цена: state[ШО].цена},
  38. касса: +state.касса + (state[ШО].цена*СКОКА)
  39. }
  40. }else{
  41. error.innerHTML='\&#9785; что-то не так (нет данного товара или не хватает денег) \&#9785;';
  42. setTimeout(()=>error.innerHTML='',2000);
  43. }
  44. }
  45. return state ;
  46. }
  47. function createStore(reducer){
  48. let state = reducer(undefined, {})
  49. let cbs = []
  50. const getState = () => state
  51. const subscribe = cb => (cbs.push(cb),
  52. () => cbs = cbs.filter(c => c !== cb));
  53. const dispatch = action => {
  54. const newState = reducer(state, action)
  55. if (newState !== state){
  56. state = newState
  57. for (let cb of cbs) cb()
  58. }
  59. }
  60. return {
  61. getState,
  62. dispatch,
  63. subscribe
  64. }
  65. }
  66. let store=createStore(reducer);
  67. btn.onclick=function(){
  68. for(let [key] of Object.entries(store.getState())){
  69. if(tovar.value===key){
  70. store.dispatch({type: 'КУПИТЬ', ШО:tovar.value, СКОКА: skok.value, БАБЛО: bablo.value });
  71. console.log(store.getState());
  72. }
  73. }
  74. }
  75. let table=document.createElement('table');
  76. for(let [key,value] of Object.entries(store.getState())){
  77. let tr=document.createElement('tr');
  78. let td=document.createElement('th');
  79. let td2=document.createElement('td');
  80. let td3=document.createElement('td');
  81. td.innerText=key;
  82. if(typeof value==='object'){
  83. for(let i in value){
  84. if(i==='колво'){
  85. td2.innerText=+value[i];
  86. }
  87. if(i==='цена'){
  88. td3.innerText=value[i];
  89. }
  90. }
  91. }else{
  92. td2.innerText=value;
  93. }
  94. tr.append(td,td2,td3);
  95. table.append(tr);
  96. table.style.border='1px solid black';
  97. }
  98. document.body.append(table);
  99. const unsubscribe=store.subscribe(()=>{
  100. while (table.hasChildNodes()) {
  101. table.removeChild(table.firstChild);
  102. }
  103. for(let [key,value] of Object.entries(store.getState())){
  104. let tr=document.createElement('tr');
  105. let td=document.createElement('td');
  106. let td2=document.createElement('td');
  107. let td3=document.createElement('td');
  108. td.innerText=key;
  109. if(typeof value==='object'){
  110. for(let i in value){
  111. if(i==='колво'){
  112. td2.innerText=value[i];
  113. }
  114. if(i==='цена'){
  115. td3.innerText=value[i];
  116. }
  117. }
  118. }else{
  119. td2.innerText=value;
  120. }
  121. tr.append(td,td2,td3);
  122. table.append(tr);
  123. }
  124. document.body.append(table);
  125. })
  126. </script>
  127. </body>
  128. </html>