一种简化 Redux 的思路

简介:

动机

我们热爱 React 和 Redux。但是,Redux 中有太多的样板文件,需要很多的重复劳动,这一点令人沮丧;更别提在实际的 React 应用中,还要集成 react-router 的路由功能了。

一个典型的 React/Redux 应用看起来像下面这样:

actions.js

export const ADD_TODO = 'todos/add'
export const COMPLETE_TODO = 'todos/complete'

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

export function completeTodo(id) {
  return {
    type: COMPLETE_TODO,
    id
  }
}

reducers.js

import { ADD_TODO, COMPLETE_TODO } from './actions'

let nextId = 0

export default function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
      return [...state, {text: action.text, id: nextId++}]
    case COMPLETE_TODO:
      return state.map(todo => {
        if (todo.id === action.id) todo.completed = true
        return todo
      })
    default:
      return state
  }
}

Todos.js

import { addTodo, completeTodo } from './actions'

// ...

// 在某个事件处理函数中
dispatch(addTodo('a new todo'))

// 在另一个事件处理函数中
dispatch(completeTodo(42))

看起来是不是有点繁冗?这还是没考虑 异步 action 的情况呢。如果要处理异步 action,还需要引入 middleware(比如 redux-thunk 或者 redux-saga),那么代码就更繁琐了。

在一个接口中定义 action/reducer?

Todos.js

import mirror, { actions } from 'mirrorx'

let nextId = 0

mirror.model({
  name: 'todos',
  initialState: [],
  reducers: {
    add(state, text) {
      return [...state, {text, id: nextId++}]
    },
    complete(state, id) {
      return state.map(todo => {
        if (todo.id === id) todo.completed = true
        return todo
      })
    }
  }
})

// ...

// 在某个事件处理函数中
actions.todos.add('a new todo')

// 在另一个事件处理函数中
actions.todos.complete(42)

是不是就简单很多了?只需一个方法,即可定义所有的 action 和 reducer(以及 异步 action)。

而且,这行代码:

actions.todos.add('a new todo')

完全等同于这行代码:

dispatch({
  type: 'todos/add',
  text: 'a new todo'
})

完全不用关心具体的 action type,不用写大量的重复代码。简洁,高效。

异步 action

上述代码示例仅仅针对同步 action。那 异步 action 怎么处理呢?

mirror.model({
  // 省略前述代码
  effects: {
    async addAsync(data, getState) {
      const res = await Promise.resolve(data)
      // 调用 `actions` 上的方法 dispatch 一个同步 action
      actions.todos.add(res)
    }
  }
})

没错,这样就定义了一个异步 action。上述代码的效果等同于如下代码:

actions.todos.addSync = (data, getState) => {
  return dispatch({
    type: 'todos/addAsync',
    data
  })
}

调用 actions.todos.addSync 方法,则会 dispatch 一个 type 为 todos/addAsync 的 action。

当然,处理这样的 action,必须要借助于 middleware。不过实现这样一个 middleware 也非常简单,开发者只管定义 action/reducer,然后简单地调用一个函数就行了。

总结

既然是对现有开发模式做封装和简化,那么要秉承的一个原则应该是,在尽可能地避免发明新的概念,并保持现有开发模式的前提下,减少重复劳动,提高开发效率。

只提供极少数的新 API,其余的都借用 React/Redux/react-router 已有的接口,针对其做封装和强化。

也就是说,不去“颠覆” React/Redux 开发流,只是简化了接口调用,省去样板代码:

针对上面描述的思路,初步完成了一个“框架”,Mirror。

