Redux 数据仓库入门

797 阅读3分钟

写在前面:工作项目有用到 DvaJS 框架,以 Redux 为基础,之前只用过 Vuex,借机看看 Redux,文章思路以:为什么是什么怎么用为导向,知识有错漏之处,望斧正 😁

参考来源:中文文档 | 英文文档 | 阮一峰入门文章

Why 🧐

仅靠 React 是无法完成大型应用的,因为还缺乏 代码结构组件之间的通信。原先有 Flux,后来,出现了 Redux。简单的应用不需要 Redux ,会使其变得复杂,当 多交互、多数据源 以及 需要一种机制,可以在同一个地方查询状态、改变状态、传播状态的变化 这些情况下去考虑使用。

What 🤗

Redux 的设计思想

  • Web 应用是一个状态机,视图与状态(state)是一一对应的。
  • 所有的状态(state),保存在一个对象里面。

基本概念和 API

🎈 Store

整个应用只有一个 store,是保存(全局变量)数据的一个容器,用 createStore 创建,createStore 也接受第二个参数,表示初始状态,通常由服务器提供

import { createStore } from 'redux';
const store = createStore(fn);

🎈 State

某个时点的 store 数据,一个 state 对应一个 View,当前时刻的 state 通过 getState 获取

import { createStore } from 'redux';
const store = createStore(fn);

const state = store.getState();

🎈 Action

state 的变化会导致 View 的变化,用户接触不到 state,只能通过 View,Action 就是 View 发出的通知(通过 dispatch),告知 state 要发生变化了。Action 是一个对象

const action = {
  type: 'ADD_TODO', // Action 的名称
  payload: 'Learn Redux' // 携带的信息
};

🎈 Action Creator

生成 Action 的函数就叫 Action Creator

const ADD_TODO = '添加 TODO';

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

const action = addTodo('Learn Redux');

🎈 store.dispatch

是 View 发出 Action 的唯一方法,store.dispatch接受一个 Action 对象作为参数,将它发送出去

store.dispatch(addTodo('Learn Redux'));

🎈 Reducer

store 接收到 Action 之后,要去改变 state,View 才会发生变化,这样一个计算过程叫做 Reducer。是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 StateReducer 函数负责生成 State

不用手动调用,只需要将 Reducer 传入createStore方法。触发 dispatch 时会自动调用 Reducer 改变状态

const store = createStore(reducer);

注意: Reducer 是一个纯函数,因此 Reducer 函数里面不能改变 State,必须返回一个全新的对象

// 理解 Reducer 如何生成新的 state
const chatReducer = (state = defaultState, action = {}) => {
  const { type, payload } = action;
  switch (type) {
    case ADD_CHAT:
      return Object.assign({}, state, {
        chatLog: state.chatLog.concat(payload)
      });
    case CHANGE_STATUS:
      return Object.assign({}, state, {
        statusMessage: payload
      });
    case CHANGE_USERNAME:
      return Object.assign({}, state, {
        userName: payload
      });
    default: return state;
  }
};
// 文章有拆分和合并的实现

🎈 store.subscribe()

监听方法,一旦 State 发生变化,就自动执行这个函数

How 🥱

Reduex 提供了三个方法,store.getState()、store.dispatch()、store.subscribe()

理解 Redux 的工作流程 🎃✨

用户在视图层(View)通过 dispath 方法发送 Action 给 store,表示要改变状态。store 接收到 Action 会自动调用 Reducer 方法,入参是当前的 state 和发起的 action,生成一个新的 state。store 的事件监听 store.subscribe(),监听到 state 变化后,用新的 state 去渲染新的 View 回到页面,用户就感受到了页面的变化。

总结

Redux 和 Vuex 状态管理的作用,包括一些思路是一样的。观察者模式,响应式,解决跨页面数据共享,监控工具是 redux devtool

  • 我觉得主要是理解它的数据流是怎么走的
  • 还有就是,和 Vuex 一样,不要滥用,不是大范围需要用到的状态其实真的没必要