从0开始的Redux旅程(一)

2017-05-27  本文已影响36人  Renderz_干了这碗口嚼酒

前置知识点

数据库模型

无论是MVC,MVVM,还是现如今的Flux,最强调的一点就是模块化的分离解耦.
因为整套系统是围绕数据运作的,所以

最终的结果就是,:

而具体是选择mvc, mvvm, 还是flux完全是基于那一部分东西多而决定的, 核心的理念都是相同的.

优先数据

界面归根结底是为了展现数据, 所以优先设计好数据模型. 再设计对这些数据模型所能实现的功能. 最后将这些功能附加到界面上.

Redux初体验

第一步总是做需求分析, 还是先做个todo

需求分析

数据模型(store)设计

{
  displayMode: // mode类型在我们公司的产品里一般是存放在域表里, 由ID指定.
  todoList: [
    {
       text:  //  todo的内容
       status:  // 状态, 如果需要的话可以把status放域表, 或者直接赋值true / false
  ]
}

动作指令(action)设计

{type:'ADD_TODO',payload:'Eating'}
{type:'DEL_TODO',payload:1}
{type:'TOGGLE',payload:2}
{type:'CHANGE_DISPLAY_MODE',payload:1}

其实就像是一堆机器伪代码

方法服务(reducer)设计

const displayModeReducer = function(state=0,action){
//执行动作
  return state
}
const todoListReducer = function(state=0,action){
//执行动作
  return state
}

合并服务(combineReducers)

import { combineReducers } from 'Redux';
const reducers = combineReducers({
    displayMode: displayModeReducer
    todoList: todoListReducer
}
)

生成数据模型(store)

import { createStore } from 'Redux'
const store = createStore(reducers,{})

此时其实可以进行简单测试了

store.subscriber(()=>{console.log('Listen to State Change) , store.getState()})
//这样如果store监听到了指令的话,就会执行回调,返回store.getState().
//可以尝试发一串指令过去看看会得到什么,比如
store.dispatch({type: "CHANGE_DISPLAY_MODE", payload: 1})
store.dispatch({type: "CHANGE_DISPLAY_MODE", payload: 2})
store.dispatch({type: "CHANGE_DISPLAY_MODE", payload: 3})
store.dispatch({type: "ADD_TODO", payload: "HAPPY"})
store.dispatch({type: "ADD_TODO", payload: "EATING"})
store.dispatch({type: "ADD_TODO", payload: "WASHING"})
store.dispatch({type: "DEL_TODO", payload: 1})
store.dispatch({type: "TOGGLE", payload: 1})
//反正什么也得不到啦只会得到undefine,因为reducer没有正常返回,只返回了一堆空state
//这样的话就可以继续去完善reducer了

完善reducer

import { combineReducers } from 'redux'
const displayModeReducer = function (state = 0, action) {
    switch (action.type) {
        case "CHANGE_DISPLAY_MODE": {
            return action.payload;
        }
        default: {
            return state;
        }
    }
}
> 
const todoListReducer = function (state = [], action) {
    switch (action.type) {
        case "ADD_TODO": {
            return [...state, {text: action.payload, status: false}];
        }
        case "DEL_TODO": {
            return [...state.slice(0, action.payload), ...state.slice(action.payload + 1)]
        }
        case "TOGGLE": {
            return [...state.slice(0, action.payload),
                Object.assign({}, state[action.payload], {status: !state[action.payload][state]}),
                ...state.slice(action.payload + 1)]
        }
        default: {
            return state;
        }
    }
}

用函数创建action

刚才可以看到所有action都是手动打的, 比较麻烦, 可以考虑把生成指令组合成一些方法, 自动生成action对象.

const addTodo = (text) => ({
        type:"ADD_TODO",
        payload:text
    })
> 
const delTodo = (index) => ({
    type:"DEL_TODO",
    payload:index
})
> 
const changeDisplayMode = (modeId) => ({
    type:"CHANGE_DISPLAY_MODE",
    payload:modeId
})
> 
const toggle = (index) => ({
    type:"TOGGLE",
    payload:index
})

小结

到这一步, Redux的数据处理逻辑部分都已经完全实现了, 总共就用了量个API, createStore用来创建store, combineReducers用来合并所有的reducer. 可以说是相当简练了.

上一篇下一篇

猜你喜欢

热点阅读