Redux学习 - 01 简介、工作流、计数器案例、核心API

Redux 简介

Redux 介绍

JavaScript 状态容器,提供可预测化的状态管理。

状态容器

  • 容器:一个 JavaScript 对象
  • 状态:容器对象中的数据,对应 web 页面中 DOM 元素的状态
const state = {
     
  modelOpen: 'yes', // 弹窗是否打开
  btnClicked: 'no', // 按钮是否被点击
  btnActiveClass: 'active', // 按钮的class
  page: 5, // 分页的页码
  size: 10 // 分页的每页展示条数
}

之前在操作页面中 DOM 元素的时候,都是通过 document.getElementById 这种方式先选择 DOM 元素,然后再去操作它。

有了状态容器,就不需要先获取 DOM 元素再操作,可以直接操作这个 DOM 元素所对应的状态对象。

显然,操作对象中的属性相比直接操作 DOM 元素方便很多。

我们可以使用框架,完成改变状态对象的属性值后的 DOM 操作,例如 React Vue Argular,它们内部都有对应的机制把状态同步到 DOM 元素中。

可预测化的状态管理

在一个大型的项目中,糟糕的状态管理通常是导致项目不可维护的重要因素。

Redux 中提供了一种科学化的状态管理的方式,通过这种方式,当状态发生变化的时候,变得可预测,使状态管理变得可维护。

可预测意味着当项目中的状态发生问题的时候,可以很容易的定位到问题出现在哪里。

Redux 核心概念及工作流程

Redux学习 - 01 简介、工作流、计数器案例、核心API_第1张图片

核心:

  • Store:存储状态的容器,JavaScript 对象
    • 所有的状态都存储到 Store 对象中
  • View:视图,HTML 页面
  • Actions:JavaScript 对象,描述对状态进行怎样的操作
    • 包含一个固定的开发人员自己定义的属性 type
  • Reducers:函数,操作状态并返回新的状态
    • 向 Store 中存储或更新状态

流程:

  1. 在 Redux 中所有状态存储在 Store 中,视图 View 是不能直接操作 Store 的。
  2. 如果 View 要操作 Store 就要触发Actions(通过调用 dispatch 方法),通过 Action 描述要对当前 Store 中存储的状态要进行怎样的操作。
  3. Action 会被 Reducer 接收,Reducer 会根据 Action 对象中的 type 对 Store 中的状态进行操作。
  4. 当 Reducer 处理完成之后要返回最新的状态来更新 Store 中的状态。
  5. 当 Store 中的状态发生更新后,再同步给 View(通过调用 subscribe 订阅的方法)。

Redux 计数器案例


<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>计数器title>
  head>
  <body>
    <button id="plus">+button>
    <span id="count">0span>
    <button id="minus">-button>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/redux.min.js">script>
    <script>
      // 3. 存储默认状态
      var initialState = {
      
        count: 0
      }

      // 2. 创建 reducer 函数
      function reducer(state = initialState, action) {
      
        switch (action.type) {
      
          case 'increment':
            return {
      
              count: state.count + 1
            }
          case 'decrement':
            return {
      
              count: state.count - 1
            }
          default:
            return state
        }
      }

      // 1. 创建 store 对象,并传递 reducer 函数
      var store = Redux.createStore(reducer)

      // 4. 定义 action
      var increment = {
       type: 'increment' } // +1
      var decrement = {
       type: 'decrement' } // -1

      // 5. 获取按钮 添加点击事件
      document.getElementById('plus').onclick = function () {
      
        // 6. 触发 action
        store.dispatch(increment)
      }
      document.getElementById('minus').onclick = function () {
      
        store.dispatch(decrement)
      }

      // 7. 订阅 store
      store.subscribe(function () {
      
        // 8. 获取 store 对象中存储的状态,更新视图
        document.getElementById('count').textContent = store.getState().count
      })

    script>
  body>
html>

Redux 核心 API

// 创建 store 状态容器
const store = Redux.createStore(reducer)
// 创建用于处理状态的 reducer 函数,返回值就是 store 中要存储的状态
function reducer (state = initialState, actione) {
     }
// 获取状态
store.getState()
// 订阅状态
store.subscribe(function () {
     })
// 触发 action
store.dispatch({
      type: 'description...' })

你可能感兴趣的:(react)