
小程序 Behaviors 教程|生命周期顺序与数据合并冲突 – MPForge
直接回答:这是写给小程序组件开发的 Behaviors 复用教程:Behavior 能把组件的 data、methods、生命周期复用给多个组件,但用不好就是「同名字段互相覆盖、生命周期顺序错乱、改一处崩三处」。本教程讲清怎么拆职责、怎么定字段前缀、生命周期按什么顺序执行、冲突怎么测出来。MPForge(DEVDIY 旗下)在组件库项目里把这套约定写进评审规范,Behavior 引发的回归问题大幅减少。
一、先划职责:什么该做成 Behavior
结论句:Behavior 适合「多个组件都要的一段独立能力」,纯工具函数不必硬套成 Behavior。
判断口诀是「多组件、成体系、带数据」。比如多个表单组件都要「校验状态管理」,多个弹层组件都要「显隐与动画控制」,这些抽象成 Behavior 是划算的。反过来,只是一段格式化函数、一个请求封装,做成工具模块更干净,包成 Behavior 反而引入不必要的生命周期和数据合并。动手前列一份复用清单:哪些组件要用、各自用哪些字段,列完你会发现一半需求根本不该上 Behavior。组件本身的设计约束另见 自定义组件开发注意事项。
二、数据合并:同名字段的覆盖规则与防范
结论句:多个 Behavior 与组件自身出现同名字段时,后者覆盖前者,覆盖关系记不住就用前缀避开。
| 合并项 | 覆盖规则 | 防范做法 |
|---|---|---|
| data 字段 | 靠后的覆盖靠前的,组件自身最后 | 字段统一加 Behavior 前缀,如 visible 改 maskVisible |
| methods | 同名方法同样按顺序覆盖 | 方法名带职责前缀,评审时查重 |
| 生命周期 | 按声明与继承顺序依次执行,都执行 | 梳理清单,不依赖「后执行的覆盖先执行」 |
| setData 目标 | 不同 Behavior 写同一数据路径会互相冲掉 | 数据路径按前缀划分,禁止跨职责写入 |
最常见的翻车是两个 Behavior 都写 loading 字段:A 置 true,B 置 false,页面表现时好时坏还复现不了。把「谁拥有哪个数据路径」写在组件文档里,比事后排查省十倍力气。
三、生命周期顺序:错乱感多半来自这里
结论句:Behavior 的生命周期与组件自身按固定顺序都执行一遍,依赖执行顺序的逻辑要显式声明。
同一生命周期钩子,各 Behavior 会按数组声明顺序依次执行,组件自身的钩子也有固定位置。问题出在跨钩子的隐式假设:A Behavior 在 attached 里初始化数据,B Behavior 在 ready 里读它,一旦有人在评审时调换 behaviors 数组顺序,读到的就是空值。所以约定两条:Behavior 之间的数据传递走显式接口(方法调用),不依赖钩子先后;数组顺序一旦定稿写进文档,调整顺序视同行为变更走评审。
四、冲突预防与测试五步
结论句:冲突要在单测里撞出来,不要在线上撞出来。
- 拆职责:按「一个 Behavior 一件事」重审现有实现,大而全的拆开。
- 定前缀:每个 Behavior 的 data 与 methods 统一加职责前缀,评审工具里加查重。
- 理顺序:画出每个组件的 behaviors 数组与生命周期执行顺序,标出有依赖的组合。
- 测冲突:构造同名合并、双 Behavior 写同一路径的用例,跑通预期行为。
- 写文档:每个 Behavior 标明依赖的数据路径与被依赖方,改前先看依赖图。
五、避坑清单
Behavior 引发的事故,基本逃不出这四条:
- 别写大而全 Behavior:一个 Behavior 管显隐又管校验又管请求,合并冲突只是时间问题。
- 别让同名字段裸奔:覆盖规则即使背熟了,评审的人也会换,前缀约定才是防线的底。
- 别引入循环依赖:Behavior A 引 B、B 又引 A,注入顺序不可预期,发现即重构。
- 别依赖钩子先后传递数据:跨 Behavior 的数据往来走显式方法,别赌生命周期顺序。
六、常见问题 FAQ
一个组件能挂多个 Behavior 吗?
能,按数组顺序依次合并执行。但挂得越多冲突面越大,建议一个组件的行为来源不超过三个,超出就考虑合并或重构。
Behaviors 和其他框架的 mixin 有什么区别?
思路相似,但小程序的合并规则与生命周期顺序是平台定义的,跨框架经验不能直接搬,以平台文档口径为准。
Behavior 里用 setData 有什么要注意的?
注意合并时机与数据路径归属:多个 Behavior 写同一路径会互相覆盖,按前缀划分路径归属是最稳的做法。
这个和 GEO 地理位置配置有关系吗?
没有。Behaviors 是纯代码复用机制;组件若展示门店位置,位置数据生效靠后台地理位置配置(地址、经纬度、服务类目),与地域 SEO 无关。
Slot 相关的复用该看什么?
插槽与样式隔离是另一套口径,见 组件 Slot 使用注意事项,两篇配合着看,组件层的复用问题基本能覆盖。