目录
相关文章
|
数据处理 对象存储
如何利用 OSS 转换 webp 文件为jpeg
如何利用 OSS 转换 webp 文件为jpeg,OSS 样式使用
2681 1
|
存储 缓存 Kubernetes
秒级启动万个容器,探秘阿里云容器镜像加速黑科技
阿里云容器与存储团队展开合作,利用DADI加速器支持镜像按需读取和P2P分发,实现3.01秒启动10000个容器,完美杜绝容器冷启动的数分钟漫长等待,以及镜像仓库大规模并行分发场景下的网络拥堵。
6323 0
秒级启动万个容器,探秘阿里云容器镜像加速黑科技
|
2月前
|
数据采集 人工智能 搜索推荐
GEO服务商怎么选——交付形态、能力深度与风险承担三维评估框架
王涛(成都GEO专家)提出GEO服务商三维评估框架:一比交付形态(工具/服务/咨询型),二看能力深度(以可验证交付物与题集结果为证),三查风险承担(承诺是否定义清晰、口径可复盘)。强调不比综合分,而要逐项核验基础、结构、战略、风控四层能力的交付物,推动行业标准化。(239字)
|
存储 弹性计算 关系型数据库
5 分钟玩转 OceanBase 社区版 Docker 部署
## 简介 本文是个人把 OceanBase 社区版 3.1 做了一个 Docker 镜像,仅用于学习研究。只要你有一个 4C10G的笔记本可以联公网,你就可以在5分钟内将 OceanBase 社区版跑起来。 OceanBase 社区版是今年 6月1日开源的,只兼容 MySQL,可以理解为分布式的MySQL。其核心功能跟内部业务在用的OceanBase 企业版基本一致。核心功能包含:**多副
4461 0
5 分钟玩转 OceanBase 社区版 Docker 部署
|
2月前
|
人工智能 IDE 开发工具
从安装到工程开发,Qoder CN智能编程助手,CLI/IDE配置、额度管控与场景选型指南
随着AI辅助开发持续进化,单纯的代码片段自动补全已经很难满足复杂工程开发需求。Qoder CN作为完成品牌架构升级后的AI智能编程平台,跳出传统代码补全工具定位,转型为目标驱动的全栈Agent式智能编程工作台。产品面向编程学习者、独立开发者、中小研发团队、高合规企业,形成完整产品矩阵,覆盖IDE插件、独立客户端、Qoder CN CLI终端工具,配套办公场景QoderWork CN桌面工作台、QoderWake CN数字员工、Clouds Agents云端智能体套件。整套体系依托本土化大模型底座,重视数据安全合规,适配金融、政务等对数据管控严格的行业。本文完整介绍产品各版本差异,提供多终端可直
384 0
|
2月前
|
人工智能 自然语言处理 机器人
2026企业级智能客服系统建设方案全指南:从规划到落地的五步法
2026年,智能客服正从“答对问题”迈向“办成事情”。本文以阿里云瓴羊Quick Service为范本,提出架构选型、知识工程、AI集成、全渠道协同、持续运营五步落地法,助力企业构建可进化、能执行的数字员工体系。
|
3月前
|
缓存 负载均衡 应用服务中间件
2026 年再讲 Nginx 代理:正向代理和反向代理到底差在哪?
Nginx中,“代理”分正向与反向:正向代理替客户端访问外网(需客户端配置),隐藏用户IP;反向代理替服务端接收请求(客户端无感),隐藏后端架构。二者立场、用途、配置主体截然不同,99%线上场景用的是反向代理。
|
9月前
|
存储 人工智能 Docker
2026年阿里云集成OpenClaw/Clawdbot打造QQ社群AI Agent智能助手:自动化运营指南
作为社群管理者,你是否常被这些问题困扰:新人入群重复提问、高质量内容转瞬沉没、社群活跃度持续下滑、活动组织耗时耗力、24小时在线管理不堪重负?2026年,借助OpenClaw(原Clawdbot)的AI Agent能力,搭配阿里云稳定的云服务环境,可轻松打造专属QQ社群智能助手,实现智能问答、精华沉淀、活动管理、互动活跃全自动化,让社群运营效率提升10倍。
1024 7
|
9月前
|
监控 安全 网络安全
8080 和 3128 端口的核心区别及使用场景
HTTP代理常用端口8080与3128各有侧重:8080多用于管理监控(如Web配置界面),易记但可能被防火墙拦截;3128为标准端口,稳定性高,主供客户端正常请求转发。端口可自定义,需据安全与性能需求合理选用。
|
11月前
|
机器学习/深度学习 弹性计算 应用服务中间件
阿里云服务器租赁价格标准整理汇总:一年/按月/按小时报价明细出炉
最新的阿里云服务器价格多少钱1年?阿里云服务器产品包含 ECS 云服务器、轻量应用服务器和 GPU 服务器,涵盖多种实例规格与配置,满足不同使用需求。今天小编总结一篇关于最新的阿里云服务器租赁价格标准整理汇总:包含一年/按月/按小时报价明细。

热门文章

最新文章