【Nova UI】六、SASS 赋能组件库:通用方法与混入的变革力量

序言

在搭建组件库时,我们已用 SASS 实现 BEM 规范,为样式管理筑牢根基🏗️。但 SASS 远不止于此,其丰富通用方法和灵活变量机制,将为组件库样式雕琢带来质的飞跃。

我们的组件库追求高效、易用与风格统一🧩。深挖 SASS 这部分特性,能大幅优化开发流程,提升样式复用与维护性。以后添加新组件、修改样式或适配不同场景,都能轻松实现🤗。

SASS 的通用方法和变量如何为组件库赋能?又会带来哪些提升?接下来,让我们开启探索之旅🚀,见证 SASS 绽放光芒。

通用方法

我们于packages/cheme-chalk/src/mixins目录下创建function.scss文件,这里将汇聚一系列实用的 SASS 函数,为样式管理带来全新的解决方案🎁。

scss 复制代码
@use 'config';

@function createVariableName($list) {
  $name: -- + config.$namespace;
  @each $item in $list {
    @if $item != '' {
      $name: $name + '-' + $item;
    }
  }
  @return $name;
}

@function getVariableName($args...) {
  @return createVariableName($args);
}

@function getVariableValue($args...) {
  @return var(createVariableName($args));
}

createVariableName 函数接收列表$list,以--$namespace常量拼接起始,遍历列表将非空元素逐一连接,生成独特变量名。如$list('button','success')$namespacen,会返回--n-button-success

getVariableName 封装createVariableName,利用可变参数,让传参更简洁。调用getVariableName('button', 'warning'),效果等同于createVariableName(('button', 'warning'))

getVariableValue 先依参数生成变量名,再用var函数获取对应值。若已定义--n-button-danger-color: red,调用getVariableValue('button', 'danger', 'color') 就能返回red

这些函数强化了组件库变量管理,提升代码可维护与复用性,为样式开发添力💪。

通用变量混入

我们于packages/cheme-chalk/src/mixins目录下创建variable-mixins.scss文件,高效且灵活地管理变量是提升开发效率与维护性的关键🔑。以下一系列精心设计的 SASS 通用变量混入,为我们在这方面提供了强大的支持。

scss 复制代码
@use 'sass:map';
@use 'function' as *;

@mixin set-variable($name, $value) {
  #{getVariableName($name)}: #{$value};
}

@mixin set-variable-from-map($name, $key, $variableMap) {
  #{getVariableName($name, $key)}: #{map.get($variableMap, $key)};
}

@mixin set-variable-from-map($name, $key, $variableMap) {
  #{getVariableName($name, $key)}: #{map.get($variableMap, $key)};
}
@mixin set-variable-from-keys($name, $keys, $variableMap) {
  @each $key in $keys {
    @include set-variable-from-map($name, $key, $variableMap)
  }
}

@mixin set-base-variable-from-map($name, $key, $variableMap) {
  #{getVariableName($name, $key)}: #{map.get($variableMap, $key, 'base')};
}
@mixin set-base-variable-from-keys($name, $keys, $variableMap) {
  @each $key in $keys {
    @include set-base-variable-from-map($name, $key, $variableMap)
  }
}

@mixin set-variable-from-global($name, $globalName) {
  $variableName: getVariableName($name);
  $globalVariableName: getVariableName($globalName);
  #{$variableName}: var(#{$globalVariableName});
}

set-variable混入

  • 作用:允许直接设置一个变量,其变量名由getVariableName函数根据传入的$name参数生成,值为传入的$value
    • 示例:如果调用@include set-variable(('button', 'color'), red),并且getVariableName函数生成的变量名是--n-button-color,那么最终会生成--n-button-color: red;的 CSS 自定义属性🏷️。

