手动实现redux

redux是一种架构模式(Flux 架构的一种变种),是 JavaScript 状态容器,提供可预测化的状态管理,可以用在React、Angular、Ember、jQuery 甚至纯 JavaScript,但不能用于vue。

下面是参照网上写的简单实现:

function renderApp(newAppState,oldAppState={}) {
        if(newAppState===oldAppState) return //数据没有变化就不渲染了
        console.log('render app')
        renderTitle(newAppState.title,oldAppState.title)
        renderContent(newAppState.content,oldAppState.content)
    }
    function renderTitle(newTitle,oldTitle) {
        if(newTitle===oldTitle) return
        console.log('render title')
        const titleDom=document.getElementById('title');
        titleDom.innerHTML=newTitle.text;
        titleDom.style.color=newTitle.color;
    }
    function renderContent(newContent,oldContent) {
        if(newContent===oldContent) return
        console.log('render content')
        const contentDom=document.getElementById('content');
        contentDom.innerHTML=newContent.text;
        contentDom.style.color=newContent.color;
    }

    function reducer(state,action){
        if(!state){
            return {
                title:{
                    text:"react.js",
                    color:"red"
                },
                content:{
                    text:"这是内容",
                    color:"green"
                }
            }
        }
        switch (action.type) {
            case 'UPDATE_TITLE_TEXT':
                return{
                    ...state,
                    title:{
                        ...state.title,
                        text:action.text
                    }
                }
                break
            case 'UPDATE_TITLE_COLOR':
                return {
                    ...state,
                    title:{
                        ...state.title,
                        color:action.color
                    }
                }
                break
            default:
                return state //没有修改
        }
    }
    function createStore(reducer){
        let state=null;
        const listeners=[];
        const subscribe= (listener)=>listeners.push(listener)
        const getState=()=>state;
        const dispatch=(action)=>{
            state=reducer(state,action) //重新赋值
            listeners.forEach((listener)=>listener())
        }
        dispatch({}) //初始化state
        return{getState,dispatch,subscribe}
    }


    const store=createStore(reducer)
    let oldState=store.getState();
    store.subscribe(()=>{
        const newState=store.getState();
        renderApp(newState,oldState)
        oldState=newState

    })
    renderApp(store.getState()) //首次渲染初始化
    store.dispatch({type:"UPDATE_TITLE_TEXT",text:"这是修改后的数据"})
    store.dispatch({type:"UPDATE_TITLE_COLOR",color:"orange"})

 参照出处动手实现redux

posted @ 2019-08-07 11:10  ABC袁  阅读(241)  评论(0编辑  收藏  举报