前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载导读本文围绕 wp-calypso 仓库中 client/state/active-promotions 模块的官方文档深入讲解 WordPress.com 前端如何通过 Redux 管理当前有效促销活动active promotions数据。读者将掌握该模块四个 Action Creator 的用法、全局状态树state.activePromotions的数据结构、以及数据经由 Data Layer 从 WP REST API 落库的完整链路可直接参考用于理解或扩展 Calypso 状态管理中的类似数据模块。模块定位一个纯 Redux 数据模块ActivePromotions 模块用于管理 WordPress.com 的有效促销活动数据例如促销 ID 列表如spring_sale、请求状态与错误状态。它是一个典型的、只读型的数据模块不包含 UI 组件职责被拆分为 Actions、Reducer、Selectors 三个标准 Redux 部分源码位于actions.jsAction Creator 定义reducer.jsReducer 组合与数据落库selectors.js从全局状态读取数据init.js向 Redux store 注册 reducerschema.jsitems 数据的 JSON Schema 校验test配套单元测试actions / reducer / selectors在 Calypso 的状态架构中模块通过registerReducer( [ activePromotions ], activePromotionsReducer )见 init.js挂载到全局状态树因此任意业务代码只需 importcalypso/state/active-promotions/init即可保证该 reducer 已被注册。Actions与 Redux dispatch 协同的数据操纵入口官方文档明确指出Actions 需要与 Redux store 实例的dispatch函数配合使用用于操纵当前的全局状态。模块共暴露四个 Action Creator见 actions.jsAction Creator参数触发的 Action 类型作用activePromotionsReceiveAction( activePromotions )activePromotions: ArrayWordPress.com 返回的促销列表ACTIVE_PROMOTIONS_RECEIVE将获取到的促销数据写入状态树activePromotionsRequestSuccessAction()无ACTIVE_PROMOTIONS_REQUEST_SUCCESS标记本次请求成功activePromotionsRequestFailureAction( error )error: string错误信息ACTIVE_PROMOTIONS_REQUEST_FAILURE记录请求失败requestActivePromotions()无ACTIVE_PROMOTIONS_REQUEST发起获取促销数据的请求所有 Action 类型常量定义在 client/state/action-types.ts 中供 reducer 与>import { activePromotionsReceiveAction, activePromotionsRequestSuccessAction, activePromotionsRequestFailureAction, requestActivePromotions, } from calypso/state/activePromotions/actions; dispatch( requestActivePromotions() ); wpcom .activePromotions() .list() .then( ( response ) { dispatch( activePromotionsRequestSuccessAction() ); dispatch( activePromotionsReceiveAction( response ) ); } ) .catch( ( error ) { dispatch( activePromotionsRequestFailureAction( error.message ) ); } );这里wpcom.activePromotions().list()是 wpcom.js 客户端 API 的调用形式。注意在 Calypso 当前的工程实践中更推荐的方式是直接dispatch( requestActivePromotions() )由 Data Layer 统一完成 HTTP 请求与结果分发详见下文Data Layer小节避免在业务组件里手工处理 Promise。源码级细节activePromotionsReceiveAction把数据原样放入 action 对象{ type: ACTIVE_PROMOTIONS_RECEIVE, activePromotions }requestActivePromotions是无参的零载荷 action{ type: ACTIVE_PROMOTIONS_REQUEST }它本身不携带数据只是通知状态机进入请求中从源码结构看activePromotionsRequestSuccessAction与activePromotionsRequestFailureAction专门服务于请求生命周期的状态标记为 UI 层显示加载/错误反馈提供依据。Reducer全局状态树中的数据结构来自上述 actions 的数据会写入全局状态树的activePromotions节点下官方文档给出的结构如下state.activePromotions { items: [ spring_sale ], requesting: false, errors: false, };结合 reducer.js 的源码state.activePromotions实际由三个子 reducer 组合而成字段语义如下字段类型默认值更新逻辑itemsArraystring[]收到ACTIVE_PROMOTIONS_RECEIVE时替换为action.activePromotionsrequestingbooleanfalseACTIVE_PROMOTIONS_REQUEST置为true成功/失败后置回falseerrorbooleanfalseACTIVE_PROMOTIONS_REQUEST或成功时置为false失败时置为true关于字段命名需要特别说明原文档的示例中写的是errors而实际源码reducer.js使用的字段名为error单数对应的 Selector 也没有暴露读取该字段的接口阅读或扩展代码时请以源码为准。items 的数据健壮性处理items子 reducer 用withSchemaValidation( itemsSchema, ... )包裹见 reducer.jsschema 定义在 schema.jsitems必须是元素类型为string的数组。当传入数据不满足 schema 时会被过滤兜底。此外源码专门处理了一个来自后端的边界情况reducer.js// Sometimes an empty PHP can be serialized as {} object, force to array in that case if ( ! Array.isArray( action.activePromotions ) ) { return []; }即当 PHP 后端把空数据序列化为{}对象而非空数组时reducer 会将其强制归一为空数组[]避免下游 Selector 因拿到非数组而崩溃。模块级 reducer 的组装三个子 reducer 通过combineReducers( { items, requesting, error } )组合再经由withStorageKey( activePromotions, combinedReducer )reducer.js打上存储键标记配合 init.js 中的registerReducer注册到全局 storewithStorageKey来自automattic/state-utils包用于在持久化/还原时定位该片段。Data Layer请求的真正执行者模块的 actions.js 顶部引入了calypso/state/data-layer/wpcom/active-promotionsactions.js这是 Calypso Data Layer 框架的接线点。Data Layer 将 Redux action 与 WP REST API 请求解耦完整实现位于 client/state/data-layer/wpcom/active-promotions/index.js请求构造requestActivePromotions将ACTIVE_PROMOTIONS_REQUESTaction 翻译为一个 HTTP 请求——GET /me/active-promotionsapiVersion: 1.1见 index.js成功处理receiveActivePromotions从响应体取出active_promotions字段依次派发activePromotionsRequestSuccessAction()与activePromotionsReceiveAction( active_promotions )index.js失败处理receiveError将原始错误归一化为Error.message字符串后派发失败 actionindex.js注册处理器通过dispatchRequest( { fetch, onSuccess, onError } )组装并用registerHandlers绑定到ACTIVE_PROMOTIONS_REQUEST类型上index.js。由此可见业务代码只需一句dispatch( requestActivePromotions() )网络请求、成功/失败分发全部由 Data Layer 托管这正是原文档示例中被隐去、但在工程实践中真正生效的调用路径。Selectors从全局状态安全读取数据selectors.js 提供三个纯函数选择器供组件以useSelector/connect方式消费数据import { getActivePromotions, hasActivePromotion, isRequestingActivePromotions, } from calypso/state/active-promotions/selectors; // 获取全部有效促销 ID 列表例如 [spring_sale] getActivePromotions( state ); // 判断某个促销是否正处于有效状态 hasActivePromotion( state, spring_sale ); // true / false // 判断是否正在请求中用于加载态展示 isRequestingActivePromotions( state );getActivePromotions( state )直接返回state.activePromotions.itemshasActivePromotion( state, name )基于getActivePromotions的结果做indexOf( name ) ! -1判断即促销名称出现在列表中则视为有效isRequestingActivePromotions( state )返回state.activePromotions.requesting可用于在 UI 中显示加载中状态。每个 Selector 文件顶部同样引入了calypso/state/active-promotions/initselectors.js确保在读取时 reducer 一定已注册。测试与代码质量保障模块在 test 目录下分别对 actions、reducer、selectors 提供了单元测试test/actions.js断言各 Action Creator 返回的 action 对象结构test/reducer.js验证 reducer 对各 action 类型的状态转移含空对象归一为数组的边界用例test/selectors.js验证选择器从 fixture 状态中取值的正确性test/fixture/index.js提供测试用的标准状态快照。同时client/state/data-layer/wpcom/active-promotions/test/index.js 覆盖了 Data Layer 侧的成功与失败分发逻辑。这四层测试共同保证了从 action 派发到数据落库再到 selector 读取的整条链路行为可验证、可回归。小结如何在业务中接入 ActivePromotions综合官方文档与源码接入该模块的推荐姿势为import { useSelect } from calypso/state; import { requestActivePromotions } from calypso/state/active-promotions/actions; import { hasActivePromotion, isRequestingActivePromotions } from calypso/state/active-promotions/selectors; // 在组件挂载时发起一次请求Data Layer 会自动完成 HTTP 与分发 dispatch( requestActivePromotions() ); // 渲染时读取状态 const requesting useSelect( isRequestingActivePromotions ); const isSpringSale useSelect( ( state ) hasActivePromotion( state, spring_sale ) );整体数据流为dispatch(requestActivePromotions())→ Data Layer 发起GET /me/active-promotions→ 成功派发ACTIVE_PROMOTIONS_REQUEST_SUCCESSACTIVE_PROMOTIONS_RECEIVE或失败派发ACTIVE_PROMOTIONS_REQUEST_FAILURE→ reducer 更新state.activePromotions.{items, requesting, error}→ Selector 供 UI 消费。这套Action 触发 / Data Layer 请求 / Reducer 落库 / Selector 读取的四段式结构也是 wp-calypso 中几乎所有远程数据模块如 client/state/plans、client/state/sites共用的范式掌握 ActivePromotions 即可举一反三。赞分享前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载相关推荐深入解析 wp-calypso 当前用户状态模块Action、Reducer 与 Selector 实战指南深入解析 wp calypso 当前用户状态模块Action、Reducer 与 Selector 实战指南 导读 本文以 wp calypsoWordPr前端CMSwp-calypso 全局状态管理实战指南模块化 Redux Store、keyedReducer 与状态持久化wp calypso 全局状态管理实战指南模块化 Redux Store、keyedReducer 与状态持久化 导读 本文基于 WordPress.com前端CMSwp-calypso 已安装插件状态管理模块Installed Plugins深度解析Actions、Selectors 与 Reducer 全指南wp calypso 已安装插件状态管理模块Installed Plugins深度解析Actions、Selectors 与 Reducer 全指南 wp前端CMS上一篇Emby Premiere完全免费解锁专业媒体服务器的完整高级功能体验指南下一篇用芋道源码(无遮羞布版)商城模块搭建电商系统商品/促销/交易/统计全链路指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考