n-theme-provider 主题容器
在自己根节点上挂 .n-theme-light / .n-theme-dark 主题类,为包裹的子树装配完整主题变量集。主题状态是全局单例:容器跟随全局主题同步切换(浅→深时容器内外一起翻转),不是独立作用域,同一页面多个容器共用同一状态。页面级主题已由 n-page 根自带(无需本组件);本组件用于非 n-page 页面、自定义弹层与浮层等没有主题类祖先的容器——小程序组件样式隔离下主题类定义不跨组件生效,本组件自带全套类定义,包一层即得。局部换肤(如页面浅色中嵌一块深色区域)走 custom-style 覆盖主题令牌。
内置跟随系统 + 手动切换:useTheme().setMode("light" | "dark" | "system"),选择持久化
平台兼容性
| App | H5 | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | QQ小程序 |
|---|---|---|---|---|---|---|
| √ | √ | √ | × | × | × | × |
API
属性
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
|---|---|---|---|---|
| custom-class | 追加到根节点的类名 | String | "" | - |
| custom-style | 根节点行内样式字符串(可在此覆盖主题 CSS 变量) | String | "" | 与 css 相同 |
插槽
| 插槽名 | 说明 |
|---|---|
| default | 主题作用区域内容 |
实现说明
| 能力 | 常见做法 | 本组件做法与取舍 |
|---|---|---|
| 主题变量分发 | 全局样式文件在 App 入口引一次,主题类挂在页面根 | 全局引一次在小程序组件样式隔离下打不进组件内部节点;本组件根节点绑全局主题类且自带全套类定义(引 styles/theme.scss 一行),任何端、任何宿主配置下子树都拿得到完整变量集 |
| 深浅切换 | 主题类 + 媒体查询跟随系统,App 内不可手动切 | useTheme 全局单例三态(跟随系统/浅/深)驱动类名,容器与页面同源同步翻转,手动切换持久化 |
| 局部深色域 | 包一层容器即变深 | 容器跟随全局主题,不构成独立作用域;局部换肤由 custom-style 覆盖 --n- 中性色令牌实现(组件颜色全部走 var() 令牌,覆盖即生效) |
| 嵌套容器 | 内外层各自装配 | 嵌套容器的根重新声明主题类,把外层 custom-style 覆盖的中性色令牌重置回全局主题值(品牌色等不在主题类中的令牌继续从外层继承);需要内层恢复全局中性色时这样用,需要延续中性色覆盖时不要嵌套 |
| 页面协作 | 页面单独处理主题 | n-page 根自带同款主题类与类定义;页面已用 n-page 时再包容器属重复装配(同值类重复声明,无害但多余),两者不双算 |
组件无自有视觉、无事件、无实例方法:纯容器 + 主题类装配。customClass 的类需定义在组件自己的样式表内(样式隔离下页面类打不进组件根节点),外观微调优先用 customStyle。