ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

wp-calypso Blocks 组件体系:从 UI 原语到可复用的应用级 React 组件

wp-calypso Blocks 组件体系:从 UI 原语到可复用的应用级 React 组件 wp-calypso Blocks 组件体系从 UI 原语到可复用的应用级 React 组件【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso本文档以 client/blocks/README.md 为核心系统讲解 WordPress.comwp-calypso前端架构中Blocks 组件层的定位、组织方式与实战用法。Blocks 是构建在 UI 原语之上的应用级 React 组件封装了评论、关注、点赞、站点、文章卡片等业务语义并直接与 Redux 状态层交互。读完本文你将理解 Blocks 与普通组件、state 模块之间的关系掌握容器 展示组件的编写模式并能在自己的 section 中正确引用这些可复用组件。一、Blocks 是什么介于 UI 原语与应用状态之间的组件层在 wp-calypso 的分层架构中组件被划分为不同抽象层级UI 原语UI primitives如 packages/components 中的Button、Card、Popover等只负责基础视觉与交互不具备业务语义。Blocks由 UI 原语组合而成用于生成更复杂的实体more complex entities位于 client/blocks 目录。Sectionsclient/reader、client/my-sites、client/me等具体功能页面负责组合 Blocks 与业务逻辑。根据 README 的定义Blocks 具有三个关键特征连接状态connected to state大多数 Blocks 直接订阅全局 Redux store或通过数据层 hooks如useIsSubscribed获取数据。能分发 actiondispatch actions用户在块上的交互会触发全局状态变更例如关注/取关一个站点、点赞一篇文章。携带应用语义application semantics它们直接表达站点Site文章卡片PostCard评论Comments这类领域概念而非泛化的按钮或卡片。正因功能被完整封装在块内部Blocks 可以在不同 section 之间轻松复用避免每个页面重复实现同一套状态逻辑与 UI。二、目录结构按业务领域组织的 80 个块client/blocks下每个子目录即一个独立块目录名即块名。从当前仓库的目录清单可以看到其覆盖面之广大致可分为以下几类分类代表块说明阅读器互动follow-button、like-button、comment-button、post-likes订阅、点赞、评论等社交动作阅读器展示reader-post-card、reader-full-post、reader-related-card、reader-featured-image信息流中的文章卡片与详情展示站点与用户site、user-avatar、user-mentions、visit-site站点入口、头像、提及等内容创作image-editor、author-selector、signup-form、upload-drop-zone图片编辑、作者选择、注册表单营销与引导jetpack-benefits、upsell-nudge、product-purchase-features-list增值服务与升级引导数据与图表stats-navigation、stats-sparkline、plan-storage统计导航、迷你趋势图、套餐用量通用功能get-apps、login、qr-code-login、inline-help跨 section 的通用能力每个块目录的标准结构通常包含index.jsx/index.tsx对外入口一般是容器、button.jsx或docs/展示组件或文档、style.scss样式、test/单元测试部分块还附带自己的README.md如 comment-button/README.md、follow-button/README.md。三、核心模式容器Container 展示组件Button分离从源码结构看绝大多数互动型 Block 采用经典的容器 展示组件双层结构容器负责状态与副作用展示组件只负责渲染与回调。README 中提到的连接状态、分发 action由容器完成而纯展示部分被剥离出来便于在 Storybook 中独立预览。以 follow-button 为例目录中的index.tsx导出FollowButtonContainerbutton.jsx导出纯展示的FollowButton容器client/blocks/follow-button/index.tsx通过useSelector读取登录态与订阅状态通过useFollowSite/useUnfollowSite触发变更并处理未登录跳转登录“邮箱未验证提示”等业务分支展示组件client/blocks/follow-button/button.jsx只根据following、disabled、iconSize等 props 渲染订阅/已订阅图标与文案并回调onFollowToggle。同样like-button 的 README 明确写道它有两部分实际的按钮和与 LikeStore 一起工作的容器。多数场景下使用容器是最简单的路径。3.1 使用容器推荐容器把状态、接口调用、登录拦截等全部封装好使用方只需提供业务标识import FollowButtonContainer from calypso/blocks/follow-button; function render() { return ( div classNameyour-stuff FollowButtonContainer siteUrlhttp://trailnose.com / /div ); }import LikeButtonContainer from calypso/blocks/like-button; function render() { return ( div classNameyour-stuff LikeButtonContainer siteId{ 66775168 } postId{ 643 } / /div ); }import CommentButton from calypso/blocks/comment-button; function render() { return CommentButton commentCount{ 123 } /; }注意CommentButton相对简单纯展示 可选计数因此没有拆出双层结构直接从入口导出。3.2 直接使用展示组件高级用法当需要完全掌控渲染、或接入自定义状态时可以绕过容器直接使用展示组件import FollowButton from calypso/blocks/follow-button/button; function render() { return ( div classNameyour-stuff FollowButton following{ false } / /div ); }import LikeButton from calypso/blocks/like-button/button; function render() { return ( div classNameyour-stuff LikeButton likeCount{ 5 } showCount liked{ false } onLikeToggle{ this.handleLikeToggle } / /div ); } function handleLikeToggle( newState ) { // 自行保存新状态 }四、常用 Blocks 的 Props 速查4.1 Follow Button关注/订阅按钮容器 Propsfollow-button/README.mdsiteUrlstring要关注或取关的站点 URL唯一必需参数。展示组件 Propsclient/blocks/follow-button/button.jsxfollowing默认falseboolean当前用户是否已关注该站点disabled默认falseboolean按钮是否禁用hasButtonStyle默认falseboolean是否使用带按钮外形/边框的样式iconSize默认20number图标尺寸tagName默认button渲染使用的 HTML 标签followLabel/followingLabelstring自定义关注/已关注文案onFollowToggle回调函数参数为切换后的新状态followIcon/followingIcon自定义图标元素isButtonOnly默认falseboolean是否只渲染图标不渲染文字标签。4.2 Like Button点赞按钮展示组件 Propslike-button/README.mdlikeCountnumber点赞数量showZeroCount默认falseboolean点赞数为 0 时也显示数字liked默认falseboolean当前用户是否已点赞tagName默认listring容器标签用于列表项场景onLikeToggle回调以切换后的新状态为参数被调用isMiniboolean是否使用小尺寸版本用于评论点赞场景。4.3 Comment Button评论按钮Propscomment-button/README.md 与 comment-button/index.jsxcommentCountnumber显示在按钮旁的数字hrefstring当tagName为a时的跳转地址默认nullonClickFunction点击回调size默认24number评论图标尺寸tagName默认listring渲染所用 HTML 标签targetstring配合tagNamea使用的target属性默认nullicon自定义图标缺省使用Gridicon的 comment 图标defaultLabelstring当commentCount为 0 时显示的兜底文案alwaysShowTooltip默认falseboolean是否总是显示 tooltip。五、状态连接原理Block 如何与全局 store 协作Blocks 的连接状态能力来自 wp-calypso 全局 Redux store。从 follow-button/index.tsx 的容器实现可以清晰地看到状态接入的三条路径读取状态useSelector( isUserLoggedIn )、useSelector( isCurrentUserEmailVerified )与useIsSubscribed( { feedUrl: siteUrl, feedId, blogId } )分别从client/state/current-user与client/reader/data/site-subscriptions获取登录态与订阅态分发 actionuseFollowSite()/useUnfollowSite()是数据层封装的 mutation hooks内部会向服务端发起请求并更新 storeuseDispatch()配合registerLastActionRequiresLogin记录未登录用户的后续动作来自 client/state/reader-ui/actions业务分支未登录时记录动作并跳转登录邮箱未验证时通过errorNotice抛出带重新发送邮件按钮的错误通知。这正好印证了 README 对 Blocks 的定位generally connected to state, and have the ability to dispatch actions。展示组件如 button.jsx则保持纯净仅通过onFollowToggle( ! this.props.following )把意图上抛给容器处理。从 reader 模块的引用统计client/reader下 30 处calypso/blocks/...导入可以推断阅读器是 Blocks 最大的消费方之一块在 feed 流、文章详情、订阅管理、shelves 等页面中被大量复用。六、测试保障Block 的可验证性Blocks 将状态逻辑集中到容器后展示组件可以脱离全局 store 进行纯单元测试容器则通过 mock store 验证状态联动。仓库中每个互动型块都自带test/目录例如client/blocks/follow-button/test覆盖关注/取关交互与渲染状态client/blocks/like-button/test/index.test.jsx验证点赞容器与按钮的行为client/blocks/comment-button/test验证评论计数的显示逻辑消费方侧也有集成测试如 client/reader/like-button/test/index.test.jsx 验证 Block 在 reader 中的实际表现。七、在 Storybook 中预览与调试README 提到许多这些组件可以在我们的 Storybook 中看到实际效果。Storybook 是开发与设计协作的核心工具每个块通常提供docs/example.jsx如 comment-button/docs/example.jsx作为演示案例开发者可以在 Storybook 中独立调整 props 预览不同状态如关注/已关注、点赞/未点赞、评论数为 0 等。在 wp-calypso 仓库中可以通过yarn storybook启动本地 Storybook 实例来浏览这些块。八、实践指南编写你自己的 Block若要在 wp-calypso 中新增一个 Block结合本仓库约定与 README 原则推荐按以下步骤组织新建目录在client/blocks/block-name/下创建代码目录名使用连字符小写命名拆分双层结构index.tsx或index.jsx导出容器——用useSelector读状态、用 hooks/actions 分发 action、处理登录与权限分支将纯 UI 拆到button.jsx或独立展示组件中仅依赖 props 渲染补齐文件添加style.scss样式、docs/example.jsx供 Storybook 展示、README.md记录 Props可参考 follow-button/README.md 的写法、test/目录编写单元测试在 section 中复用通过calypso/blocks/block-name别名路径导入仓库内统一使用calypso/前缀导入而非相对路径便于跨目录引用。九、小结Blocks 是 wp-calypso 组件体系中的中间层向下组合 UI 原语向上服务业务 section横向通过 Redux 与数据层 hooks 统一处理状态与副作用。遵循容器 展示组件模式、按业务领域组织目录、配套 README 与测试使得SitePostCardComments这类应用级实体能够在阅读器、我的站点、个人中心等不同页面中即插即用。理解并善用 Blocks是高效开发 wp-calypso 前端功能的关键一步。【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表