1、观察者模式

<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id = "app"></div>
<script>
  //待渲染数据
  let appState = {
    text:"data",
    color:'red'
  }
  function renderApp(){
    let app = document.getElementById('app');
    app.innerText = appState.text;
    app.style.color = appState.color;
  }
  function stateChange(state,action){
    switch (action.type){
      case 'UPDATE_TEXT':
        state.text = action.text;
        break;
      case 'UPDATE_COLOR':
        state.color = action.color;
        break;
      default:break;
    }
  }
  // let action = {
  //   type:'UPDATE_TEXT',
  //   text:"change",
  // }
  // stateChange(appState,action)
  // renderApp()

  //传入的参数是 需要观察的数据  使得数据发生变化的函数
  function Observer(state,stateChange){
    //1、定义一个数组存储行为--渲染函数
   let listeners = [];
   //2、把行为添加进去   subscribe是将要执行的函数装进数组
   let subscribe = (listener)=>{
     listeners.push(listener);
   }
    let getState = state;
   //分发是让原始数据 调用 改变函数 使得数据发生变化,再调用渲染函数相当于通知
    let dispatch = (action)=>{
      //修改默认数据
      stateChange(state,action);
      //遍历数组内部的每一个函数renderApp 依次执行
      listeners.forEach((listener)=>listener())
    }
    return {getState,dispatch,subscribe}
  }
  const store = Observer(appState,stateChange)
  //3、将渲染函数装进去行为的action数组
  store.subscribe(()=>renderApp())
  let i = 0;
  setInterval(()=>{
    store.dispatch({type:'UPDATE_TEXT',text:"修改数据"+i++})
  },500)

</script>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容