练习:原生Redux

121 阅读1分钟

中文文档:www.axios-js.com/zh-cn/docs/

代码地址:js.jirengu.com/kopot/28/ed…

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div id="app"></div> 
  
  <script src="https://cdn.bootcdn.net/ajax/libs/redux/4.0.4/redux.min.js"></script>
  <script>
    function add1(){
      store.dispatch({type:"add",payload: 1}) // 派发事件,参数其实就是fn里的action
    }
    function add2(){
      store.dispatch({type:"add",payload: 2})
    }
    function addIf(){
      if(store.getState() % 2 === 1){
        store.dispatch({type:"add", payload: 1})
      } 
    }
    function addAsync(){
      setTimeout(()=>{
        store.dispatch({type:"add", payload: 2})
      }, 2000)
    }
    function addAsync2(){// 错误示范      
      store.dispatch({type:"addError", payload: 2})
    }
    function render(store){
      const app = document.querySelector("#app")
      app.innerHTML = `
        <div>
          <h3>${store.getState()}</h3>
          <button onclick="add1()">+1</button>
          <button onclick="add2()">+2</button>
          <button onclick="addIf()">单数就+1</button>
          <button onclick="addAsync()">两秒后+2</button>
          <button onclick="addAsync2()">错误异步示范</button>
        </div>`
    }
    
    const store = Redux.createStore(fn) // 将状态存储到store中
    
    function fn(state, action){// 用来更新状态,包括初始化状态,它的返回值就是状态
      state = state || 0
      switch(action.type){
        case "add": 
          return state + action.payload
        case "addError":
          setTimeout(()=>{// 在这里执行异步操作,没有返回值,会流向default
            return state + action.payload
          })
        default:
          console.log("default")
          return state
      }
    }
    render(store)
    store.subscribe(()=>{ // 监听到store的变化,就要重新render
      render(store)
    })    
  </script>
</body>
</html>