redux

182 阅读2分钟

redux

  • Redux 是一个使用叫做“action”的事件来管理和更新应用状态的模式和工具库

  • 使用场景

    • 在应用的大量地方,都存在大量的状态
    • 应用状态会随着时间的推移而频繁更新
    • 更新该状态的逻辑可能很复杂
    • 中型和大型代码量的应用,很多人协同开发
  • state:驱动应用的真实数据源头

  • view:基于当前状态的 UI 声明性描述

  • actions:根据用户输入在应用程序中发生的事件,并触发状态更新

  • reducer reducer 就是一个纯函数,接收旧的 state 和 action,返回新的 state

你可以将 reducer 视为一个事件监听器,它根据接收到的 action(事件)类型处理事件。

  • 之所以将这样的函数称之为 reducer,是因为这种函数与被传入 Array.prototype.reduce(reducer, ?initialValue) 里的回调函数属于相同的类型。保持 reducer 纯净非常重要。永远不要在 reducer 里做这些操作:

  • 修改传入参数;

  • 执行有副作用的操作,如 API 请求和路由跳转;

  • 调用非纯函数,如 Date.now() 或 Math.random() 。

  • createStore 创建Store

  • reducer 初始化、修改状态函数

  • dispatch 提交变更

  • getstate 获取初始值

  • subscribe 变更订阅

示例

// store/index.js
import { createStore } from 'redux'

function countReducer(state = 0, action){
    switch (action.type){
        case 'ADD' :{
            return state + 1
        }
        case 'MINUS':
            return state - 1
        default :
            return state    
    }
}
const store = createStore(countReducer)

export default store
// react 中使用

import React, {Component} from "react";
import store  from './redux';

export default class App extends Component {

  componentDidMount(){
    store.subscribe(()=>{
      this.forceUpdate()
    })
  }

  add = () => {
    store.dispatch({type: "ADD"});
  }

  minus = () => {
    store.dispatch({type: 'MINUS'})
  }

  render(){
    return (
    <div className="App">
      <header className="App-header">
          <div>{store.getState()}</div>
          <span onClick={this.add}> ADD </span>
          <span onClick={this.minus}> MINUS </span>
      </header>
    </div>
    )
  }
}

简单实现

// 简单实现这个函数 redux函数
export function createStore(reducer) {
    let currentState;
    let currentListeners = []

    function getState() {
        return currentState
    }
    function dispatch (action) {
        currentState = reducer(currentState,action)
        currentListeners.forEach(linstener => linstener())
        return action
    }
    function  subscribe (listener) {
        currentListeners.push(listener)
    }
    // 设置初始值
    dispatch({type: "KKPSYKSHHSJ/XXXXX"})
    return {
        getState,
        dispatch,
        subscribe
    }
}

插件

Redex 本身的功能逻辑还是比较简单的,而且默认只支持同步,实现其他功能就需要依赖插件机制 如:redux-thunk redux-logger

  • 用法:
import logger from "redux-logger";
import thunk from "redux-thunk";
import counterReducer from './counterReducer'

const store = createStore(counterReducer, applyMiddleware(thunk, logger));