redux2.html 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. <script>
  23. function reducer(state, {type, ШО, СКОКА, БАБЛО}){
  24. if (!state){
  25. return {
  26. пиво:{колво:100, цена: 10},
  27. чипсы:{колво:100, цена:20},
  28. сиги:{колво:100, цена:30},
  29. касса:23450
  30. }
  31. }
  32. if (type === 'КУПИТЬ'){
  33. if(ШО in state && БАБЛО > state[ШО].цена * СКОКА){
  34. return state[ШО] - СКОКА >= 0 ? {
  35. ...state,
  36. ШО:{колво:state[ШО].колво - СКОКА, цена: state[ШО].цена},
  37. касса: +state.касса + (state[ШО].цена*СКОКА)
  38. } : state;
  39. }
  40. }
  41. return state;
  42. }
  43. function createStore(reducer){
  44. let state = reducer(undefined, {})
  45. let cbs = []
  46. const getState = () => state
  47. const subscribe = cb => (cbs.push(cb),
  48. () => cbs = cbs.filter(c => c !== cb));
  49. const dispatch = action => {
  50. const newState = reducer(state, action)
  51. if (newState !== state){
  52. state = newState
  53. for (let cb of cbs) cb()
  54. }
  55. }
  56. return {
  57. getState,
  58. dispatch,
  59. subscribe
  60. }
  61. }
  62. let store=createStore(reducer);
  63. btn.onclick=function(){
  64. for(let [key] of Object.entries(store.getState())){
  65. console.log(key);
  66. if(tovar.value===key){
  67. store.dispatch({type: 'КУПИТЬ', ШО:{[tovar.value]:[tovar.value].колво}, СКОКА: skok.value, БАБЛО: bablo.value });
  68. console.log(store.getState());
  69. }
  70. }
  71. }
  72. let table=document.createElement('table');
  73. for(let [key,value] of Object.entries(store.getState())){
  74. let tr=document.createElement('tr');
  75. let td=document.createElement('th');
  76. let td2=document.createElement('td');
  77. let td3=document.createElement('td');
  78. td.innerText=key;
  79. if(typeof value==='object'){
  80. for(let i in value){
  81. if(i==='колво'){
  82. td2.innerText=+value[i];
  83. }
  84. if(i==='цена'){
  85. td3.innerText=value[i];
  86. }
  87. }
  88. }else{
  89. td2.innerText=value;
  90. }
  91. tr.append(td,td2,td3);
  92. table.append(tr);
  93. table.style.border='1px solid black';
  94. console.log(key);
  95. console.log(value);
  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. td.innerText=key;
  107. if(typeof value==='object'){
  108. for(let i in value){
  109. if(i==='колво'){
  110. td2.innerText=value[i];
  111. }
  112. if(i==='цена'){
  113. td3.innerText=value[i];
  114. }
  115. }
  116. }else{
  117. td2.innerText=value;
  118. }
  119. tr.append(td,td2);
  120. td.innerText=key+':'+value;
  121. table.append(tr);
  122. }
  123. document.body.append(table);
  124. })
  125. </script>
  126. </body>
  127. </html>