const counter = (state = 0, action) => {
switch (action.type) {
case "INCREMENT":
return state + 1
case "DECREMENT":
return state - 1
default:
return state
}
}
const { createStore } = Redux
const store = createStore(counter)
const render = () => {
document.body.innerText = store.getState()
}
store.subscribe(render)
render()
document.addEventListener("click", () => {
store.dispatch({ type: "INCREMENT" })
})
function createStore(reducer) {
let state
let listeners = []
const getState = () => state
const subscribe = listener => {
listeners.push(listener)
return () => {
listeners = listeners.filter(l => l !== listeners)
}
}
const dispatch = action => {
state = reducer(state, action)
listeners.forEach(listener => listener())
}
return {
getState,
subscribe,
dispatch,
}
}
function createStore(reducer) {
let state
let listeners = []
const getState = () => state
const subscribe = listener => {
listeners.push(listener)
return () => {
listeners = listeners.filter(l => l !== listener)
}
}
const dispatch = action => {
state = reducer(state, action)
listeners.forEach(listener => listener())
}
dispatch({})
return {
getState,
subscribe,
dispatch,
}
}
const INCREMENT = "INCREMENT"
const DECREMENT = "DECREMENT"
const counter = (state = 0, action) => {
switch (action.type) {
case INCREMENT:
return state + 1
case DECREMENT:
return state - 1
default:
return state
}
}
const store = createStore(counter)
const unsubscribe = store.subscribe(() => {
console.log(store.getState())
})
function incrementAction() {
return {
type: INCREMENT,
}
}
function decrementAction() {
return {
type: DECREMENT,
}
}
store.dispatch(incrementAction())
store.dispatch(incrementAction())
store.dispatch(incrementAction())
store.dispatch(decrementAction())