redux2.html 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. }*/
  43. }
  44. return state ;
  45. }
  46. function createStore(reducer){
  47. let state = reducer(undefined, {})
  48. let cbs = []
  49. const getState = () => state
  50. const subscribe = cb => (cbs.push(cb),
  51. () => cbs = cbs.filter(c => c !== cb));
  52. const dispatch = action => {
  53. const newState = reducer(state, action)
  54. if (newState !== state){
  55. state = newState
  56. for (let cb of cbs) cb()
  57. }
  58. }
  59. return {
  60. getState,
  61. dispatch,
  62. subscribe
  63. }
  64. }
  65. let store=createStore(reducer);
  66. btn.onclick=function(){
  67. for(let [key] of Object.entries(store.getState())){
  68. if(tovar.value===key){
  69. store.dispatch({type: 'КУПИТЬ', ШО:tovar.value, СКОКА: skok.value, БАБЛО: bablo.value });
  70. console.log(store.getState());
  71. }
  72. }
  73. }
  74. let table=document.createElement('table');
  75. for(let [key,value] of Object.entries(store.getState())){
  76. let tr=document.createElement('tr');
  77. let td=document.createElement('th');
  78. let td2=document.createElement('td');
  79. let td3=document.createElement('td');
  80. td.innerText=key;
  81. if(typeof value==='object'){
  82. for(let i in value){
  83. if(i==='колво'){
  84. td2.innerText=+value[i];
  85. }
  86. if(i==='цена'){
  87. td3.innerText=value[i];
  88. }
  89. }
  90. }else{
  91. td2.innerText=value;
  92. }
  93. tr.append(td,td2,td3);
  94. table.append(tr);
  95. table.style.border='1px solid black';
  96. }
  97. document.body.append(table);
  98. const unsubscribe=store.subscribe(()=>{
  99. while (table.hasChildNodes()) {
  100. table.removeChild(table.firstChild);
  101. }
  102. for(let [key,value] of Object.entries(store.getState())){
  103. let tr=document.createElement('tr');
  104. let td=document.createElement('td');
  105. let td2=document.createElement('td');
  106. let td3=document.createElement('td');
  107. td.innerText=key;
  108. if(typeof value==='object'){
  109. for(let i in value){
  110. if(i==='колво'){
  111. td2.innerText=value[i];
  112. }
  113. if(i==='цена'){
  114. td3.innerText=value[i];
  115. }
  116. }
  117. }else{
  118. td2.innerText=value;
  119. }
  120. tr.append(td,td2,td3);
  121. table.append(tr);
  122. }
  123. document.body.append(table);
  124. })
  125. </script>
  126. </body>
  127. </html>