Redux

112 阅读3分钟

action 、reducer、store

  1. action

官方解释:Action是把数据从应用传到 store 的有效载荷,它是 store 数据的唯一来源。 个人理解:action是发出做某件事的请求,本身不做任何逻辑处理,只是一个纯函数(在js中就是一个普通的对象)。

action 内必须使用一个字符串类型的type字段来表示将要执行的动作。

Example:

{
    type:'ADD_TODO'
    text:'这里可不填这里,action里面只要有type 就成,其他的可有可无,根据自己的情况'
}

action创建函数:

/*
 * action 类型
 */

export const ADD_TODO = 'ADD_TODO';
export const TOGGLE_TODO = 'TOGGLE_TODO'
export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER'

/*
 * 其它的常量
 */

export const VisibilityFilters = {
  SHOW_ALL: 'SHOW_ALL',
  SHOW_COMPLETED: 'SHOW_COMPLETED',
  SHOW_ACTIVE: 'SHOW_ACTIVE'
}

/*
 * action 创建函数
 */

export function addTodo(text) {
  return { type: ADD_TODO, text }
}

export function toggleTodo(index) {
  return { type: TOGGLE_TODO, index }
}

export function setVisibilityFilter(filter) {
  return { type: SET_VISIBILITY_FILTER, filter }
}
  1. reducer reducer它是一个函数,它接受一个state和一个action,根据action的type返回一个新的state。根据业务逻辑可以分为很多个reducer,然后通过combineReducers将它们合并,state树中有很多对象,每个state对象对应一个reducer,state对象的名字可以在合并时定义。

reducer就是根据action的type来处理不同的事件(type唯一,不要重复)。

Example:

import { VisibilityFilters } from './actions'

const initialState = {
  visibilityFilter: VisibilityFilters.SHOW_ALL,
  todos: []
};

function todoApp(state, action) {
  if (typeof state === 'undefined') {
    return initialState
  }

  // 这里暂不处理任何 action,
  // 仅返回传入的 state。
  return state
}

function todoApp(state = initialState, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return Object.assign({}, state, {
        visibilityFilter: action.filter
      })
    default:
      return state
  }
}

拆分 Reducer:

function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
      return [
        ...state,
        {
          text: action.text,
          completed: false
        }
      ]
    case TOGGLE_TODO:
      return state.map((todo, index) => {
        if (index === action.index) {
          return Object.assign({}, todo, {
            completed: !todo.completed
          })
        }
        return todo
      })
    default:
      return state
  }
}

function todoApp(state = initialState, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return Object.assign({}, state, {
        visibilityFilter: action.filter
      })
    case ADD_TODO:
      return Object.assign({}, state, {
        todos: todos(state.todos, action)
      })
    case TOGGLE_TODO:
      return Object.assign({}, state, {
        todos: todos(state.todos, action)
      })
    default:
      return state
  }
}

注意每个 reducer 只负责管理全局 state 中它负责的一部分。每个 reducer 的 state 参数都不同,分别对应它管理的那部分 state 数据。

  1. combineReducers()

辅助函数的作用是,把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用 createStore

import { combineReducers } from 'redux'

const todoApp = combineReducers({
  visibilityFilter,
  todos
})

export default todoApp

* 注意上面的写法和下面完全等价:

export default function todoApp(state = {}, action) {
  return {
    visibilityFilter: visibilityFilter(state.visibilityFilter, action),
    todos: todos(state.todos, action)
  }
}
  1. Store Store 就是把它们联系到一起的对象。Store 有以下职责:

维持应用的 state;

提供 getState() 方法获取 state;

提供 dispatch(action) 方法更新 state;

通过 subscribe(listener) 注册监听器;

通过 subscribe(listener) 返回的函数注销监听器。

发起 Actions

import {
  addTodo,
  toggleTodo,
  setVisibilityFilter,
  VisibilityFilters
} from './actions'

// 打印初始状态
console.log(store.getState())

// 每次 state 更新时,打印日志
// 注意 subscribe() 返回一个函数用来注销监听器
const unsubscribe = store.subscribe(() =>
  console.log(store.getState())
)

// 发起一系列 action
store.dispatch(addTodo('Learn about actions'))
store.dispatch(addTodo('Learn about reducers'))
store.dispatch(addTodo('Learn about store'))
store.dispatch(toggleTodo(0))
store.dispatch(toggleTodo(1))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))

// 停止监听 state 更新
unsubscribe();
import { createStore } from 'redux'
import todoApp from './reducers'

let store = createStore(todoApp)

createStore

createStore 的函数的作用就是生成一个 store 对象。这个对象具有5个方法:

return {
    dispatch, // 传入 action,调用 reducer 及触发 subscribe 绑定的监听函数
    subscribe,
    getState,
    replaceReducer, // 用新的 reducer 代替当前的 reducer,使用不多
    [$$observable]: observable
}       
方法 描述
createStore 创建一个state用来存储状态树
combineReducers 合并reducer
bindActionCreators 将dispatch和action结合
applyMiddleware 调度中间件来增强store,例如中间件redux-thunk等
compose 从右向左组合多个函数, compose(f, g, h)会返回(...args) => f(g(h(...args)))
var store = createStore(
    combineReducers(reducer),
    applyMiddleware(thunk)
);

applyMiddleware

applyMiddleware函数的作用就是对 store.dispatch 方法进行增强和改造,使得在发出 Action 和执行 Reducer 之间添加其他功能