set-variable-from-map混入

  • 作用:从一个映射($variableMap)中,根据传入的$key获取对应的值,并将其设置为变量。变量名同样由getVariableName函数根据$name$key生成。
    • 示例:假设有一个映射$button-colors: (primary: blue, secondary: green);,调用@include set-variable-from-map(('button', 'colors'), 'primary', $button-colors),会生成--n-button-colors-primary: blue;

set-variable-from-keys混入

  • 作用:通过遍历$keys列表,批量从$variableMap映射中取值并设置变量。对于每个$key,都会调用set-variable-from-map混入。
    • 示例:如果有$button-sizes: (small: 12px, medium: 16px, large: 20px);,调用@include set-variable-from-keys(('button','sizes'), ('small', 'large'), $button-sizes),会依次生成--n- button-sizes-small: 12px;--n-button-sizes-large: 20px;

set-base-variable-from-map混入

  • 作用:从映射中获取带有特定'base'标识的值,并设置为变量。变量名由getVariableName函数根据$name$key生成。
    • 示例:假设$button-styles: (border: {base: 1px solid black});,调用@include set-base-variable-from-map(('button','styles'), 'border', $button-styles),会生成--n-button-styles-border: 1px solid black;

set-base-variable-from-keys混入

  • 作用:遍历$keys列表,批量从映射中获取带有'base'标识的值并设置变量。对每个$key,都会调用set-base-variable-from-map混入。
    • 示例:若$button-states: (hover: {base: background-color: yellow}, active: {base: color: white});,调用@include set-base-variable-from-keys(('button','states'), ('hover', 'active'), $button-states),会生成--n-button-states-hover: background-color: yellow;--n-button-states-active: color: white;

set-variable-from-global混入

  • 作用:从全局变量中获取值并设置为当前变量。变量名分别由getVariableName函数根据$name$globalName生成。
    • 示例:如果全局变量--n-global-color: purple已经定义,调用@include set-variable-from-global(('button', 'text - color'), ('global', 'color')),会生成--n-button-text-color: var(--n -global-color);,即--n-button-text-color: purple;

这些通用变量混入极大地增强了组件库样式中变量设置的灵活性和可维护性,使得我们在处理复杂的样式变量时能够更加高效和便捷🔫。

🦀🦀感谢看官看到这里,如果觉得文章不错的话🙌,点个关注不迷路⭐。

诚邀您加入我的微信技术交流群🎉,群里都是志同道合的开发者👨‍💻,大家能一起交流分享摸鱼🐟。期待与您在群里相见🚀,咱们携手在开发路上共同进步✨ ! 👉点我
感谢各位大侠一路相伴,实在感激! 不瞒您说,在下还有几个开源项目 📦,它们就像精心培育的幼苗 🌱,急需您的浇灌。要是您瞧着还不错,麻烦动动手指,给它们点亮几颗 Star ⭐,您的支持就是它们成长的最大动力,在此谢过各位大侠啦!

相关推荐
纪元A梦3 分钟前
华为OD机试真题——天然蓄水库(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·c语言·javascript·c++·python·华为od·go
LaughingZhu16 分钟前
PH热榜 | 2025-04-09
前端·数据库·人工智能·mysql·开源
枫super29 分钟前
Day-03 前端 Web-Vue & Axios 基础
前端·javascript·vue.js
计算机学姐1 小时前
基于SSM的校园美食交流系统
java·vue.js·mysql·spring·tomcat·mybatis·美食
程序猿chen1 小时前
Vue.js组件安全工程化演进:从防御体系构建到安全性能融合
前端·vue.js·安全·面试·前端框架·跳槽·安全架构
你也来冲浪吗1 小时前
MD编辑器用法讲解
前端
小小小小宇1 小时前
十万字总结所有React hooks(含简单原理)
前端
huige99991 小时前
Vue 与 ORM 的对比理解:抽象的力量
vue.js·orm
MariaH1 小时前
MySQL数据库DQL
前端
Enjoy10241 小时前
v8垃圾回收机制
前端