Redux - 状态管理框架

简介

Redux 是一个 JavaScript 应用程序的状态容器,同时也是一个状态管理框架。它提供了可预测性、可维护性和可测试性,帮助开发者更好地构建大型复杂应用。Redux 独立于任何 UI 库,因此可以用于 React,Angular,Vue 甚至纯 JavaScript 应用程序。

Redux 基本思想是将应用程序的状态存储到一个单一的状态对象中,通过一个严格的流程控制每一次状态的变更。这种单向数据流的方式使得状态变更可控,同时也容易调试和维护。

核心概念

Action

Action 是一个普通的 JavaScript 对象,用于描述状态变更的动作。它必须包含一个 type 字段,表示动作的类型。其他字段根据具体应用场景而定,例如更新数据、请求网络数据等。

{
  type: 'ADD_TODO',
  text: 'Learn Redux'
}

Reducer

Reducer 是一个纯函数,用于描述状态的变更。它接收一个当前状态和一个 action 对象,并返回一个新的状态。Reducer 必须是纯函数,它不应该产生任何副作用,也不应该对传入的参数进行修改。

function todos(state = [], action) {
  switch (action.type) {
    case 'ADD_TODO':
      return [
        ...state,
        {
          text: action.text,
          completed: false
        }
      ]
    default:
      return state
  }
}

Store

Store 是一个应用程序的中心化状态容器,负责管理应用程序的状态。它只接收一个 reducer,一旦创建便无法更改。应用程序的状态存储在一个单一的状态树中。

import { createStore } from 'redux'
import todos from './reducers'

const store = createStore(todos)

Dispatch

通过 dispatch 方法,我们可以触发一个 Action,使得 Reducer 进行相应的状态变更。这是唯一能够改变状态的方法。

store.dispatch({
  type: 'ADD_TODO',
  text: 'Learn Redux'
})

示例代码

下面是一个简单的 Todo List 应用程序的示例代码。

import { createStore } from 'redux'

const ADD_TODO = 'ADD_TODO'
const TOGGLE_TODO = 'TOGGLE_TODO'
const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER'

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

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

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

function setVisibilityFilter (filter) {
  return { type: SET_VISIBILITY_FILTER, filter }
}

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 visibilityFilter (state = VisibilityFilters.SHOW_ALL, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return action.filter
    default:
      return state
  }
}

function todoApp (state = {}, action) {
  return {
    todos: todos(state.todos, action),
    visibilityFilter: visibilityFilter(state.visibilityFilter, action)
  }
}

const store = createStore(todoApp)

console.log(store.getState())

const unsubscribe = store.subscribe(() => {
  console.log(store.getState())
})

store.dispatch(addTodo('Learn Redux'))
store.dispatch(addTodo('Learn React'))
store.dispatch(toggleTodo(0))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))

unsubscribe()

总结

Redux 提供了一个可预测、可维护和可测试的方式来管理应用程序的状态。它的核心概念包括 Action,Reducer,Store 和 Dispatch。通过一个严格的流程控制每一次状态的变更,使得状态变更可控,同时也容易调试和维护。可以将 Redux 与任何 UI 库一起使用,包括 React、Angular、Vue 甚至纯 JavaScript 应用程序。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659684b4eb4cecbf2da54661


纠错反馈