Redux 入门:JavaScript 可预测状态管理库

文章目录

Redux 是 JavaScript 生态最流行的可预测状态管理库,GitHub 星标超过 6 万,配合 React 用得最多,别的框架也能用,做大型项目状态管理真的靠谱。

我用 Redux 做过好几个大型 React 项目,聊聊它解决什么问题,新手值得学吗,什么时候用它合适。

Redux 解决了什么问题

React 做大型项目,组件多了,状态传来传去太麻烦,props 要一层一层传,很多组件共享一个状态,改起来到处都是,乱。Redux 把所有状态放一个容器,哪个组件要用直接拿,改的时候统一改,数据流向清晰,不容易乱。

所有状态修改都是纯函数,可预测,你改之前是什么,改了之后是什么,日志都能记,回滚也方便,调试方便,时间旅行调试真的很爽,改出问题一步一步看。

中间件机制,你想加日志,加异步请求,加路由同步,插中间件就行,扩展方便,想要什么功能加什么。

基础例子看一下

安装创建:

bash 复制代码
npm install redux react-redux

写个简单计数器:

javascript 复制代码
// store/counter.js
// reducer
function counterReducer(state = { value: 0 }, action) {
  switch (action.type) {
    case 'counter/incremented':
      return { ...state, value: state.value + 1 }
    case 'counter/decremented':
      return { ...state, value: state.value - 1 }
    default:
      return state
  }
}

export default counterReducer
javascript 复制代码
// store/index.js
import { createStore, combineReducers } from 'redux'
import counterReducer from './counter'

const rootReducer = combineReducers({
  counter: counterReducer
})

const store = createStore(rootReducer)

export default store

在 React 里用:

jsx 复制代码
// App.jsx
import { useSelector, useDispatch } from 'react-redux'
import { Provider } from 'react-redux'
import store from './store'

function Counter() {
  const count = useSelector(state => state.counter.value)
  const dispatch = useDispatch()

  return (
    <div>
      <button onClick={() => dispatch({ type: 'counter/decremented' })}>-</button>
      <span>{count}</span>
      <button onClick={() => dispatch({ type: 'counter/incremented' })}>+</button>
    </div>
  )
}

export default function App() {
  return (
    <Provider store={store}>
      <Counter />
    </Provider>
  )
}

就是这么简单,状态存在 store 里,组件用 useSelector 拿,改状态发 action,reducer 算新状态,数据流向清晰。

现在用 Redux Toolkit 更简洁,官方推荐写法:

javascript 复制代码
// counterSlice.js
import { createSlice } from '@reduxjs/toolkit'

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    incremented: state => {
      state.value += 1
    },
    decremented: state => {
      state.value -= 1
    }
  }
})

export const { incremented, decremented } = counterSlice.actions
export default counterSlice.reducer

Immer 帮你处理不可变更新,你直接改状态就行,不用自己写展开运算符,简洁很多。

核心好用的特性

单一数据源

整个应用所有状态存在一个 store 里,方便调试,方便服务端渲染,状态好拿,哪里要用哪里取,不用传来传去。

状态只读

不能直接改状态,只能发 action,所有修改都集中走一遍,谁改了什么时候改的,都能追踪,不容易出莫名其妙的bug。

纯函数修改

reducer 是纯函数,相同输入一定相同输出,没有副作用,好测试,好理解,结果可预测。

中间件扩展

中间件拦截 action,可以做日志、异步处理、路由同步,想要什么功能插进去就行,Redux 本身核心很小,扩展灵活。

开发者工具

Redux DevTools 太好用了,看每一步 action 改了什么,时间旅行,回到之前的状态调试,出问题一步一步看,定位bug 特别快。

哪些场景用 Redux

大型 React 项目,很多组件共享状态,用 Redux 最合适,数据流向清晰,项目大了好维护,每个人都按规则改状态,不容易乱。

