浏览代码

Redux HW is done not well. Need help

vladislavaSim 1 年之前
父节点
当前提交
0f89a0385b
共有 2 个文件被更改,包括 130 次插入0 次删除
  1. 19 0
      HW11/index.html
  2. 111 0
      HW11/main.js

+ 19 - 0
HW11/index.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>HW11</title>
+    <style>
+        body {
+            font-size: 20px;
+        }
+        td {
+            border: 1px solid black;
+            padding: 4px;
+        }
+    </style>
+</head>
+<body>
+<script src="main.js"></script>
+</body>
+</html>

+ 111 - 0
HW11/main.js

@@ -0,0 +1,111 @@
+function createStore(reducer){
+    let state = reducer(undefined, {})
+    let callbacks = []
+    const getState = () => state
+    const dispatch = (action) => {
+        const newState = reducer(state, action)
+        if(newState !== state) {
+            state = newState
+        }
+        for(let cb of callbacks) {
+            cb()
+        }
+    }
+
+    const subscribe = (callback) => (callbacks.push(callback),
+        () => callbacks = callbacks.filter(c => c !== callback))
+    return {
+        getState,
+        dispatch,
+        subscribe
+    }
+}
+
+function reducer(state, {type, item, number, price}){ //объект action деструктуризируется на три переменных
+    if (!state){ //начальная уборка в ларьке:
+        return {
+            items :
+                [
+                     {
+                        name: 'beer',
+                        price: 35,
+                        number: 100
+                     },
+                    {
+                        name: 'chips',
+                        price: 50,
+                        number: 100
+                    },
+                    {
+                        name: 'cigarettes',
+                        price: 45,
+                        number: 100
+                    },
+                    {
+                        name: 'gum',
+                        price: 15,
+                        number: 100
+                    }
+                ],
+            money: 0
+        }
+    }
+    if (type === 'BUY'){ //если тип action - КУПИТЬ, то:
+        console.log(state.items)
+        return {
+            ...state, //берем все что было из ассортимента
+
+            items: state.items.filter(i => i.name === item), //и уменьшаем то, что покупается на количество
+            money: state.money += state.items.filter(i => i.price === price)
+        }
+    }
+    return state //если мы не поняли, что от нас просят в `action` - оставляем все как есть
+}
+
+const store = createStore(reducer)
+// console.log(store.getState())
+
+let $select = document.createElement('select')
+let $table = document.createElement('table');
+let $num = document.createElement('input')
+$num.type = 'number'
+let btn = document.createElement('button')
+$num.min = '1';
+console.log(store.getState().items)
+let money = document.createElement('div')
+for(let item of store.getState().items) {
+    let $tr = document.createElement('tr')
+    let $td = document.createElement('td')
+    let $td2 = document.createElement('td')
+    let $td3 = document.createElement('td')
+    $td.innerText = item.name
+    $td2.innerText = item.price
+    $td3.innerText = item.number
+    let $option = document.createElement('option')
+    $option.innerHTML = item.name
+    $select.append($option)
+    btn.innerHTML = 'buy'
+    $tr.append($td, $td2, $td3)
+    $table.append($tr)
+    btn.onclick = (e) => {
+        // console.log(store.getState().items, item)
+        // console.log(item.number - +$num.value >= 0 )
+            if(item.number - +$num.value >= 0 ) {
+                // console.log(+$num.value, item.number)
+                let [selected] = store.getState().items.filter(i => i.name === $select.value)
+                selected.number = item.number - +$num.value
+                // console.log(selected.number)
+                if(item.number > 0) {
+                    console.log(store.getState())
+                    store.dispatch({type: 'BUY', item: selected.name, number: item.number - +$num.value})
+                    console.log(store.getState())
+                }
+            }
+
+    }
+    console.log(store.getState())
+    store.subscribe(() => money.innerHTML = `Cashbox: ${+store.getState().money}`)
+    store.subscribe(() => $td3.innerHTML = `${item.number}`)
+    document.body.append($select, $num, btn, $table)
+}
+document.body.appendChild(money)