中大型项目,需要调试,需要回滚,Redux 开发工具帮你省好多时间,出问题好定位。需要做 undo/redo 功能,Redux 天生支持,特别好做。

团队协作开发,大家都按 Redux 规则来,状态修改统一,代码风格一致,维护方便,新人接手也容易懂。

Redux 有哪些优缺点

优点太明显,架构清晰,数据流向统一,大型项目好维护,时间旅行调试真的省好多时间,生态完善,什么中间件都有,异步用 redux-thunk 还是 redux-saga 你自己选,灵活性够。

缺点也有,概念多,入门要学 reducer、action、store、中间件,新手一下子理解不了,写简单项目样板代码多,有点重。现在 React 有 Context useReducer,简单场景不用 Redux 也能搞定,Redux 适合中大型项目,小项目用不上。

官方现在推 Redux Toolkit,简化了很多,样板代码少了很多,比以前好用多了。

现在 Redux 发展得怎么样

出来快十年了,一直是 React 生态状态管理的首选,现在 RTK 简化之后,好用很多,用户还是很多,一直稳定更新,RTK Query 还帮你做了数据请求缓存,越来越完善。

虽然现在有 Zustand、Jotai 这些新的状态管理,但 Redux 还是大型项目首选,架构清晰,规则明确,团队合作舒服。招聘市场一直要求会 Redux,做 React 开发基本都要会。

现在学 Redux 值得吗

做 React 中大型开发,肯定值得学,找工作基本都要求会,大型项目真的需要它,规则明确,好维护。学会 Redux 的思想,就算你用别的状态管理,思想也通用。

现在有 Redux Toolkit,写起来简洁很多,入门也比以前容易,跟着官方文档走一遍,很快就能会。小项目其实用不上,但中大型项目,Redux 还是最稳的,这么多年验证过了,坑都踩完了。

就算你不用,理解它单向数据流的思想,对你理解前端状态管理也有帮助,学了没坏处。

项目地址:https://github.com/reduxjs/redux

Toolkit,写起来简洁很多,入门也比以前容易,跟着官方文档走一遍,很快就能会。小项目其实用不上,但中大型项目,Redux 还是最稳的,这么多年验证过了,坑都踩完了。

就算你不用,理解它单向数据流的思想,对你理解前端状态管理也有帮助,学了没坏处。

项目地址:https://github.com/reduxjs/redux

相关推荐
漂移的电子5 小时前
解决Vue3 + TypeScript + Vite搭建的项目,动态路由页面加载失败的最隐蔽原因
javascript·ubuntu·typescript
前鼻音太阳熊6 小时前
【MES系统】- 工业HMI状态机可视化实践:从手写SVG到Cytoscape.js的技术选型与踩坑
开发语言·javascript·ecmascript
阿米亚波6 小时前
【C++ STL】std::array
java·开发语言·c++
晓得迷路了6 小时前
栗子前端技术周刊第 139 期 - Nuxt 4.5、Vue 3.6 RC、Angular 发布节奏...
前端·javascript·vue.js
wuyk5556 小时前
66.嵌入式C语言进阶:共用体(Union)实战指南——单片机内存省一半的神级技巧
c语言·开发语言·stm32·单片机·嵌入式硬件
Ivanqhz6 小时前
Rust #[derive(Serialize)]浅析
开发语言·后端·rust
怪奇云呼军6 小时前
闪电智能 Voice Agent 怎样根据语速、停顿和追问方式切换话术?策略引擎拆解
开发语言·人工智能·网络协议·算法·语音识别·web app
এ慕ོ冬℘゜6 小时前
原生 select 下拉框搜索失效踩坑:文本搜索与 ID 匹配不对应问题排查
前端·javascript·html
Ivanqhz6 小时前
Rust parse() 浅析
开发语言·后端·rust
神仙别闹6 小时前
基于C++实现(控制台)景区旅游管理系统
开发语言·c++·旅游